Woocommerce提交到支付网关

时间:2015-07-19 08:18:26

标签: wordpress woocommerce payment-gateway

我正在为Woocommerce付款开发wordpress插件。 我可以看到我必须扩展 WC_Payment_Gateway 并实施方法“ process_payment ”。我已经研究了一些例子,发现这个方法应该返回类似的东西:

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

然后控件返回 WC_Checkout ,它将重定向到提供的网址。
问题是我们的付款服务提供商要求提交表单到他的页面而不是重定向。考虑到API限制,我想问什么是与我的支付提供商联系的最佳方式? 有没有办法提交表单而不是重定向?

1 个答案:

答案 0 :(得分:4)

您可以通过以下方法扩展WooCommerce WC_Payment_Gateway类来实现如下所示和评论:

public function __construct() {
    $this->id                   = 'my-payment-gateway';
    $this->icon                 = plugins_url( '/path/to/image.extension', __FILE__ );
    $this->has_fields           = true;
    $this->method_title         = __( 'My Payment Gateway', 'txdomain' );
    $this->method_description   = __( 'Add some descriptions here.', 'txdomain' );
    $this->init_form_fields();
    $this->init_settings();
    $this->title                = $this->get_option( 'title' );
    $this->description          = $this->get_option( 'description' );

    add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array(
        $this,
        'process_admin_options'
    ) );
    // below is the hook you need for that purpose
    add_action( 'woocommerce_receipt_' . $this->id, array(
        $this,
        'pay_for_order'
    ) );
}

// here, your process payment method, returning the pay for order page
// where you will can submit the form to your payment gateway providers' page
public function process_payment( $order_id ) {
    $order = new WC_Order( $order_id );

    return array(
        'result' => 'success',
        'redirect' => $order->get_checkout_payment_url( true )
    );
}

// here, prepare your form and submit it to the required URL
public function pay_for_order( $order_id ) {
    $order = new WC_Order( $order_id );
    echo '<p>' . __( 'Redirecting to payment provider.', 'txtdomain' ) . '</p>';
    // add a note to show order has been placed and the user redirected
    $order->add_order_note( __( 'Order placed and user redirected.', 'txtdomain' ) );
    // update the status of the order should need be
    $order->update_status( 'on-hold', __( 'Awaiting payment.', 'txtdomain' ) );
    // remember to empty the cart of the user
    WC()->cart->empty_cart();

    // perform a click action on the submit button of the form you are going to return
    wc_enqueue_js( 'jQuery( "#submit-form" ).click();' );

    // return your form with the needed parameters
    return '<form action="' . 'https://example.com' . '" method="post" target="_top">
        <input type="hidden" name="merchant_key" value="">
        <input type="hidden" name="success_url" value="">
        <input type="hidden" name="cancelled_url" value="">
        <input type="hidden" name="deferred_url" value="">
        <input type="hidden" name="invoice_id" value="">
        <input type="hidden" name="total" value="">
        <div class="btn-submit-payment" style="display: none;">
            <button type="submit" id="submit-form"></button>
        </div>
    </form>';
}