• Hello Team,

    I have created a plugin to extend the woocomerce class and make payment. Kindly advise how should I call an existing wordpress page and in which location will be the wordpress page? where should I place the phpseclib directory?

    //code to generate signature
    			$payload=json_encode($payload);
    			$rsa= new \wamp642\www\transportation\wordpress\wp-content\phpseclib\phpseclib\Crypt\RSA();
    			$rsa->setHash('sha1');
    			$rsa->setMGFHash('sha1');
    			$rsa->setEncryptionMode(RSA::ENCRYPTION_OAEP);
    			$rsa->setPublicKeyFormat(RSA::PUBLIC_FORMAT_PKCS1);
    			$rsa->loadKey($publickey);
    			$encryptedPayload=base64_encode($rsa->encrypt($payload));
    			$signaturedata="appID&merTradeNo=$merTradeNo$merTradeNo&payload=$encryptedPayload&paymentType=$paymentType";
    			$sign=base64_encode(hash_hmac('sha512',$signaturedata,$apiKey,true));
    			
    			
    			//initiate payment
    			$response = $moovpay->purchase($appID,$merTradeNo,$encryptedPayload,$paymentType,$sign);
    			$fh = fopen(plugin_dir_path(__FILE__).'redirect.php', 'w+');
    			fwrite($fh, $response);
    			fclose($fh);
    		<strong>	$redirect_url = plugin_dir_url(__FILE__).'redirect.php';</strong>
      
    			return array(
    			'result' => 'success',
    			'redirect' => $redirect_url
    			);

    Thanks,

    Roshan

    • This topic was modified 2 years, 4 months ago by Jan Dembowski.
Viewing 3 replies - 1 through 3 (of 3 total)
  • The code should go in the class file for your custom payment method, shoudln’t it? I mean… if you’ve extended this and created a new class, you’ll have the file set up and working, don’t you? If you can’t figure it out then you’ll need to shwo us the code for the payment class that you’ve got so we can see how it actually works.

    Jsut as a note, there’s no page to add the code that you’ve pasted above to. It needs to be done through the WooCommerce system, and that’s custom coding, not pages.

    Thread Starter roshanbi

    (@roshanbi)

    Thanks for the update. Please find below plugin code. Kindly advise what change needs to be amended.

    <?php
    
    defined( 'ABSPATH' ) or exit;
    
    // Make sure WooCommerce is active
    if ( ! in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
    	return;
    }
    
    function wc_offline_add_to_gateways( $gateways ) {
    	$gateways[] = 'WC_Gateway_Offline';
    	return $gateways;
    }
    add_filter( 'woocommerce_payment_gateways', 'wc_offline_add_to_gateways' );
    
    /**
     * Adds plugin page links
     * 
     * @since 1.0.0
     * @param array $links all plugin links
     * @return array $links all plugin links + our custom links (i.e., "Settings")
     */
    function wc_offline_gateway_plugin_links( $links ) {
    
    	$plugin_links = array(
    		'<a href="' . admin_url( 'admin.php?page=wc-settings&tab=checkout&section=offline_gateway' ) . '">' . __( 'Configure', 'wc-gateway-offline' ) . '</a>'
    	);
    
    	return array_merge( $plugin_links, $links );
    }
    add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), 'wc_offline_gateway_plugin_links' );
    
    /**
     * Offline Payment Gateway
     *
     * Provides an Offline Payment Gateway; mainly for testing purposes.
     * We load it later to ensure WC is loaded first since we're extending it.
     *
     * @class 		WC_Gateway_Offline
     * @extends		WC_Payment_Gateway
     * @version		1.0.0
     * @package		WooCommerce/Classes/Payment
     * @author 		Roshan
     */
    add_action( 'plugins_loaded', 'wc_offline_gateway_init', 11 );
    
    function wc_offline_gateway_init() {
    
    	class WC_Gateway_Offline extends WC_Payment_Gateway {
    
    		/**
    		 * Constructor for the gateway.
    		 */
    		public function __construct() {
    	  
    			$this->id                 = 'offline_gateway';
    			$this->icon               = apply_filters('woocommerce_offline_icon', '');
    			$this->has_fields         = false;
    			$this->method_title       = __( 'Offline', 'wc-gateway-offline' );
    			$this->method_description = __( 'Allows offline payments. Very handy if you use your cheque gateway for another payment method, and can help with testing. Orders are marked as "on-hold" when received.', 'wc-gateway-offline' );
    		  
    			// Load the settings.
    			$this->init_form_fields();
    			$this->init_settings();
    		  
    			// Define user set variables
    			$this->title        = $this->get_option( 'title' );
    			$this->description  = $this->get_option( 'description' );
    			$this->instructions = $this->get_option( 'instructions', $this->description );
    		  
    			// Actions
    			add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );
    			add_action( 'woocommerce_thankyou_' . $this->id, array( $this, 'thankyou_page' ) );
    		  
    			// Customer Emails
    			add_action( 'woocommerce_email_before_order_table', array( $this, 'email_instructions' ), 10, 3 );
    		}
    	
    	
    		/**
    		 * Initialize Gateway Settings Form Fields
    		 */
    		public function init_form_fields() {
    	  
    			$this->form_fields = apply_filters( 'wc_offline_form_fields', array(
    		  
    				'enabled' => array(
    					'title'   => __( 'Enable/Disable', 'wc-gateway-offline' ),
    					'type'    => 'checkbox',
    					'label'   => __( 'Enable Offline Payment', 'wc-gateway-offline' ),
    					'default' => 'yes'
    				),
    				
    				'title' => array(
    					'title'       => __( 'Title', 'wc-gateway-offline' ),
    					'type'        => 'text',
    					'description' => __( 'This controls the title for the payment method the customer sees during checkout.', 'wc-gateway-offline' ),
    					'default'     => __( 'Myt Money', 'wc-gateway-offline' ),
    					'desc_tip'    => true,
    				),
    				
    				'description' => array(
    					'title'       => __( 'Description', 'wc-gateway-offline' ),
    					'type'        => 'textarea',
    					'description' => __( 'Payment method description that the customer will see on your checkout.', 'wc-gateway-offline' ),
    					'default'     => __( 'Please remit payment to Store Name upon pickup or delivery.', 'wc-gateway-offline' ),
    					'desc_tip'    => true,
    				),
    				
    				'instructions' => array(
    					'title'       => __( 'Instructions', 'wc-gateway-offline' ),
    					'type'        => 'textarea',
    					'description' => __( 'Instructions that will be added to the thank you page and emails.', 'wc-gateway-offline' ),
    					'default'     => '',
    					'desc_tip'    => true,
    				),
    			) );
    		}
    	
    	
    		/**
    		 * Output for the order received page.
    		 */
    		public function thankyou_page() {
    			if ( $this->instructions ) {
    				echo wpautop( wptexturize( $this->instructions ) );
    			}
    		}
    	
    	
    		/**
    		 * Add content to the WC emails.
    		 *
    		 * @access public
    		 * @param WC_Order $order
    		 * @param bool $sent_to_admin
    		 * @param bool $plain_text
    		 */
    		public function email_instructions( $order, $sent_to_admin, $plain_text = false ) {
    		
    			if ( $this->instructions && ! $sent_to_admin && $this->id === $order->payment_method && $order->has_status( 'on-hold' ) ) {
    				echo wpautop( wptexturize( $this->instructions ) ) . PHP_EOL;
    			}
    		}
    	
    	
    		/**
    		 * Process the payment and return the result
    		 *
    		 * @param int $order_id
    		 * @return array
    		 */
    		public function process_payment( $order_id ) {
    	
    			$order = wc_get_order( $order_id );
    			
    			//test merTradeNo added on 1 July 2022 @roshanbi
    			$merTradeNo->billing_first_name ." ".$merTradeNo->billing_last_name .", ".$merTradeNo->billing_address_1.$merTradeNo->billing_address_2 . ", " .$merTradeNo->billing_postcode." ". $merTradeNo->billing_city. ", ". $merTradeNo->billing_state;
    			
    			// Mark as on-hold (we're awaiting the payment)
    			$order->update_status( 'on-hold', __( 'Awaiting offline payment', 'wc-gateway-offline' ) );
    			
    			// Reduce stock levels
    			$order->reduce_order_stock();
    			
    			// Remove cart
    			WC()->cart->empty_cart();
    			
    			// Return thankyou redirect
    			return array(
    				'result' 	=> 'success',
    				'redirect'	=> $this->get_return_url( $order )
    			);
    			
    			//total amount added on 1 July 2022 1:52 pm
    			      $totalAmount = $order->get_total();
    			
    			//RSA and payload details added on 1 July 2022
    			/*$totalAmount="0.01" */
    			$appID="1000000661";
    			/*$merTradeNo=""; */
    			$paymentType="S";
    			$publicKey="MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkdWER3RVjey3ZXeggAUFm5UI/+e1zJLQ==";
    			$apiKey="BH+0F1KvOoZlA==";
    
    			$payload=array(
    			"totalPrice"=>$totalAmount,
    			"currency"=>$merTradeNo,
    			"notifyURL"=>"https://www.myt.mu",
    			"returnURL"=>"https://www.myt.mu",
    			"remark"=>"This is a test payment",
    			lang=>"en"
    			);
    
    			//code to generate signature
    			$payload=json_encode($payload);
    			$rsa= new \wamp642\www\transportation\wordpress\wp-content\phpseclib\phpseclib\Crypt\RSA();
    			$rsa->setHash('sha1');
    			$rsa->setMGFHash('sha1');
    			$rsa->setEncryptionMode(RSA::ENCRYPTION_OAEP);
    			$rsa->setPublicKeyFormat(RSA::PUBLIC_FORMAT_PKCS1);
    			$rsa->loadKey($publickey);
    			$encryptedPayload=base64_encode($rsa->encrypt($payload));
    			$signaturedata="appID&merTradeNo=$merTradeNo$merTradeNo&payload=$encryptedPayload&paymentType=$paymentType";
    			$sign=base64_encode(hash_hmac('sha512',$signaturedata,$apiKey,true));
    			
    			
    			//initiate payment
    			$response = $moovpay->purchase($appID,$merTradeNo,$encryptedPayload,$paymentType,$sign);
    			$fh = fopen(plugin_dir_path(__FILE__).'redirect.php', 'w+');
    			fwrite($fh, $response);
    			fclose($fh);
    			$redirect_url = plugin_dir_url(__FILE__).'redirect.php';
      
    			return array(
    			'result' => 'success',
    			'redirect' => $redirect_url
    			);
    		}
    		
    		//function below calculates total and sets in a variable. Added on 1 July 2022 @roshanbi
    		protected function calculate_totals() {
        $this->set_total( 'total', round( $this->get_total( 'items_total', true ) + $this->get_total( 'fees_total', true ) + $this->get_total( 'shipping_total', true ) + wc_round_tax_total( array_sum( $this->get_merged_taxes( true ) ), 0 ), 0 ) );
        $this->cart->set_total_tax( array_sum( $this->get_merged_taxes( false ) ) );
     
        // Allow plugins to hook and alter totals before final total is calculated.
        if ( has_action( 'woocommerce_calculate_totals' ) ) {
            do_action( 'woocommerce_calculate_totals', $this->cart );
        }
     
        // Allow plugins to filter the grand total, and sum the cart totals in case of modifications.
        $this->cart->set_total( max( 0, apply_filters( 'woocommerce_calculated_total', $this->get_total( 'total' ), $this->cart ) ) );
    }
    
    public function webhook() {
          header( 'HTTP/1.1 200 OK' );
          $order_id = isset($_REQUEST['order_id']) ? $_REQUEST['order_id'] : null;
          $nonce = isset($_REQUEST['nonce']) ? $_REQUEST['nonce'] : null;
          if (is_null($order_id)) return;
          if (is_null($nonce)) return;
          if (wc_get_order_item_meta($order_id,'ipn_nonce')!=$nonce) return;
          $order = wc_get_order( $order_id );
          $order->payment_complete();
          wc_reduce_stock_levels($order_id);
        }
    	
      } // end \WC_Gateway_Offline class
    }

    Thanks,

    Roshan

    Thread Starter roshanbi

    (@roshanbi)

    Redirect.php entry:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="https://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    </head>
    <body>
            
        <form id="redirectForm" action="https://gateway.mytmoney.mu/web/payments" method="post">
    		<input type="hidden" name="appId" value="<?php echo $_GET[ 'appID' ]; ?>"/>
    		<input type="hidden" name="merTradeNo" value="<?php echo $_GET[ 'merTradeNo' ]; ?>"/>
    		<input type="hidden" name="payload" value="<?php echo $_GET[ 'encryptedPayload' ]; ?>"/> 
    		<input type="hidden" name="paymentType" value="<?php echo $_GET[ 'paymentType' ]; ?>"/>
    		<input type="hidden" name="sign" value="<?php echo $_GET[ 'sign' ]; ?>"/>
    		<p><input type="submit" value="Pay By my.t money"/></p>
    		</form>
    
    <form action="https://transaportation.local/my-account" method="post">
    		<input type="hidden" name="merTradeNo" value=MT001/>
    		<input type="hidden" name="TradeNo" value="123456"/>
    		<input type="hidden" name="tradeStatus" value="S"/>
    		<input type="hidden" name="msg" value="SUCCESS"/>
    		<input type="hidden" name="resultcode" value="000"/>
    		<input type="hidden" name="sign" value=""/>
    		</form>
    <script type="text/javascript">
        document.all.redirectForm.submit();
    </script>   
    </body>
    </html>
Viewing 3 replies - 1 through 3 (of 3 total)
  • The topic ‘redirect page location’ is closed to new replies.