客户已扣款,后台订单也在 Processing,但支付平台回跳后只看到空白成功页,没有订单号。刷新不会恢复。

这不是“再创建一次订单”的场景

先用支付交易号确认订单已经存在。成功页通常从 Checkout Session 读取 last quote/order 信息;信息丢了,页面不能展示,不代表应该重新 submit quote。

按回跳时间线查

  1. place order 后是否设置 last order ID;
  2. 跳到支付域名前 Session Cookie 的 Domain、SameSite、Secure 是否允许返回;
  3. return controller 是否提前 clearQuote 或清整个 checkout session;
  4. webhook 与浏览器 return 是否竞争修改状态;
  5. 自定义成功页 Block 是否从错误 session key 取值。

我会对比正常支付方式与问题支付方式的 Cookie 和重定向链。若只在跨域支付失败,优先查 SameSite/Secure 与 HTTPS 终止;若同域模拟也失败,就读支付模块 return action。

# 日志只记录哈希后的session标识、quote_id、order_id与request_id
place_order  quote=812 order=1042 session=ab12...
return       quote=?   order=?    session=cd34...

两段 session 标识不同,说明回跳没有带回原会话。标识相同但 order 为空,则是应用过早清理。

修复时让 webhook 负责幂等更新支付状态,让 return 只负责用户体验;成功页只读取已创建订单,不执行二次业务。验收覆盖成功、取消、浏览器关闭后仅 webhook 到达、return 与 webhook 乱序四种情况。每个支付交易只能对应一张订单。