结账页正常加载地址和运费,进入付款步骤却没有任何选项,或只显示 No Payment Methods。支付方式不是简单的“启用/禁用”开关:Magento 会结合当前 store、国家、币种、订单总额、客户组、配送方式和支付模块自身验证逐个筛选。

先看 payment-information 之前的接口

在 Network 中找到 payment-methods 或 shipping-information 响应。若接口 500,页面空白只是前端结果;先查响应 message、exception.log 和支付模块日志。若返回 200 且数组为空,说明所有 method 都被业务条件排除。

配置范围最容易看错

在 Stores → Configuration 切到发生问题的 Website/Store View,检查 method enabled、适用国家、最小/最大订单金额、允许币种和 sort order。默认范围显示启用,不代表子范围没有覆盖。保存后确认配置缓存已刷新。

bin/magento config:show payment
bin/magento cache:clean config

完整 payment 配置可能包含敏感商户参数,不要把命令输出原样发到工单或文章;只检查必要键并脱敏。

用 Quote 数据还原筛选条件

记录 quote 的 store_id、base_currency_code、quote_currency_code、grand_total、billing/shipping country 和 customer_group_id。优惠把总额降到零后,某些网关会隐藏而 Zero Subtotal Checkout 应接管;虚拟商品没有配送地址,依赖 shipping country 的自定义验证也可能误判。

第三方模块可能在 isAvailable 中失败

支付模块常在可用性检查时访问 API、读取 vault token 或验证地区。网络超时若被捕获后直接返回 false,前端只会看到方法消失。为每个 method 记录“被哪个条件排除”,比只记录最终空数组更容易维护,但日志不能包含卡号、token 或完整客户地址。

验证矩阵

分别测试访客/登录客户、国内/国外地址、零元/正常/超限金额、默认/外币、实体/虚拟商品。修复后应只有不满足条件的方法隐藏,至少一个合法方式可用;不能通过删除所有限制让原本不支持的交易进入网关。

支付方法排序与前端状态

接口已经返回 method,但 Knockout 组件注册失败、method code 与 renderer 映射不一致时,界面仍为空。检查 renderer-list、RequireJS 错误和自定义 checkout mixin;不要在 Console 里手工推入一个 method 后就判定后端正常,因为真实提交还需要 payment data 与 additional_data。

生产排查的安全边界

支付配置可能含 merchant ID、签名密钥和网关 URL。日志只保留 method code、可用性条件和脱敏 request ID,不能记录卡号、CVV、完整 token。若某方式只在生产消失,在网关沙箱复现同一金额/地区,并确认生产账号能力与币种已开通。

最后还要完成一次真实测试支付、失败支付和返回结账页,确认方法不仅出现,而且订单、transaction 与状态都正确。

从一次失败请求建立证据链

保留测试 quote ID、store、customer group、币种、金额和地址国家,再按同一组条件复现。配置截图只能说明“现在看起来启用”,不能说明请求当时通过了所有检查。若启用了配置分离或环境变量覆盖,还要确认运行节点读到的最终值一致。