默认币种下支付方式正常,切到 EUR 或 CNY 后结账页不再显示。支付模块的 isAvailable 可能同时检查币种、国家、金额、客户组和网关账号;后台 Active 并不保证当前 Quote 可用。
固定复现条件
固定 Quote,记录 Store、base/quote currency、grand_total、账单国家、客户组与支付配置 scope。比较同一购物车仅切换币种后的 available payment methods 接口。
SELECT entity_id,store_id,base_currency_code,quote_currency_code,grand_total,base_grand_total,customer_group_id FROM quote WHERE entity_id=12345;
php bin/magento config:show payment/method_code/active --scope=stores --scope-code=store_code
php bin/magento config:show currency/options/allow --scope=stores --scope-code=store_code
grep -R --line-number 'canUseForCurrency|isAvailable' app/code vendor/*/*/Model/Method 2>/dev/null
grep -RniE 'currency|payment.*available' var/log | tail -n 80
根据证据定位
网关硬编码支持列表、Store 使用另一个商户账号、换算后金额越界或 Quote currency 未刷新都可能隐藏方式。接口已返回方式但页面不显示,则转向前端 renderer。
修复与回滚
在业务与网关都支持的范围内配置币种,使用当前 Quote currency 调用支付服务,并对不支持情况给出清晰替代方式。不能伪装币种发送给网关,否则对账与退款会失败。
验收
每种允许币种、边界金额、两个国家和客户组测试;下单、capture、退款的币种与金额在 Magento 和网关一致。
生产环境操作前的检查
处理“Magento 2 支付方式因币种不支持而消失”前,先记录 Magento 版本、部署模式、问题 Store View、复现时间和最近发布。所有 SQL 默认先执行 SELECT;写操作、目录清理、服务重启和配置切换必须确认范围、保留备份并准备回滚。多节点环境还要核对构建版本、app/etc/env.php 配置摘要和实际流量节点。
php bin/magento --version
php bin/magento deploy:mode:show
php bin/magento maintenance:status
php bin/magento indexer:status
php bin/magento cache:status
命令应由 Magento 文件所有者在项目根目录执行。不要在生产高峰同时运行全量索引、静态部署和数据修复;涉及客户、支付、税费、库存或订单的变更,应先在脱敏数据副本验证。
建立可比较的排查记录
每次实验只改变一个变量,记录操作前值、命令、开始与结束时间、结果和回滚方式。至少准备一个正常对象和一个异常对象;旧对象恢复而新对象仍能复现,说明根因尚未消除。
| 检查层 | 证据 | 通过标准 |
|---|---|---|
| 入口 | URL、状态码、请求 ID、节点 | 路由与协议一致 |
| 应用 | 异常堆栈、模块、作用域 | 无新异常且可重复 |
| 数据 | 主键、时间、关联行数 | 关系完整无重复副作用 |
| 业务 | 正常、失败与重试路径 | 最终状态一致 |
修复后的观察窗口
上线后至少观察一轮 Cron、队列和索引周期,并在两台节点、无痕浏览器与目标 Store View 重复验证。临时调试日志必须脱敏,确认错误率、响应时间和数据量稳定后及时关闭。

