You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

信用卡支付失败后woocommerce_cart_calculate_fees钩子不执行问题

问题根因

不触发的核心原因有两个:

  • 支付失败跳转回结账页时,页面默认不会主动触发woocommerce_cart_calculate_fees对应的购物车重算逻辑,只有正常结账页首次加载、支付方式切换触发AJAX请求时才会执行钩子
  • 现有代码仅依赖会话中存储的chosen_payment_method,在支付失败回跳场景下,会话参数可能未及时同步,且切换支付方式的AJAX事件绑定可能在回跳后的页面上失效

修复方案

直接替换你现有代码为以下版本,额外增加了支付方式切换的强制重算、支付失败回跳页的初始化重算逻辑:

// 基础手续费添加逻辑
add_action( 'woocommerce_cart_calculate_fees', 'custom_handling_fee' );
function custom_handling_fee ( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    $chosen_payment_id = WC()->session->get('chosen_payment_method');

    if ( empty( $chosen_payment_id ) )
        return;

    // SETTINGS: Here set in the array the (payment Id) / (fee cost) pairs
    $targeted_payment_ids = array(
        'cod' => 1.5 // Fixed fee
    );

    // Loop through defined payment Ids array
    foreach ( $targeted_payment_ids as $payment_id => $fee_cost ) {
        if ( $chosen_payment_id === $payment_id ) {
            $cart->add_fee( __('Fee', 'woocommerce'), $fee_cost, false );
        }
    }
}

// 新增:支付方式切换时强制刷新购物车,确保手续费重新计算
add_action( 'wp_footer', 'trigger_refresh_on_payment_switch' );
function trigger_refresh_on_payment_switch() {
    if ( is_checkout() && ! is_wc_endpoint_url( 'order-received' ) ) :
    ?>
    <script type="text/javascript">
        jQuery(document).ready(function($){
            // 绑定支付方式切换事件,触发更新
            $('form.checkout').on('change', 'input[name="payment_method"]', function(){
                $(document.body).trigger('update_checkout');
            });
            // 页面加载时强制触发一次更新,解决支付失败回跳场景不重算的问题
            $(document.body).trigger('update_checkout');
        });
    </script>
    <?php
    endif;
}

// 新增:支付失败回跳时强制刷新会话中的支付方式参数
add_action( 'woocommerce_before_checkout_form', 'reset_payment_method_on_failed_pay_return' );
function reset_payment_method_on_failed_pay_return() {
    if ( isset($_GET['pay_for_order']) && isset($_GET['order_id']) ) {
        $order = wc_get_order( absint($_GET['order_id']) );
        if ( $order && $order->get_status() === 'failed' ) {
            WC()->session->set( 'chosen_payment_method', $order->get_payment_method() );
        }
    }
}

修复逻辑说明

  • 新增的页脚JS逻辑,在结账页加载时强制触发一次checkout更新,不管是正常进入还是支付失败回跳进入,都会主动触发手续费计算
  • 强制绑定支付方式切换的更新事件,避免回跳页面事件绑定失效导致切换支付方式不重算的问题
  • 新增支付失败回跳时的支付方式参数重置逻辑,确保会话中存储的支付方式和当前订单实际选中的支付方式一致

内容的提问来源于stack exchange,提问作者Tasos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:36:06