支付网关显示成功,后台订单也已生成,但用户回到checkout/onepage/success只看到空白提示,模板里的订单号为空。成功页读取的是checkout session中的last_real_order_id,不是重新按客户查询订单;回跳时session换了,就拿不到。

先用请求链确认Cookie有没有变

浏览器Network保留日志,从离站前、网关回跳到成功页逐个比较Cookie头与Set-Cookie。重点看域名、Secure、SameSite、Path和session ID。跨站POST回跳通常需要合适的SameSite策略与HTTPS。

bin/magento config:show web/cookie/cookie_domain
bin/magento config:show web/cookie/cookie_path
bin/magento config:show web/secure/use_in_frontend
grep -n "session" app/etc/env.php

多节点环境的快速判断

在响应头临时加入节点ID(不要暴露内部IP),看下单和成功页是否落在不同节点。若Session存在本机文件系统,换节点就丢失。改用所有Web节点共享的Redis session,统一crypt key和Cookie配置;仅靠负载均衡粘性会话不是长期解法。

Session没丢,但last order被清了

搜索自定义支付Controller和success Observer里对 clearQuote()、setLastRealOrderId(null)、session regenerate的调用。清购物车可以做,但不要在重定向成功页读取前清掉last order数据。

不要用不安全的补丁

不要在成功页用URL参数传increment_id后直接显示,也不要按“当前客户最后一单”查询;并发下单或共享设备会显示错误订单。正确做法是保留受Session保护的订单引用,或使用支付模块签名状态映射回正确订单。

回归清单

  • 站内支付与离站支付;
  • GET和POST两种回跳;
  • Safari、Chrome无痕模式;
  • 游客和登录客户;
  • 两台Web节点交叉;
  • 支付成功后重复刷新成功页,不泄露订单信息。