PWA能查到cart和items,但 available_payment_methods是null或空数组,后台支付方式明明已启用。这个字段会基于当前quote逐个执行可用性检查,地址未完整、币种不支持或某个Totals插件抛异常,都可能让结果消失。
用最小查询固定复现场景
query {
cart(cart_id: "MASKED_ID") {
email
billing_address { country { code } postcode }
shipping_addresses { country { code } postcode selected_shipping_method { carrier_code method_code } }
prices { grand_total { value currency } }
available_payment_methods { code title }
}
}
先补齐游客邮箱、shipping address、shipping method和billing address,再查支付方式。很多支付模块在quote尚无billing country或grand total未计算时会返回不可用。
同时盯三处
tail -f var/log/exception.log var/log/system.log var/log/debug.log bin/magento config:show payment/<method_code>/active bin/magento config:show payment/<method_code>/allowspecific
打开开发者模式的测试环境可以看到GraphQL errors中的category与debugMessage。生产环境不要为了看堆栈暴露developer mode,改用请求ID关联服务器日志。
有一个坏模块会不会拖垮全部方法?
会。第三方支付的 isAvailable()、country validator或total collector若直接抛异常,Resolver可能无法返回正常列表。逐个禁用可疑支付模块做二分定位;找到后让可用性检查对预期业务条件返回false,只对真正的系统故障记录异常。
修复后的验证矩阵
- 游客与登录客户;
- 有配送和纯虚拟购物车;
- 零金额订单与普通金额;
- 每个Website默认币种;
- 国内和国外地址;
- 应用优惠码前后。
还要检查GraphQL响应缓存。available_payment_methods属于购物车私有数据,CDN和反向代理不能按URL缓存POST响应。用两辆不同购物车交叉请求,确认不会拿到另一辆车的方法列表。

