• Hi,

    I am using the PayTM plugin for woocommerce.
    On checkout, it get s stuck on:

    Thank you for your order. We are now redirecting you to paytm to make payment

    If I click “Pay via Paytm” before this auto redirection kicks in, I can successfully get to the payment gateway site, but I cannot use that workaround as the auto redirection kicks in in seconds and then the page is stuck there for ever.

    Here is the plugin code:

    <?php include(‘encdec_paytm.php’);?>
    <?php
    /*
    Plugin Name: WooCommerce paytm gateway
    Plugin URI: https://paytm.com/
    Description: Used to integrate the paytm payment gateway with your website.
    Version: 0.1
    Author: Varun

    License: GNU General Public License v3.0
    License URI: https://www.gnu.org/licenses/gpl-3.0.html
    */

    add_action(‘plugins_loaded’, ‘woocommerce_paytm_init’, 0);

    function woocommerce_paytm_init() {

    if ( !class_exists( ‘WC_Payment_Gateway’ ) ) return;

    /**
    * Localisation
    */
    load_plugin_textdomain(‘wc-paytm’, false, dirname( plugin_basename( __FILE__ ) ) . ‘/languages’);
    if($_GET[‘msg’]!=”){
    add_action(‘the_content’, ‘paytmShowMessage’);
    }

    function paytmShowMessage($content){
    return ‘<div class=”box ‘.htmlentities($_GET[‘type’]).’-box”>’.htmlentities(urldecode($_GET[‘msg’])).'</div>’.$content;
    }
    /**
    * Gateway class
    */
    class WC_paytm extends WC_Payment_Gateway {
    protected $msg = array();
    public function __construct(){ // construct form //
    // Go wild in here
    $this -> id = ‘paytm’;
    $this -> method_title = __(‘paytm’);
    $this -> icon = WP_PLUGIN_URL . “/” . plugin_basename(dirname(__FILE__)) . ‘/images/logo.gif’;
    $this -> has_fields = false;
    $this -> init_form_fields();
    $this -> init_settings();
    $this -> title = $this -> settings[‘title’];
    $this -> description = $this -> settings[‘description’];
    $this -> merchantIdentifier = $this -> settings[‘merchantIdentifier’];
    $this -> secret_key = html_entity_decode($this -> settings[‘secret_key’]);
    $this -> gateway_url = $this -> settings[‘gateway_url’];
    $this -> industry_type = $this -> settings[‘industry_type’];
    $this -> channel_id = $this -> settings[‘channel_id’];
    $this -> website = $this -> settings[‘website’];
    $this -> redirect_page_id = $this -> settings[‘redirect_page_id’];
    $this -> mode = $this -> settings[‘mode’];
    $this -> log = $this -> settings[‘log’];
    //$this -> liveurl = “https:/api.paytm.com/transact?v=2”;
    $this -> msg[‘message’] = “”;
    $this -> msg[‘class’] = “”;

    add_action(‘init’, array(&$this, ‘check_paytm_response’));
    //update for woocommerce >2.0
    add_action( ‘woocommerce_api_’ . strtolower( get_class( $this ) ), array( $this, ‘check_paytm_response’ ) );
    add_action(‘valid-paytm-request’, array(&$this, ‘successful_request’)); // this save
    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’ ) );
    }
    add_action(‘woocommerce_receipt_paytm’, array(&$this, ‘receipt_page’));
    add_action(‘woocommerce_thankyou_paytm’,array(&$this, ‘thankyou_page’));
    }
    //$merchant_id -> $gateway_url => $industry_type => $channel_id = >$website

    function init_form_fields(){

    $this -> form_fields = array(
    ‘enabled’ => array(
    ‘title’ => __(‘Enable/Disable’),
    ‘type’ => ‘checkbox’,
    ‘label’ => __(‘Enable paytm Payment Module.’),
    ‘default’ => ‘no’),
    ‘title’ => array(
    ‘title’ => __(‘Title:’),
    ‘type’=> ‘text’,
    ‘description’ => __(‘This controls the title which the user sees during checkout.’),
    ‘default’ => __(‘paytm’)),
    ‘description’ => array(
    ‘title’ => __(‘Description:’),
    ‘type’ => ‘textarea’,
    ‘description’ => __(‘This controls the description which the user sees during checkout.’),
    ‘default’ => __(‘The best payment gateway provider in India for e-payment through credit card, debit card & netbanking.’)),

    ‘merchantIdentifier’ => array(
    ‘title’ => __(‘Merchant Identifier’),
    ‘type’ => ‘text’,
    ‘description’ => __(‘This id(USER ID) available at “Generate Secret Key” of “Integration -> Card payments integration at paytm.”‘)),

    ‘secret_key’ => array(
    ‘title’ => __(‘Secret Key’),
    ‘type’ => ‘text’,
    ‘description’ => __(‘Given to Merchant by paytm’),
    ),
    ‘gateway_url’ => array(
    ‘title’ => __(‘Gateway URL’),
    ‘type’ => ‘text’,
    ‘description’ => __(‘Given to Merchant by paytm’),
    ),
    ‘industry_type’ => array(
    ‘title’ => __(‘Industry Type’),
    ‘type’ => ‘text’,
    ‘description’ => __(‘Given to Merchant by paytm’),
    ),
    ‘channel_id’ => array(
    ‘title’ => __(‘Channel ID’),
    ‘type’ => ‘text’,
    ‘description’ => __(‘WEB – for desktop websites / WAP – for mobile websites’),
    ),
    ‘website’ => array(
    ‘title’ => __(‘Web Site’),
    ‘type’ => ‘text’,
    ‘description’ => __(‘Given to Merchant by paytm’),
    ),
    ‘redirect_page_id’ => array(
    ‘title’ => __(‘Return Page’),
    ‘type’ => ‘select’,
    ‘options’ => $this -> get_pages(‘Select Page’),
    ‘description’ => “URL of success page”
    ),
    ‘mode’ => array(
    ‘title’ => __(‘Mode’),
    ‘type’ => ‘text’,
    ‘options’ => ‘text’,
    ‘description’ => “Mode of transaction. (1=LIVE, 0=TEST)”
    ),
    ‘log’ => array(
    ‘title’ => __(‘Do you want to log’),
    ‘type’ => ‘text’,
    ‘options’ => ‘text’,
    ‘description’ => “(yes/no)”
    )
    );

    }

    /**
    * Admin Panel Options
    * – Options for bits like ‘title’ and availability on a country-by-country basis
    **/
    public function admin_options(){
    echo ‘<h3>’.__(‘paytm Payment Gateway’).'</h3>’;
    echo ‘<p>’.__(‘India online payment solutions for all your transactions by paytm’).'</p>’;
    echo ‘<table class=”form-table”>’;
    $this -> generate_settings_html();
    echo ‘</table>’;

    }
    /**
    * There are no payment fields for paytm, but we want to show the description if set.
    **/
    function payment_fields(){
    if($this -> description) echo wpautop(wptexturize($this -> description));
    }
    /**
    * Receipt Page
    **/
    function receipt_page($order){
    echo ‘<p>’.__(‘Thank you for your order, please click the button below to pay with paytm.’).'</p>’;
    echo $this -> generate_paytm_form($order);
    }
    /**
    * Process the payment and return the result
    **/
    function process_payment($order_id){
    if ( version_compare( WOOCOMMERCE_VERSION, ‘2.0.0’, ‘>=’ ) ) {
    $order = &new WC_Order($order_id);
    } else {
    $order = &new woocommerce_order($order_id);
    }
    return array(‘result’ => ‘success’, ‘redirect’ => add_query_arg(‘order’,
    $order->id, add_query_arg(‘key’, $order->order_key, $order->get_checkout_payment_url( true )))
    );
    }

    /**
    * Check for valid paytm server callback // response processing //
    **/
    function check_paytm_response(){
    global $woocommerce;
    if(isset($_POST[‘ORDERID’]) && isset($_POST[‘RESPCODE’])){
    $order_sent = $_POST[‘ORDERID’];
    $responseDescription = $_POST[‘RESPMSG’];
    if ( version_compare( WOOCOMMERCE_VERSION, ‘2.0.0’, ‘>=’ ) ) {
    $order = new WC_Order($_POST[‘ORDERID’]);
    } else {
    $order = new woocommerce_order($_POST[‘ORDERID’]);
    }
    if($this -> log == “yes”){error_log(“Response Code = ” . $_POST[‘RESPCODE’]);}
    $redirect_url = ($this -> redirect_page_id==”” || $this -> redirect_page_id==0)?get_site_url() . “/”:get_permalink($this -> redirect_page_id);
    $this -> msg[‘class’] = ‘error’;
    $this -> msg[‘message’] = “Thank you for shopping with us. However, the transaction has been Failed For Reason : ” . $responseDescription;
    if($_POST[‘RESPCODE’] == 01) { // success

    $order_amount = $order -> order_total;

    if(($_POST[‘TXNAMOUNT’] == $order_amount)){
    if($this -> log == “yes”){error_log(“amount matched”);}
    // code by paytm team
    $order_sent = $_POST[‘ORDERID’];
    $res_code = $_POST[‘RESPCODE’];
    $responseDescription = $_POST[‘RESPMSG’];
    $checksum_recv = $_POST[‘CHECKSUMHASH’];
    $paramList = $_POST;
    $order_amount = $_POST[‘TXNAMOUNT’];
    // code by paytm team
    $all = $paramList;
    if($this -> log == “yes”){error_log(“received parameters = ” . $all);}
    $bool = “FALSE”;
    $bool = verifychecksum_e($paramList, $this -> secret_key, $checksum_recv);
    //$newcheck = Checksum::calculateChecksum($this->secret_key, $all);
    if($this -> log == “yes”){error_log(“calculated checksum = ” . $newch . ” and checksum received = ” . $_POST[‘CHECKSUMHASH’]);}
    if ($bool == “TRUE”) {
    if($order -> status !==’completed’){
    error_log(“SUCCESS”);
    $this -> msg[‘message’] = “Thank you for your order . Your transaction has been successful.”;
    $this -> msg[‘class’] = ‘success’;
    if($order -> status == ‘processing’){

    } else {
    $order -> payment_complete();
    $order -> add_order_note(‘Mobile Wallet payment successful’);
    $order -> add_order_note($this->msg[‘message’]);
    $woocommerce -> cart -> empty_cart();

    }
    }
    }
    else{
    // server to server failed while call//
    //error_log(“api process failed”);
    $this -> msg[‘class’] = ‘error’;
    $this -> msg[‘message’] = “Severe Error Occur.”;
    $order -> update_status(‘failed’);
    $order -> add_order_note(‘Failed’);
    $order -> add_order_note($this->msg[‘message’]);
    $woocommerce -> cart -> empty_cart();
    }

    }
    else{
    // Order mismatch occur //
    //error_log(“order mismatch”);
    $this -> msg[‘class’] = ‘error’;
    $this -> msg[‘message’] = “Order Mismatch Occur”;
    $order -> update_status(‘failed’);
    $order -> add_order_note(‘Failed’);
    $order -> add_order_note($this->msg[‘message’]);
    $woocommerce -> cart -> empty_cart();
    }
    }
    else{
    $order -> update_status(‘failed’);
    $order -> add_order_note(‘Failed’);
    $order -> add_order_note($responseDescription);
    $order -> add_order_note($this->msg[‘message’]);
    $woocommerce -> cart -> empty_cart();
    }
    add_action(‘the_content’, array(&$this, ‘paytmShowMessage’));

    $redirect_url = ($this -> redirect_page_id==”” || $this -> redirect_page_id==0)?get_site_url() . “/”:get_permalink($this -> redirect_page_id);
    //For wooCoomerce 2.0
    $redirect_url = add_query_arg( array(‘msg’=> urlencode($this -> msg[‘message’]), ‘type’=>$this -> msg[‘class’]), $redirect_url );

    wp_redirect( $redirect_url );
    exit;
    }
    }

    /**
    * Generate paytm button link
    **/
    public function generate_paytm_form($order_id){
    global $woocommerce;
    $txnDate=date(‘Y-m-d’);
    $milliseconds = (int) (1000 * (strtotime(date(‘Y-m-d’))));
    if ( version_compare( WOOCOMMERCE_VERSION, ‘2.0.0’, ‘>=’ ) ) {
    $order = &new WC_Order($order_id);
    } else {
    $order = &new woocommerce_order($order_id);
    }
    $redirect_url = ($this -> redirect_page_id==”” || $this -> redirect_page_id==0)?get_site_url() . “/”:get_permalink($this -> redirect_page_id);
    // pretty url check //
    $a = strstr($redirect_url,”?”);
    if($a){ $redirect_url .= “&wc-api=WC_paytm”;}
    else {$redirect_url .= “?wc-api=WC_paytm”;}
    error_log(“redirect url = this {$redirect_url}”);
    //////////////
    $order_id = $order_id;
    $amt= $order -> order_total;
    $txntype=’1′;
    $ptmoption=’1′;
    $currency=”INR”;
    $purpose=”1″;
    $productDescription=’paytm’;
    $ip=$_SERVER[‘REMOTE_ADDR’];

    $email = ”;
    $mobile_no = ”;

    try{
    $email = $order -> billing_email;
    }catch(Exception $e){

    }

    try{
    $mobile_no = preg_replace(‘#[^0-9]{0,13}#is’,”,$order -> billing_phone);
    }catch(Exception $e){

    }

    $cust_id= $order -> billing_first_name;

    if(! empty($email)){
    $cust_id = $email;
    }

    $post_variables = Array(
    “MID” => $this -> merchantIdentifier,
    “ORDER_ID” => $order_id,
    “CUST_ID” => $cust_id,
    “TXN_AMOUNT” => $amt,
    “CHANNEL_ID” => $this -> channel_id,
    “INDUSTRY_TYPE_ID” => $this -> industry_type,
    “WEBSITE” => $this -> website,
    “EMAIL” => $email,
    “MOBILE_NO” => $mobile_no
    );

    if($this->log == “yes”)
    {
    error_log(“AllParams : “.$all);
    error_log(“Secret Key : “. $this -> secret_key);
    }
    //$checksum = Checksum::calculateChecksum($this->secret_key, $all);

    $checksum = getChecksumFromArray($post_variables, $this->secret_key);

    $paytm_args_array = array();

    $paytm_args_array[] = “<input type=’hidden’ name=’MID’ value='”. $this -> merchantIdentifier .”‘/>”;
    $paytm_args_array[] = “<input type=’hidden’ name=’ORDER_ID’ value='”. $order_id .”‘/>”;
    $paytm_args_array[] = “<input type=’hidden’ name=’WEBSITE’ value='”. $this -> website .”‘/>”;
    $paytm_args_array[] = “<input type=’hidden’ name=’INDUSTRY_TYPE_ID’ value='”. $this -> industry_type .”‘/>”;
    $paytm_args_array[] = “<input type=’hidden’ name=’CHANNEL_ID’ value='”. $this -> channel_id .”‘/>”;
    $paytm_args_array[] = “<input type=’hidden’ name=’TXN_AMOUNT’ value='”. $amt .”‘/>”;
    $paytm_args_array[] = “<input type=’hidden’ name=’CUST_ID’ value='”. $cust_id .”‘/>”;
    $paytm_args_array[] = “<input type=’hidden’ name=’EMAIL’ value='”. $email .”‘/>”;
    $paytm_args_array[] = “<input type=’hidden’ name=’MOBILE_NO’ value='”. $mobile_no .”‘/>”;
    $paytm_args_array[] = “<input type=’hidden’ name=’txnDate’ value='”. date(‘Y-m-d H:i:s’) .”‘/>”;
    $paytm_args_array[] = “<input type=’hidden’ name=’CHECKSUMHASH’ value='”. $checksum .”‘/>”;

    return ‘<form action=”‘.$this -> gateway_url.'” method=”post” id=”paytm_payment_form”>
    ‘ . implode(”, $paytm_args_array) . ‘
    <input type=”submit” class=”button-alt” id=”submit_paytm_payment_form” value=”‘.__(‘Pay via paytm’).'” /> get_cancel_order_url().'”>’.__(‘Cancel order & restore cart’).’
    <script type=”text/javascript”>
    jQuery(function(){
    jQuery(“body”).block(
    {
    message: “<img src=\”‘.$woocommerce->plugin_url().’/assets/images/ajax-loader.gif\” alt=\”Redirecting…\” style=\”float:left; margin-right: 10px;\” />’.__(‘Thank you for your order. We are now redirecting you to paytm to make payment.’).'”,
    overlayCSS:
    {
    background: “#fff”,
    opacity: 0.6
    },
    css: {
    padding: 20,
    textAlign: “center”,
    color: “#555”,
    border: “3px solid #aaa”,
    backgroundColor:”#fff”,
    cursor: “wait”,
    lineHeight:”32px”
    }
    });
    jQuery(“#submit_paytm_payment_form”).click();

    });
    </script>
    </form>’;

    }

    /*
    * End paytm Essential Functions
    **/
    // get all pages

    function get_pages($title = false, $indent = true) {
    $wp_pages = get_pages(‘sort_column=menu_order’);
    $page_list = array();
    if ($title) $page_list[] = $title;
    foreach ($wp_pages as $page) {
    $prefix = ”;
    // show indented child pages?
    if ($indent) {
    $has_parent = $page->post_parent;
    while($has_parent) {
    $prefix .= ‘ – ‘;
    $next_page = get_page($has_parent);
    $has_parent = $next_page->post_parent;
    }
    }
    // add to page list array array
    $page_list[$page->ID] = $prefix . $page->post_title;
    }
    return $page_list;
    }

    }

    /**
    * Add the Gateway to WooCommerce
    **/
    function woocommerce_add_paytm_gateway($methods) {
    $methods[] = ‘WC_paytm’;
    return $methods;
    }

    add_filter(‘woocommerce_payment_gateways’, ‘woocommerce_add_paytm_gateway’ );
    }

    ?>

    Appreciate any help please!

    https://www.ads-software.com/plugins/woocommerce/

  • The topic ‘Woocommerce checkout stuck at "Thank you for your order. We are now redirecting"’ is closed to new replies.