Magento 2 货币切换器改变了 URL 或选择框,但商品价格仍是原币种时,先区分“币种符号没变”和“符号变了但金额没换算”。前者多半是会话、Cookie 或全页缓存问题,后者更接近汇率或自定义价格渲染问题。
建立四格测试
| 场景 | 要记录的结果 |
|---|---|
| 访客、网站 A、默认币种 | Cookie、符号、金额 |
| 访客、网站 A、第二币种 | 切换响应与页面缓存头 |
| 登录客户、网站 A | 是否跟随客户 Session |
| 同浏览器、网站 B | Cookie Path/Domain 是否串站 |
在无痕窗口执行,避免旧 currency Cookie 干扰。Network 中找到切换请求,确认响应是否 Set-Cookie,以及后续商品页请求是否带上新值。
检查网站允许币种与基础币种
php bin/magento config:show currency/options/base
php bin/magento config:show currency/options/default
php bin/magento config:show currency/options/allow
php bin/magento config:show catalog/price/scope
CLI 默认读取范围可能不是问题网站,后台切换 Website Scope 再核对。网站基础币种与允许展示币种是两件事;Catalog Price Scope 为 Website 时,不同网站可以有独立基础价格。
验证汇率不是 0 或过期值
SELECT currency_from, currency_to, rate
FROM directory_currency_rate
ORDER BY currency_from, currency_to;
用一个固定价格商品手算期望金额,避免被税费或特殊价格干扰。若后台 Import Rates 报错,检查 Cron、汇率服务凭据和日志;不要把汇率默认为 1 作为长期修复。
全页缓存必须按币种区分
连续请求默认币种和第二币种页面并保存响应头:
curl -sSI -b 'currency=USD' https://shop.example.com/test-product.html
curl -sSI -b 'currency=EUR' https://shop.example.com/test-product.html
检查 X-Magento-Vary、Age 和缓存命中。若 CDN 忽略必要 Cookie,可能把第一位访客的币种页面缓存给所有人。CDN 规则应与 Magento/Varnish 设计一致,不要简单把所有 Cookie 加进缓存键导致命中率归零。
自定义前端是否绕过价格组件
grep -R --line-number --include='*.phtml' --include='*.js' \
-E 'getPrice\(|price-box|formatPrice|baseCurrency' app/design app/code 2>/dev/null
直接输出数据库 price 或在 JavaScript 写死货币符号,会绕过当前货币换算。可配置商品切换选项时还要确认 price-box 收到的是当前货币 JSON。
修复后用同一商品验证列表页、详情页、迷你购物车、购物车和结账;再切回原币种,确保金额不会二次换算。订单中保存的 order_currency_code 和 base_currency_code 也必须符合预期。

