支付网关显示成功,后台订单也已生成,但用户回到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节点交叉;
- 支付成功后重复刷新成功页,不泄露订单信息。

