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
相关产品推荐
相关产品推荐

