结帐页面中的 Woocommerce 付款方式检测

Posted

技术标签:

【中文标题】结帐页面中的 Woocommerce 付款方式检测【英文标题】:Woocommerce Payment Method Detection in Checkout Page 【发布时间】:2017-08-13 07:02:09 【问题描述】:

我正在使用 woocommerce 插件和 woocommerce 的 Braintree 扩展进行付款。我已启用 woocommerce Braintree 的卡和贝宝付款来结帐。我试图弄清楚在用户实际结账和付款之前如何知道用户选择了哪个支付网关。 woocommercebraintree 下的任何 hooks 用于查找信用卡单选按钮或 paypal 付款单选按钮都会检查是否付款。

但是我知道我们可以在成功付款后检测用于特定订单的网关,但我希望在结帐页面内完成付款之前选择网关信息。有什么帮助吗?

【问题讨论】:

【参考方案1】:

您可以使用结帐页面上的一些基本 javascript 检测所选的付款方式,并通过挂钩到 woocommerce_checkout_update_order_review 操作使用 php 运行您的自定义代码。

首先, 您还应该将 JS 代码放在结帐页面、结帐模板或主题的页眉/页脚中,以便您可以检测用户何时更改了付款方式选项并在此之后运行您自己的代码。

JS代码:

jQuery(document).ready( function() 

    jQuery( "#payment_method_bacs" ).on( "click", function() 
        jQuery( 'body' ).trigger( 'update_checkout' );
    );

    jQuery( "#payment_method_paypal" ).on( "click", function() 
        jQuery(document.body).trigger("update_checkout");
    );

    jQuery( "#payment_method_stripe" ).on( "click", function() 
        jQuery(document.body).trigger("update_checkout");
    );

);

请注意,对于您启用的每种付款方式,您都应该添加“点击”事件。它使您可以选择在触发自定义代码时进行微调。 为了防止点击事件只运行一次,你应该在第一个下面添加下一个 JS 代码块。

jQuery( document ).ajaxStop(function() 

    jQuery( "#payment_method_bacs" ).on( "click", function() 
        jQuery(document.body).trigger("update_checkout");
    );

    jQuery( "#payment_method_paypal" ).on( "click", function() 
        jQuery(document.body).trigger("update_checkout");
    );

    jQuery( "#payment_method_stripe" ).on( "click", function() 
        jQuery(document.body).trigger("update_checkout");
    );
);

这只是在 ajax 之后触发的相同代码。 在这两个 JS 代码块中添加您您实际使用的付款选项

之后,您将挂钩到结帐的自定义 PHP 代码如下所示:

if ( ! function_exists( 'name_of_your_function' ) ) :
    function name_of_your_function( $posted_data) 

        // Your code goes here

     

endif;

add_action('woocommerce_checkout_update_order_review', 'name_of_your_function');

这段代码可以放在functions.php中。

这是在结帐页面上选择特定付款选项时检测并运行的完整 PHP 代码:

function name_of_your_function( $posted_data) 

    global $woocommerce;

    // Parsing posted data on checkout
    $post = array();
    $vars = explode('&', $posted_data);
    foreach ($vars as $k => $value)
        $v = explode('=', urldecode($value));
        $post[$v[0]] = $v[1];
    

    // Here we collect payment method
    $payment_method = $post['payment_method'];

    // Run code custom code for each specific payment option selected
    if ($payment_method == "paypal") 
        // Your code goes here
    

    elseif ($payment_method == "bacs") 
        // Your code goes here
    

    elseif ($payment_method == "stripe") 
        // Your code goes here
    


add_action('woocommerce_checkout_update_order_review', 'name_of_your_function');

我希望这会有所帮助! 这是在结帐页面上运行所有自定义逻辑的非常强大的选项!

【讨论】:

您的代码运行良好!但是当邮政编码更改时,ajax 不会停止运行。 @MarcoMireles 谢谢。默认情况下,结帐字段更新后脚本循环的问题与此功能无关。我多次碰到这个问题,它与 AJAX 响应有关。查看官方文档:docs.woocommerce.com/document/…

以上是关于结帐页面中的 Woocommerce 付款方式检测的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 Woocommerce 在结帐页面上选择默认付款方式?

自定义 Wordpress WooCommerce 结帐页面和付款处理方式

根据 Woocommerce 选择的付款方式更改结帐时的付款按钮

更改 Woocommerce 中的结帐订单审查部分

php WooCommerce:在结帐页面禁用付款

根据 Woocommerce 选择的付款方式,在结帐时更改带有图像的付款按钮