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响应。用两辆不同购物车交叉请求,确认不会拿到另一辆车的方法列表。