PWA 请求带 Content-Currency: EUR,GraphQL 仍返回 USD,或 currency 字段变了但金额未换算。币种必须在目标 Store 允许范围内并有汇率;代理/CDN 若不按相关 Header 隔离缓存,还会把一种币种响应复用给另一种。
固定复现条件
保存 query、Store Header、Content-Currency、响应 currency 与金额,不记录客户 Token。分别绕过 CDN 请求源站,并测试公开价格与登录客户价格。
curl -sS -H 'Content-Type: application/json' -H 'Store: default' -H 'Content-Currency: EUR' --data '{"query":"{storeConfig{base_currency_code default_display_currency_code} products(search:"SKU"){items{sku price_range{minimum_price{final_price{value currency}}}}}}"}' https://shop.example.com/graphql
php bin/magento config:show currency/options/allow --scope=stores --scope-code=default
SELECT * FROM directory_currency_rate WHERE currency_from='USD' AND currency_to='EUR';
根据证据定位
币种未允许或汇率缺失时 Magento 会回退;Store Header 错误会读取另一站点配置;源站正确而 CDN 错误,检查缓存键是否包含 Store 与 Currency。自定义 Resolver 若直接返回 base price 也会忽略上下文。
修复与回滚
在正确 scope 配置允许币种与可信汇率更新,Resolver 使用 Magento 定价服务而非手工字段。公共 GraphQL 缓存必须按 Store、币种及身份正确隔离;客户专属响应不得共享。
验收
两个 Store、三种币种、访客和客户组交叉请求,currency 与金额一致;交替请求不能串币种,购物车与订单最终币种也要匹配。
生产环境操作前的检查
处理“Magento 2 GraphQL Currency Header 被忽略”前,先记录 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 重复验证。临时调试日志必须脱敏,确认错误率、响应时间和数据量稳定后及时关闭。

