切换到 USD 时支付方式正常,换成 EUR 后整个选项消失,而且页面没有报错。这通常不是 Checkout 前端坏了,而是支付方式的 isAvailable() 在后端返回了 false。Magento 会把不可用的方法从接口结果中移除,所以浏览器只能看到“什么都没有”。
先确认系统正在判断哪一种币种
一张 Quote 至少涉及基础币种和展示/交易币种,支付模块还可能单独定义清算币种。记录问题 Quote 的以下字段:
SELECT entity_id, store_id, base_currency_code,
quote_currency_code, global_currency_code,
base_grand_total, grand_total
FROM quote
WHERE entity_id = :quote_id;
不要只看页面右上角显示的货币。某些网关按 quote_currency_code 判断,另一些旧模块误用了 base currency;也有模块允许前台显示多币种,但下单前强制转换成指定结算币种。
支付方式可用性是一串条件,不只有币种
当币种改变时,订单金额也会改变,进而触发最低/最高金额限制。Store View 变化还可能连带改变账单国家、客户组或配置作用域。为了不把相关条件误判成币种问题,我会做一个小矩阵:
| 测试 | 币种 | 国家 | 金额 | 结果 |
|---|---|---|---|---|
| A | USD | CN | 固定商品 | 记录 |
| B | EUR | CN | 同一商品 | 记录 |
| C | EUR | DE | 同一商品 | 记录 |
| D | EUR | DE | 调整到限制内 | 记录 |
只有币种变化会稳定改变结果,才继续追 supported currencies。
配置页面显示“全部币种”也不一定是真的
第三方网关常把支持列表写在代码、远端 Merchant 配置或 API 响应里,而不是 Magento 后台。还要检查 Default、Website 和 Store View 是否有覆盖值:
php bin/magento config:show payment/your_method/active --scope=stores --scope-code=de_de
php bin/magento config:show payment/your_method/min_order_total --scope=stores --scope-code=de_de
php bin/magento config:show payment/your_method/max_order_total --scope=stores --scope-code=de_de
grep -RniE "canUseForCurrency|isAvailable|supported.*currenc" app/code vendor/YourVendor
如果模块实现了 canUseForCurrency(),直接看它比较的是哪一个币种,以及配置空值代表“全部”还是“一个都不支持”。这类细节比清缓存更有价值。
用接口响应区分后端过滤与前端显示
检查获取支付方式的 REST/GraphQL 请求。响应里本来就没有该方法,问题在后端可用性判断;响应有方法但 UI 不显示,才去看 Knockout 组件、错误的 region、前端条件和 customer-data 缓存。这个分界可以省掉大量无效的浏览器调试。
修复后至少用两种浏览器会话、访客和登录客户各测一次,并完成到网关创建支付单的步骤。支付方式“重新出现”不等于修复完成;如果网关最终拒绝该币种,只是把错误从结账页推迟到了付款页。

