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

WooCommerce支付失败后如何创建同详情的新订单?

解决WooCommerce支付失败后创建新订单的问题

核心思路

支付失败后,WooCommerce会把订单ID存在会话中,导致用户刷新结账页时仍会加载该失败订单。我们需要清除会话中的失败订单ID,并重置结账流程,让用户重新生成新订单;同时可将失败订单标记为取消,避免发票插件重复生成票据。

适用钩子与代码实现

放弃你之前尝试的钩子,改用woocommerce_payment_failed(支付失败时WooCommerce核心触发的钩子,兼容Ajax/非Ajax支付场景),搭配页面重定向逻辑处理:

1. 支付失败时重置会话与订单状态

add_action('woocommerce_payment_failed', 'reset_checkout_on_payment_failure', 10, 2);
function reset_checkout_on_payment_failure($order_id, $order) {
    // 清除会话中绑定的失败订单ID,强制后续结账生成新订单
    WC()->session->__unset('_woocommerce_order_id');
    
    // 将失败订单标记为「已取消」,避免发票插件生成无效票据
    $order->update_status('cancelled', '支付失败,用户将创建新订单重新结账');
    
    // 可选:如果购物车内容被意外清空,重新同步失败订单的商品到购物车
    // WC()->cart->empty_cart();
    // foreach ($order->get_items() as $item) {
    //     WC()->cart->add_to_cart(
    //         $item->get_product_id(),
    //         $item->get_quantity(),
    //         $item->get_variation_id(),
    //         $item->get_meta_data()
    //     );
    // }
}

2. 拦截失败订单的支付页访问

如果用户直接通过失败订单的支付链接(如/checkout/pay/123/)进入,自动重定向到结账页:

add_action('template_redirect', 'redirect_failed_order_to_checkout');
function redirect_failed_order_to_checkout() {
    if (is_checkout() && is_wc_endpoint_url('pay')) {
        $order_id = absint(get_query_var('order-pay'));
        $order = wc_get_order($order_id);
        
        if ($order && $order->has_status('failed')) {
            WC()->session->__unset('_woocommerce_order_id');
            wp_redirect(wc_get_checkout_url());
            exit;
        }
    }
}

为什么之前的钩子无效?

你尝试的woocommerce_checkout_order_processed是订单创建成功后触发,woocommerce_review_order_after_payment仅用于渲染结账页面内容,woocommerce_pay_order_before_submit是支付按钮提交前的钩子——这些都不对应「支付失败」的核心场景,因此无法解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:35:27