使用重定向的 Woocommerce 自定义支付网关工作流程

Posted

技术标签:

【中文标题】使用重定向的 Woocommerce 自定义支付网关工作流程【英文标题】:Woocommerce custom payment gateway workflow using redirection 【发布时间】:2015-12-18 12:05:14 【问题描述】:

我是 WooCommerce 自定义支付网关 (PG) 集成的新手。

初始页面:WooCommerce 的结帐页面。我根据此处的说明创建了一个自定义插件: http://www.sitepoint.com/building-a-woocommerce-payment-extension/ 和 http://docs.woothemes.com/document/payment-gateway-api/

所以,当我访问结帐页面时,我可以在底部看到我的支付网关。我的代码:

构造函数

public function __construct() 
    $this->id                   = 'xxxx_payment_gateway';
    $this->title                = __( "xxxx Payment Gateway", 'woocommerce-xxxx-gateway' );
    $this->icon                 = null;
    $this->method_title         = __( 'xxxx Payment Gateway', 'woocommerce-xxxx-gateway' );
    $this->method_description   = __( 'Take payments via xxxx Payment Gateway - uses the xxxx Payment Gateway SDK.', 'woocommerce-xxxx-gateway' );
    $this->has_fields           = true;

    $this->init_form_fields();
    $this->init_settings();

    // Save settings
    if ( is_admin() ) 
        add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( &$this, 'process_admin_options' ) );
    

process_payment

function process_payment( $order_id ) 
    $customer_order = wc_get_order( $order_id );
    $country_list = array(
        "IN"=>"IND",
    );
    $environment_url = 'http://example.com/pgic/pgserv.php';
    $payload = array(
        "x_invoice_num"         => str_replace( "#", "", $customer_order->get_order_number() ),
        "x_merchant_id"         => $this->merchant_id, 
        // Order total
        "x_amount"              => 3,//$customer_order->order_total,
        // Billing Information
        "x_first_name"          => $customer_order->billing_first_name,
        ....
        // Shipping Information
        "x_ship_to_first_name"  => $customer_order->shipping_first_name,
        ....
        "x_cust_id"             => $customer_order->user_id,
        "x_customer_ip"         => $_SERVER['REMOTE_ADDR'],
    );
    $response = wp_remote_post( $environment_url, 
        array(
            'method'    => 'POST',
            'body'      => http_build_query( $payload ),
            'timeout'   => 90,
            'sslverify' => false,
        ) 
    );
    $forwardURL = trim(wp_remote_retrieve_body( $response ));

    if ( is_wp_error( $response ) ) 
    
        // Return failure redirect
        return array(
            'result'    => 'failure',
            'redirect'  => 'failed.php'
        );
    
    else
        // Reduce stock levels
        // $order->reduce_order_stock();

        // Remove cart
        // WC()->cart->empty_cart();

        // Return thankyou redirect
        return array(
            'result'    => 'success',
            'redirect'  => $forwardURL //$this->get_return_url( $customer_order )
        );
    
//process_payment

我的 PG 供应商给了我以下集成流程。

第1页:上面的插件process_payment传递到支付网关处理到pgserv.php。

第 2 页:自动出现我的银行页面(由于我使用银行的信用卡),我提供 OTP 和所有内容。

第 3 页:完成该步骤后,支付网关会从那里转发到我的网站中返回交易结果的另一个成功登录页面(我们称之为 pgresponse.php)。

这就是问题的开始。 我尝试重定向/提交到一个独立页面(submitaction.php),我尝试在其中标记订单完成/付款完成并清空购物车。我的代码:

global $woocommerce, $post;
$order = new WC_Order($post->ID);
$payment_status = $order->payment_complete();

无论我做什么,这种情况下的订单都不会将状态更新为付款完成。甚至 $payment_status 也不会返回任何内容。

问题:

    我该怎么办?

    我打算为 process_order_status 写一个钩子来发送邮件。我计划的方式是在插件中编写以下代码:

    public function process_order_status( $order, $payment_id, $status, $auth_code ) 
        echo "Payment details :: $order, $payment_id, $status, $auth_code";
        error_log("Payment details :: $order, $payment_id, $status, $auth_code");
        if ( 'APPROVED' == $status ) 
            // Payment complete
            $order->payment_complete( $payment_id );
            // Add order note
            $order->add_order_note( sprintf( __( 'Payment approved (ID: %s, Auth Code: %s)', 'woocommerce' ), $payment_id, $auth_code ) );
            // Remove cart
            WC()->cart->empty_cart();
            return true;
        
        return false;
    //process_order_status
    

这样对吗?如果我能得到更新付款状态的订单,我肯定会调用这个方法,对吗?

我迫切需要一些帮助。任何链接或只是方向也可以。提前非常感谢。

【问题讨论】:

【参考方案1】:

您需要对发送到支付提供商的有效负载进行解码。做这样的事情。

public function check_ipn_response($payload)

    $raw_input = json_decode(file_get_contents('php://input'),TRUE);
    $order_id = $raw_input['callback_data'];
    // get order_id
    $order = new WC_Order($order_id);
    // Update order status once order is complete
    $order->update_status( 'processing', _x( 'Payment Complete', 'Check payment method', 'wc-gateway-paymentsgy' ) );
    wp_die();

【讨论】:

以上是关于使用重定向的 Woocommerce 自定义支付网关工作流程的主要内容,如果未能解决你的问题,请参考以下文章

如何从 woocommerce 自定义支付网关中的 process_payment 函数执行 POST 重定向?

更改 Woocommerce 结帐端点以显示订单摘要详细信息

Woocommerce 如何在我的帐户页面上重定向自定义端点

Woocommerce 客户在 Paypal 重定向之前退出

在 COD 支付模块重定向链接中获取 Opencart 订单 ID

如何防止“woocommerce_simple_add_to_cart”重定向到购物车页面?