Woocommerce Custom Payment Gateway Not Redirecting



.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;








0















I have a WC payment gateway which was build and working until WP version 4.1. Today I started testing it on WP 4.9.8 and WC 3.5.1.



When I try to complete purchase the payment gateway is not taking me to the payment screen to fill credit card details. It get stuck on redirection state.



Hope someone can help me out to solve this.



Below the image reference and the code I am using:



<?php

/**
* Plugin Name: CustomPaymentGateway
*/
add_action('plugins_loaded', 'init_mpay', 0);

function init_mpay()

if ( ! class_exists( 'WC_Payment_Gateway' ) ) return;

class woocommerce_mpay extends WC_Payment_Gateway

public function __construct()
global $woocommerce;

$this->id = 'mpay';
$this->method_title = __('MPay', 'mpay-chearaan-woo');
$this->icon = plugins_url( 'mpay.png', __FILE__ );
$this->has_fields = false;
$this->notify_url = str_replace( 'https:', 'http:', add_query_arg( 'wc-api', 'woocommerce_mpay', home_url( '/' ) ) );

// Load the form fields.
$this->init_form_fields();

// Load the settings.
$this->init_settings();

// Define user set variables
$this->mpayurl = $this->settings['mpayurl'];
$this->title = $this->settings['title'];
$this->description = $this->settings['description'];
$this->merchantid = $this->settings['merchantid'];
$this->hashKey = $this->settings['hashKey'];
$this->transactionDate = date('Y-m-d H:i:s O');
$this->woo_version = $this->get_woo_version();

// Actions
add_action('init', array(&$this, 'successful_request'));
add_action('woocommerce_api_woocommerce_mpay', array( &$this, 'successful_request' ));
add_action('woocommerce_receipt_mpay', array(&$this, 'receipt_page'));
if ( version_compare( WOOCOMMERCE_VERSION, '2.0.0', '>=' ) )
add_action('woocommerce_update_options_payment_gateways_' . $this->id, array( &$this, 'process_admin_options' ));
else
add_action('woocommerce_update_options_payment_gateways', array( &$this, 'process_admin_options' ));



/**
* Initialise Gateway Settings Form Fields
*/
function init_form_fields()

$this->form_fields = array(
'enabled' => array(
'title' => __( 'Enable/Disable:', 'mpay-chearaan-woo' ),
'type' => 'checkbox',
'label' => __( 'Enable MPay', 'mpay-chearaan-woo' ),
'default' => 'yes'
),
'mpayurl' => array(
'title' => __( 'UAT/Production:', 'mpay-chearaan-woo' ),
'type' => 'checkbox',
'label' => __( 'UAT', 'mpay-chearaan-woo' ),
'default' => 'yes'
),
'title' => array(
'title' => __( 'Title:', 'mpay-chearaan-woo' ),
'type' => 'text',
'description' => __( 'The title which the user sees during checkout.', 'mpay-chearaan-woo' ),
'default' => __( 'MPay Online Payment Gateway', 'mpay-chearaan-woo' )
),
'description' => array(
'title' => __( 'Description:', 'mpay-chearaan-woo' ),
'type' => 'textarea',
'description' => __( 'Description which the user sees during checkout.', 'mpay-chearaan-woo' ),
'default' => __('Pay securely through MPay's Secure Servers.', 'mpay-chearaan-woo')
),
'merchantid' => array(
'title' => __( 'Merchant ID:', 'mpay-chearaan-woo' ),
'type' => 'text',
'description' => __( 'Please enter your Merchant ID as provided by MPay.', 'mpay-chearaan-woo' ),
'default' => ''
),
'hashKey' => array(
'title' => __( 'Merchant hashKey:', 'mpay-chearaan-woo' ),
'type' => 'text',
'description' => __( 'Please enter your Merchant hashKey as provided by MPay.', 'mpay-chearaan-woo' ),
'default' => ''
)
);




public function admin_options()
?>
<h3>MPay</h3>
<p><?php _e('MPay works by sending the user to MPay to enter their payment information.', 'mpay-chearaan-woo'); ?></p>

<table class="form-table">
<?php
// Generate the HTML For the settings form.
$this->generate_settings_html();
?>
</table><!--/.form-table-->
<?php
// End admin_options()

/**
* There are no payment fields, but we want to show the description if set.
**/
function payment_fields()
if ($this->description) echo wpautop(wptexturize($this->description));


/**
* Generate the button link
**/
public function generate_mpay_form( $order_id )
global $woocommerce;


$order = new WC_Order( $order_id );

if ($this->mpayurl == "yes")
$mpay_adr = "https://pcimdex.mpay.my/mdex2/payment/eCommerce";
else
$mpay_adr = "https://www.mdex.my/mdex/payment/eCommerce";



$sHash = strtoupper(hash('sha256', $this->hashKey."Continue".str_pad($this->merchantid, 10, '0', STR_PAD_LEFT).str_pad($order->id, 20, '0', STR_PAD_LEFT).str_pad(($order->order_total*100), 12, '0', STR_PAD_LEFT)));
$mpay_args = array(
'secureHash' => $sHash,
'mid' => str_pad($this->merchantid, 10, '0', STR_PAD_LEFT),
'invno' => str_pad($order->id, 20, '0', STR_PAD_LEFT),
'amt' => str_pad(($order->order_total*100), 12, '0', STR_PAD_LEFT),
'desc' => str_pad("Order No ".$order_id, 255, ' ', STR_PAD_RIGHT),
'postURL' => $this->notify_url,
'phone' => $order->billing_phone,
'email' => $order->billing_email,
'param' => 'WC

/**
* Process the payment and return the result
**/
function process_payment( $order_id )

$order = new WC_Order( $order_id );

if($this->woo_version >= 2.1)
$redirect = $order->get_checkout_payment_url( true );
else if( $this->woo_version < 2.1 )
$redirect = add_query_arg('order', $order->id, add_query_arg('key', $order->order_key, get_permalink(get_option('woocommerce_pay_page_id'))));
else
$redirect = add_query_arg('order', $order->id, add_query_arg('key', $order->order_key, get_permalink(get_option('woocommerce_pay_page_id'))));


return array(
'result' => 'success',
'redirect' => $redirect
);



/**
* receipt_page
**/
function receipt_page( $order )

echo '<p>'.__('Please click the button below to pay with MPay.', 'mpay-chearaan-woo').'</p>';

echo $this->generate_mpay_form( $order );



/**
* Server callback was valid, process callback (update order as passed/failed etc).
**/
function successful_request($mpay_response)
global $woocommerce;


if (isset($_GET['wc-api']) && $_GET['wc-api'] == 'woocommerce_mpay')
/** need to trim from result **/
$Url_result = $_GET['result'];
$order = new WC_Order( (int) substr($Url_result,7,20) );
$tranID = (int)substr($Url_result,1,6);

if (substr($Url_result,0,1) == '0')
$r_status = 0;
else
$r_status = 33;


/*
$order = new WC_Order( (int) $_POST['invno'] );
$r_status = (int) $_POST['result'];

*/

if ($r_status == '0' )

$order->payment_complete();

$order->add_order_note('MPay Payment was SUCCESSFUL '.'<br>AuthCode is ' . $tranID);

wp_redirect( $this->get_return_url($order) ); exit;
//wp_redirect( $this->order->get_checkout_order_received_url() ); exit;

else

$order->update_status('failed', sprintf(__('MPay Payment Failed. Error Communicating with Bank.', 'mpay-chearaan-woo') ) );

wp_redirect($order->get_cancel_order_url()); exit;





function get_woo_version()

// If get_plugins() isn't available, require it
if ( ! function_exists( 'get_plugins' ) )
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );

// Create the plugins folder and file variables
$plugin_folder = get_plugins( '/woocommerce' );
$plugin_file = 'woocommerce.php';

// If the plugin version number is set, return it
if ( isset( $plugin_folder[$plugin_file]['Version'] ) )
return $plugin_folder[$plugin_file]['Version'];

else
// Otherwise return null
return NULL;





/**
* Add the gateway to WooCommerce
**/
function add_mpay( $methods )
$methods = 'woocommerce_mpay'; return $methods;


add_filter('woocommerce_payment_gateways', 'add_mpay' );


enter image description here










share|improve this question
























  • Both the URLs of the payment gateway do not exist. Both of them return 404. pcimdex.mpay.my/mdex2/payment/eCommerce mdex.my/mdex/payment/eCommerce

    – zipkundan
    Nov 15 '18 at 9:14











  • @loic thanks, that URL was provided by the payment gateway and it was in the API Doc snag.gy/7zBSsJ.jpg

    – NaFi
    Nov 15 '18 at 16:01

















0















I have a WC payment gateway which was build and working until WP version 4.1. Today I started testing it on WP 4.9.8 and WC 3.5.1.



When I try to complete purchase the payment gateway is not taking me to the payment screen to fill credit card details. It get stuck on redirection state.



Hope someone can help me out to solve this.



Below the image reference and the code I am using:



<?php

/**
* Plugin Name: CustomPaymentGateway
*/
add_action('plugins_loaded', 'init_mpay', 0);

function init_mpay()

if ( ! class_exists( 'WC_Payment_Gateway' ) ) return;

class woocommerce_mpay extends WC_Payment_Gateway

public function __construct()
global $woocommerce;

$this->id = 'mpay';
$this->method_title = __('MPay', 'mpay-chearaan-woo');
$this->icon = plugins_url( 'mpay.png', __FILE__ );
$this->has_fields = false;
$this->notify_url = str_replace( 'https:', 'http:', add_query_arg( 'wc-api', 'woocommerce_mpay', home_url( '/' ) ) );

// Load the form fields.
$this->init_form_fields();

// Load the settings.
$this->init_settings();

// Define user set variables
$this->mpayurl = $this->settings['mpayurl'];
$this->title = $this->settings['title'];
$this->description = $this->settings['description'];
$this->merchantid = $this->settings['merchantid'];
$this->hashKey = $this->settings['hashKey'];
$this->transactionDate = date('Y-m-d H:i:s O');
$this->woo_version = $this->get_woo_version();

// Actions
add_action('init', array(&$this, 'successful_request'));
add_action('woocommerce_api_woocommerce_mpay', array( &$this, 'successful_request' ));
add_action('woocommerce_receipt_mpay', array(&$this, 'receipt_page'));
if ( version_compare( WOOCOMMERCE_VERSION, '2.0.0', '>=' ) )
add_action('woocommerce_update_options_payment_gateways_' . $this->id, array( &$this, 'process_admin_options' ));
else
add_action('woocommerce_update_options_payment_gateways', array( &$this, 'process_admin_options' ));



/**
* Initialise Gateway Settings Form Fields
*/
function init_form_fields()

$this->form_fields = array(
'enabled' => array(
'title' => __( 'Enable/Disable:', 'mpay-chearaan-woo' ),
'type' => 'checkbox',
'label' => __( 'Enable MPay', 'mpay-chearaan-woo' ),
'default' => 'yes'
),
'mpayurl' => array(
'title' => __( 'UAT/Production:', 'mpay-chearaan-woo' ),
'type' => 'checkbox',
'label' => __( 'UAT', 'mpay-chearaan-woo' ),
'default' => 'yes'
),
'title' => array(
'title' => __( 'Title:', 'mpay-chearaan-woo' ),
'type' => 'text',
'description' => __( 'The title which the user sees during checkout.', 'mpay-chearaan-woo' ),
'default' => __( 'MPay Online Payment Gateway', 'mpay-chearaan-woo' )
),
'description' => array(
'title' => __( 'Description:', 'mpay-chearaan-woo' ),
'type' => 'textarea',
'description' => __( 'Description which the user sees during checkout.', 'mpay-chearaan-woo' ),
'default' => __('Pay securely through MPay's Secure Servers.', 'mpay-chearaan-woo')
),
'merchantid' => array(
'title' => __( 'Merchant ID:', 'mpay-chearaan-woo' ),
'type' => 'text',
'description' => __( 'Please enter your Merchant ID as provided by MPay.', 'mpay-chearaan-woo' ),
'default' => ''
),
'hashKey' => array(
'title' => __( 'Merchant hashKey:', 'mpay-chearaan-woo' ),
'type' => 'text',
'description' => __( 'Please enter your Merchant hashKey as provided by MPay.', 'mpay-chearaan-woo' ),
'default' => ''
)
);




public function admin_options()
?>
<h3>MPay</h3>
<p><?php _e('MPay works by sending the user to MPay to enter their payment information.', 'mpay-chearaan-woo'); ?></p>

<table class="form-table">
<?php
// Generate the HTML For the settings form.
$this->generate_settings_html();
?>
</table><!--/.form-table-->
<?php
// End admin_options()

/**
* There are no payment fields, but we want to show the description if set.
**/
function payment_fields()
if ($this->description) echo wpautop(wptexturize($this->description));


/**
* Generate the button link
**/
public function generate_mpay_form( $order_id )
global $woocommerce;


$order = new WC_Order( $order_id );

if ($this->mpayurl == "yes")
$mpay_adr = "https://pcimdex.mpay.my/mdex2/payment/eCommerce";
else
$mpay_adr = "https://www.mdex.my/mdex/payment/eCommerce";



$sHash = strtoupper(hash('sha256', $this->hashKey."Continue".str_pad($this->merchantid, 10, '0', STR_PAD_LEFT).str_pad($order->id, 20, '0', STR_PAD_LEFT).str_pad(($order->order_total*100), 12, '0', STR_PAD_LEFT)));
$mpay_args = array(
'secureHash' => $sHash,
'mid' => str_pad($this->merchantid, 10, '0', STR_PAD_LEFT),
'invno' => str_pad($order->id, 20, '0', STR_PAD_LEFT),
'amt' => str_pad(($order->order_total*100), 12, '0', STR_PAD_LEFT),
'desc' => str_pad("Order No ".$order_id, 255, ' ', STR_PAD_RIGHT),
'postURL' => $this->notify_url,
'phone' => $order->billing_phone,
'email' => $order->billing_email,
'param' => 'WC

/**
* Process the payment and return the result
**/
function process_payment( $order_id )

$order = new WC_Order( $order_id );

if($this->woo_version >= 2.1)
$redirect = $order->get_checkout_payment_url( true );
else if( $this->woo_version < 2.1 )
$redirect = add_query_arg('order', $order->id, add_query_arg('key', $order->order_key, get_permalink(get_option('woocommerce_pay_page_id'))));
else
$redirect = add_query_arg('order', $order->id, add_query_arg('key', $order->order_key, get_permalink(get_option('woocommerce_pay_page_id'))));


return array(
'result' => 'success',
'redirect' => $redirect
);



/**
* receipt_page
**/
function receipt_page( $order )

echo '<p>'.__('Please click the button below to pay with MPay.', 'mpay-chearaan-woo').'</p>';

echo $this->generate_mpay_form( $order );



/**
* Server callback was valid, process callback (update order as passed/failed etc).
**/
function successful_request($mpay_response)
global $woocommerce;


if (isset($_GET['wc-api']) && $_GET['wc-api'] == 'woocommerce_mpay')
/** need to trim from result **/
$Url_result = $_GET['result'];
$order = new WC_Order( (int) substr($Url_result,7,20) );
$tranID = (int)substr($Url_result,1,6);

if (substr($Url_result,0,1) == '0')
$r_status = 0;
else
$r_status = 33;


/*
$order = new WC_Order( (int) $_POST['invno'] );
$r_status = (int) $_POST['result'];

*/

if ($r_status == '0' )

$order->payment_complete();

$order->add_order_note('MPay Payment was SUCCESSFUL '.'<br>AuthCode is ' . $tranID);

wp_redirect( $this->get_return_url($order) ); exit;
//wp_redirect( $this->order->get_checkout_order_received_url() ); exit;

else

$order->update_status('failed', sprintf(__('MPay Payment Failed. Error Communicating with Bank.', 'mpay-chearaan-woo') ) );

wp_redirect($order->get_cancel_order_url()); exit;





function get_woo_version()

// If get_plugins() isn't available, require it
if ( ! function_exists( 'get_plugins' ) )
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );

// Create the plugins folder and file variables
$plugin_folder = get_plugins( '/woocommerce' );
$plugin_file = 'woocommerce.php';

// If the plugin version number is set, return it
if ( isset( $plugin_folder[$plugin_file]['Version'] ) )
return $plugin_folder[$plugin_file]['Version'];

else
// Otherwise return null
return NULL;





/**
* Add the gateway to WooCommerce
**/
function add_mpay( $methods )
$methods = 'woocommerce_mpay'; return $methods;


add_filter('woocommerce_payment_gateways', 'add_mpay' );


enter image description here










share|improve this question
























  • Both the URLs of the payment gateway do not exist. Both of them return 404. pcimdex.mpay.my/mdex2/payment/eCommerce mdex.my/mdex/payment/eCommerce

    – zipkundan
    Nov 15 '18 at 9:14











  • @loic thanks, that URL was provided by the payment gateway and it was in the API Doc snag.gy/7zBSsJ.jpg

    – NaFi
    Nov 15 '18 at 16:01













0












0








0


1






I have a WC payment gateway which was build and working until WP version 4.1. Today I started testing it on WP 4.9.8 and WC 3.5.1.



When I try to complete purchase the payment gateway is not taking me to the payment screen to fill credit card details. It get stuck on redirection state.



Hope someone can help me out to solve this.



Below the image reference and the code I am using:



<?php

/**
* Plugin Name: CustomPaymentGateway
*/
add_action('plugins_loaded', 'init_mpay', 0);

function init_mpay()

if ( ! class_exists( 'WC_Payment_Gateway' ) ) return;

class woocommerce_mpay extends WC_Payment_Gateway

public function __construct()
global $woocommerce;

$this->id = 'mpay';
$this->method_title = __('MPay', 'mpay-chearaan-woo');
$this->icon = plugins_url( 'mpay.png', __FILE__ );
$this->has_fields = false;
$this->notify_url = str_replace( 'https:', 'http:', add_query_arg( 'wc-api', 'woocommerce_mpay', home_url( '/' ) ) );

// Load the form fields.
$this->init_form_fields();

// Load the settings.
$this->init_settings();

// Define user set variables
$this->mpayurl = $this->settings['mpayurl'];
$this->title = $this->settings['title'];
$this->description = $this->settings['description'];
$this->merchantid = $this->settings['merchantid'];
$this->hashKey = $this->settings['hashKey'];
$this->transactionDate = date('Y-m-d H:i:s O');
$this->woo_version = $this->get_woo_version();

// Actions
add_action('init', array(&$this, 'successful_request'));
add_action('woocommerce_api_woocommerce_mpay', array( &$this, 'successful_request' ));
add_action('woocommerce_receipt_mpay', array(&$this, 'receipt_page'));
if ( version_compare( WOOCOMMERCE_VERSION, '2.0.0', '>=' ) )
add_action('woocommerce_update_options_payment_gateways_' . $this->id, array( &$this, 'process_admin_options' ));
else
add_action('woocommerce_update_options_payment_gateways', array( &$this, 'process_admin_options' ));



/**
* Initialise Gateway Settings Form Fields
*/
function init_form_fields()

$this->form_fields = array(
'enabled' => array(
'title' => __( 'Enable/Disable:', 'mpay-chearaan-woo' ),
'type' => 'checkbox',
'label' => __( 'Enable MPay', 'mpay-chearaan-woo' ),
'default' => 'yes'
),
'mpayurl' => array(
'title' => __( 'UAT/Production:', 'mpay-chearaan-woo' ),
'type' => 'checkbox',
'label' => __( 'UAT', 'mpay-chearaan-woo' ),
'default' => 'yes'
),
'title' => array(
'title' => __( 'Title:', 'mpay-chearaan-woo' ),
'type' => 'text',
'description' => __( 'The title which the user sees during checkout.', 'mpay-chearaan-woo' ),
'default' => __( 'MPay Online Payment Gateway', 'mpay-chearaan-woo' )
),
'description' => array(
'title' => __( 'Description:', 'mpay-chearaan-woo' ),
'type' => 'textarea',
'description' => __( 'Description which the user sees during checkout.', 'mpay-chearaan-woo' ),
'default' => __('Pay securely through MPay's Secure Servers.', 'mpay-chearaan-woo')
),
'merchantid' => array(
'title' => __( 'Merchant ID:', 'mpay-chearaan-woo' ),
'type' => 'text',
'description' => __( 'Please enter your Merchant ID as provided by MPay.', 'mpay-chearaan-woo' ),
'default' => ''
),
'hashKey' => array(
'title' => __( 'Merchant hashKey:', 'mpay-chearaan-woo' ),
'type' => 'text',
'description' => __( 'Please enter your Merchant hashKey as provided by MPay.', 'mpay-chearaan-woo' ),
'default' => ''
)
);




public function admin_options()
?>
<h3>MPay</h3>
<p><?php _e('MPay works by sending the user to MPay to enter their payment information.', 'mpay-chearaan-woo'); ?></p>

<table class="form-table">
<?php
// Generate the HTML For the settings form.
$this->generate_settings_html();
?>
</table><!--/.form-table-->
<?php
// End admin_options()

/**
* There are no payment fields, but we want to show the description if set.
**/
function payment_fields()
if ($this->description) echo wpautop(wptexturize($this->description));


/**
* Generate the button link
**/
public function generate_mpay_form( $order_id )
global $woocommerce;


$order = new WC_Order( $order_id );

if ($this->mpayurl == "yes")
$mpay_adr = "https://pcimdex.mpay.my/mdex2/payment/eCommerce";
else
$mpay_adr = "https://www.mdex.my/mdex/payment/eCommerce";



$sHash = strtoupper(hash('sha256', $this->hashKey."Continue".str_pad($this->merchantid, 10, '0', STR_PAD_LEFT).str_pad($order->id, 20, '0', STR_PAD_LEFT).str_pad(($order->order_total*100), 12, '0', STR_PAD_LEFT)));
$mpay_args = array(
'secureHash' => $sHash,
'mid' => str_pad($this->merchantid, 10, '0', STR_PAD_LEFT),
'invno' => str_pad($order->id, 20, '0', STR_PAD_LEFT),
'amt' => str_pad(($order->order_total*100), 12, '0', STR_PAD_LEFT),
'desc' => str_pad("Order No ".$order_id, 255, ' ', STR_PAD_RIGHT),
'postURL' => $this->notify_url,
'phone' => $order->billing_phone,
'email' => $order->billing_email,
'param' => 'WC

/**
* Process the payment and return the result
**/
function process_payment( $order_id )

$order = new WC_Order( $order_id );

if($this->woo_version >= 2.1)
$redirect = $order->get_checkout_payment_url( true );
else if( $this->woo_version < 2.1 )
$redirect = add_query_arg('order', $order->id, add_query_arg('key', $order->order_key, get_permalink(get_option('woocommerce_pay_page_id'))));
else
$redirect = add_query_arg('order', $order->id, add_query_arg('key', $order->order_key, get_permalink(get_option('woocommerce_pay_page_id'))));


return array(
'result' => 'success',
'redirect' => $redirect
);



/**
* receipt_page
**/
function receipt_page( $order )

echo '<p>'.__('Please click the button below to pay with MPay.', 'mpay-chearaan-woo').'</p>';

echo $this->generate_mpay_form( $order );



/**
* Server callback was valid, process callback (update order as passed/failed etc).
**/
function successful_request($mpay_response)
global $woocommerce;


if (isset($_GET['wc-api']) && $_GET['wc-api'] == 'woocommerce_mpay')
/** need to trim from result **/
$Url_result = $_GET['result'];
$order = new WC_Order( (int) substr($Url_result,7,20) );
$tranID = (int)substr($Url_result,1,6);

if (substr($Url_result,0,1) == '0')
$r_status = 0;
else
$r_status = 33;


/*
$order = new WC_Order( (int) $_POST['invno'] );
$r_status = (int) $_POST['result'];

*/

if ($r_status == '0' )

$order->payment_complete();

$order->add_order_note('MPay Payment was SUCCESSFUL '.'<br>AuthCode is ' . $tranID);

wp_redirect( $this->get_return_url($order) ); exit;
//wp_redirect( $this->order->get_checkout_order_received_url() ); exit;

else

$order->update_status('failed', sprintf(__('MPay Payment Failed. Error Communicating with Bank.', 'mpay-chearaan-woo') ) );

wp_redirect($order->get_cancel_order_url()); exit;





function get_woo_version()

// If get_plugins() isn't available, require it
if ( ! function_exists( 'get_plugins' ) )
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );

// Create the plugins folder and file variables
$plugin_folder = get_plugins( '/woocommerce' );
$plugin_file = 'woocommerce.php';

// If the plugin version number is set, return it
if ( isset( $plugin_folder[$plugin_file]['Version'] ) )
return $plugin_folder[$plugin_file]['Version'];

else
// Otherwise return null
return NULL;





/**
* Add the gateway to WooCommerce
**/
function add_mpay( $methods )
$methods = 'woocommerce_mpay'; return $methods;


add_filter('woocommerce_payment_gateways', 'add_mpay' );


enter image description here










share|improve this question
















I have a WC payment gateway which was build and working until WP version 4.1. Today I started testing it on WP 4.9.8 and WC 3.5.1.



When I try to complete purchase the payment gateway is not taking me to the payment screen to fill credit card details. It get stuck on redirection state.



Hope someone can help me out to solve this.



Below the image reference and the code I am using:



<?php

/**
* Plugin Name: CustomPaymentGateway
*/
add_action('plugins_loaded', 'init_mpay', 0);

function init_mpay()

if ( ! class_exists( 'WC_Payment_Gateway' ) ) return;

class woocommerce_mpay extends WC_Payment_Gateway

public function __construct()
global $woocommerce;

$this->id = 'mpay';
$this->method_title = __('MPay', 'mpay-chearaan-woo');
$this->icon = plugins_url( 'mpay.png', __FILE__ );
$this->has_fields = false;
$this->notify_url = str_replace( 'https:', 'http:', add_query_arg( 'wc-api', 'woocommerce_mpay', home_url( '/' ) ) );

// Load the form fields.
$this->init_form_fields();

// Load the settings.
$this->init_settings();

// Define user set variables
$this->mpayurl = $this->settings['mpayurl'];
$this->title = $this->settings['title'];
$this->description = $this->settings['description'];
$this->merchantid = $this->settings['merchantid'];
$this->hashKey = $this->settings['hashKey'];
$this->transactionDate = date('Y-m-d H:i:s O');
$this->woo_version = $this->get_woo_version();

// Actions
add_action('init', array(&$this, 'successful_request'));
add_action('woocommerce_api_woocommerce_mpay', array( &$this, 'successful_request' ));
add_action('woocommerce_receipt_mpay', array(&$this, 'receipt_page'));
if ( version_compare( WOOCOMMERCE_VERSION, '2.0.0', '>=' ) )
add_action('woocommerce_update_options_payment_gateways_' . $this->id, array( &$this, 'process_admin_options' ));
else
add_action('woocommerce_update_options_payment_gateways', array( &$this, 'process_admin_options' ));



/**
* Initialise Gateway Settings Form Fields
*/
function init_form_fields()

$this->form_fields = array(
'enabled' => array(
'title' => __( 'Enable/Disable:', 'mpay-chearaan-woo' ),
'type' => 'checkbox',
'label' => __( 'Enable MPay', 'mpay-chearaan-woo' ),
'default' => 'yes'
),
'mpayurl' => array(
'title' => __( 'UAT/Production:', 'mpay-chearaan-woo' ),
'type' => 'checkbox',
'label' => __( 'UAT', 'mpay-chearaan-woo' ),
'default' => 'yes'
),
'title' => array(
'title' => __( 'Title:', 'mpay-chearaan-woo' ),
'type' => 'text',
'description' => __( 'The title which the user sees during checkout.', 'mpay-chearaan-woo' ),
'default' => __( 'MPay Online Payment Gateway', 'mpay-chearaan-woo' )
),
'description' => array(
'title' => __( 'Description:', 'mpay-chearaan-woo' ),
'type' => 'textarea',
'description' => __( 'Description which the user sees during checkout.', 'mpay-chearaan-woo' ),
'default' => __('Pay securely through MPay's Secure Servers.', 'mpay-chearaan-woo')
),
'merchantid' => array(
'title' => __( 'Merchant ID:', 'mpay-chearaan-woo' ),
'type' => 'text',
'description' => __( 'Please enter your Merchant ID as provided by MPay.', 'mpay-chearaan-woo' ),
'default' => ''
),
'hashKey' => array(
'title' => __( 'Merchant hashKey:', 'mpay-chearaan-woo' ),
'type' => 'text',
'description' => __( 'Please enter your Merchant hashKey as provided by MPay.', 'mpay-chearaan-woo' ),
'default' => ''
)
);




public function admin_options()
?>
<h3>MPay</h3>
<p><?php _e('MPay works by sending the user to MPay to enter their payment information.', 'mpay-chearaan-woo'); ?></p>

<table class="form-table">
<?php
// Generate the HTML For the settings form.
$this->generate_settings_html();
?>
</table><!--/.form-table-->
<?php
// End admin_options()

/**
* There are no payment fields, but we want to show the description if set.
**/
function payment_fields()
if ($this->description) echo wpautop(wptexturize($this->description));


/**
* Generate the button link
**/
public function generate_mpay_form( $order_id )
global $woocommerce;


$order = new WC_Order( $order_id );

if ($this->mpayurl == "yes")
$mpay_adr = "https://pcimdex.mpay.my/mdex2/payment/eCommerce";
else
$mpay_adr = "https://www.mdex.my/mdex/payment/eCommerce";



$sHash = strtoupper(hash('sha256', $this->hashKey."Continue".str_pad($this->merchantid, 10, '0', STR_PAD_LEFT).str_pad($order->id, 20, '0', STR_PAD_LEFT).str_pad(($order->order_total*100), 12, '0', STR_PAD_LEFT)));
$mpay_args = array(
'secureHash' => $sHash,
'mid' => str_pad($this->merchantid, 10, '0', STR_PAD_LEFT),
'invno' => str_pad($order->id, 20, '0', STR_PAD_LEFT),
'amt' => str_pad(($order->order_total*100), 12, '0', STR_PAD_LEFT),
'desc' => str_pad("Order No ".$order_id, 255, ' ', STR_PAD_RIGHT),
'postURL' => $this->notify_url,
'phone' => $order->billing_phone,
'email' => $order->billing_email,
'param' => 'WC

/**
* Process the payment and return the result
**/
function process_payment( $order_id )

$order = new WC_Order( $order_id );

if($this->woo_version >= 2.1)
$redirect = $order->get_checkout_payment_url( true );
else if( $this->woo_version < 2.1 )
$redirect = add_query_arg('order', $order->id, add_query_arg('key', $order->order_key, get_permalink(get_option('woocommerce_pay_page_id'))));
else
$redirect = add_query_arg('order', $order->id, add_query_arg('key', $order->order_key, get_permalink(get_option('woocommerce_pay_page_id'))));


return array(
'result' => 'success',
'redirect' => $redirect
);



/**
* receipt_page
**/
function receipt_page( $order )

echo '<p>'.__('Please click the button below to pay with MPay.', 'mpay-chearaan-woo').'</p>';

echo $this->generate_mpay_form( $order );



/**
* Server callback was valid, process callback (update order as passed/failed etc).
**/
function successful_request($mpay_response)
global $woocommerce;


if (isset($_GET['wc-api']) && $_GET['wc-api'] == 'woocommerce_mpay')
/** need to trim from result **/
$Url_result = $_GET['result'];
$order = new WC_Order( (int) substr($Url_result,7,20) );
$tranID = (int)substr($Url_result,1,6);

if (substr($Url_result,0,1) == '0')
$r_status = 0;
else
$r_status = 33;


/*
$order = new WC_Order( (int) $_POST['invno'] );
$r_status = (int) $_POST['result'];

*/

if ($r_status == '0' )

$order->payment_complete();

$order->add_order_note('MPay Payment was SUCCESSFUL '.'<br>AuthCode is ' . $tranID);

wp_redirect( $this->get_return_url($order) ); exit;
//wp_redirect( $this->order->get_checkout_order_received_url() ); exit;

else

$order->update_status('failed', sprintf(__('MPay Payment Failed. Error Communicating with Bank.', 'mpay-chearaan-woo') ) );

wp_redirect($order->get_cancel_order_url()); exit;





function get_woo_version()

// If get_plugins() isn't available, require it
if ( ! function_exists( 'get_plugins' ) )
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );

// Create the plugins folder and file variables
$plugin_folder = get_plugins( '/woocommerce' );
$plugin_file = 'woocommerce.php';

// If the plugin version number is set, return it
if ( isset( $plugin_folder[$plugin_file]['Version'] ) )
return $plugin_folder[$plugin_file]['Version'];

else
// Otherwise return null
return NULL;





/**
* Add the gateway to WooCommerce
**/
function add_mpay( $methods )
$methods = 'woocommerce_mpay'; return $methods;


add_filter('woocommerce_payment_gateways', 'add_mpay' );


enter image description here







php wordpress woocommerce payment-gateway






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 15 '18 at 9:32









LoicTheAztec

96.9k1371114




96.9k1371114










asked Nov 15 '18 at 9:06









NaFiNaFi

298




298












  • Both the URLs of the payment gateway do not exist. Both of them return 404. pcimdex.mpay.my/mdex2/payment/eCommerce mdex.my/mdex/payment/eCommerce

    – zipkundan
    Nov 15 '18 at 9:14











  • @loic thanks, that URL was provided by the payment gateway and it was in the API Doc snag.gy/7zBSsJ.jpg

    – NaFi
    Nov 15 '18 at 16:01

















  • Both the URLs of the payment gateway do not exist. Both of them return 404. pcimdex.mpay.my/mdex2/payment/eCommerce mdex.my/mdex/payment/eCommerce

    – zipkundan
    Nov 15 '18 at 9:14











  • @loic thanks, that URL was provided by the payment gateway and it was in the API Doc snag.gy/7zBSsJ.jpg

    – NaFi
    Nov 15 '18 at 16:01
















Both the URLs of the payment gateway do not exist. Both of them return 404. pcimdex.mpay.my/mdex2/payment/eCommerce mdex.my/mdex/payment/eCommerce

– zipkundan
Nov 15 '18 at 9:14





Both the URLs of the payment gateway do not exist. Both of them return 404. pcimdex.mpay.my/mdex2/payment/eCommerce mdex.my/mdex/payment/eCommerce

– zipkundan
Nov 15 '18 at 9:14













@loic thanks, that URL was provided by the payment gateway and it was in the API Doc snag.gy/7zBSsJ.jpg

– NaFi
Nov 15 '18 at 16:01





@loic thanks, that URL was provided by the payment gateway and it was in the API Doc snag.gy/7zBSsJ.jpg

– NaFi
Nov 15 '18 at 16:01












0






active

oldest

votes












Your Answer






StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













draft saved

draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53315805%2fwoocommerce-custom-payment-gateway-not-redirecting%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes















draft saved

draft discarded
















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53315805%2fwoocommerce-custom-payment-gateway-not-redirecting%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Use pre created SQLite database for Android project in kotlin

Darth Vader #20

Ondo