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 也必须符合预期。