redirect page location
-
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.
-
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.
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§ion=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
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>
- The topic ‘redirect page location’ is closed to new replies.