信用卡支付失败后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
相关产品推荐
相关产品推荐

