关于 multi-currency
这项技能介绍如何在 Shopify、WooCommerce、BigCommerce 和无头店面配置本地货币展示与支付,涵盖平台设置及自定义实现中的汇率、货币选择和支付处理。
主要功能
- 01平台专属配置指南
- 02汇率设置
- 03货币选择器配置
- 04多币种支付处理
- 05货币行为验证
适用场景
- 01面向国际市场推出店铺
- 02为店面添加货币选择器
- 03核对展示价格与实际扣款
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ finsilabs/ awesome-ecommerce-skills --skill multi-currency安装后在 Claude Code 中输入/multi-currency确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
tile.jsonevals/currency-config-and-formatting/criteria.jsontask.mdevals/currency-detection-and-stripe-integratio/criteria.jsontask.mdevals/exchange-rate-caching-and-price-rounding/criteria.jsontask.md详细介绍
多币种
概述
多币种支持让国际购物者可以用当地货币浏览商品并付款,而不是使用商店的基础货币。在 Shopify、WooCommerce 和 BigCommerce 上,这是一项配置任务——各个平台都提供内置解决方案或基于应用的解决方案,可自动处理汇率、价格显示和付款结算。只有无头 storefront 才需要编写自定义代码。
何时使用此技能
- 拓展国际市场时,购物者通常希望以当地货币查看价格
- 数据分析显示,来自非基础货币国家/地区的流量占比较高,但转化率较低
- 在网站页眉中添加货币选择器时
- 集成 Stripe 或 PayPal 多币种结算时
核心说明
第 1 步:确定平台和多币种方案
| 平台 | 推荐方案 | 结算货币 |
|---|---|---|
| Shopify(Shopify Payments) | 在 Shopify Admin 中启用 Markets 和多币种 | Stripe/Shopify 使用你的提现货币结算;自动完成货币转换 |
| Shopify + 非 Shopify 支付网关 | 安装 BEST Currency Converter 或 MLV Auto Currency Switcher 应用 | 仅转换显示的金额;付款以基础货币收取 |
| WooCommerce | 安装 WooCommerce Payments(原生多币种)或 WPML + WooCommerce Multilingual | WooCommerce Payments 使用当地货币结算;其他支付网关可能会进行转换 |
| BigCommerce | 在 Store Settings 中启用 Multi-Currency;使用 Stripe 进行多币种结算 | BigCommerce 负责显示货币;Stripe 使用客户的货币结算 |
| 自定义 / 无头 | 使用 Stripe 的多币种 payment intents;从 OpenExchangeRates 获取汇率 | Stripe 可接受任何货币的付款,并使用你配置的货币结算 |
第 2 步:在平台上设置多币种
Shopify
Shopify 的 Markets 功能是实现多币种的推荐方式:
- 前往 Settings → Markets
- 点击 Add market,为每个地区添加市场(例如欧洲、英国、澳大利亚)
- 在每个市场下,前往 Currencies 并启用当地货币(EUR、GBP、AUD)
- Shopify 会根据每日汇率自动换算价格
- 如需为特定货币设置手动价格覆盖(例如,将 EUR 价格设为固定的 €99,而不是将 $99.00 换算为 EUR),请前往对应市场并点击 Manage,为各商品设置对应货币的价格
汇率处理:
- 默认情况下,Shopify 使用每日更新的自动汇率
- 如需在汇率中加入差价(以覆盖你的外汇成本),请前往 Settings → Markets → [Market] → Currencies,设置货币转换汇率调整幅度(例如 +2%)
Storefront 中的货币选择器: OS 2.0 的 Shopify 主题(Dawn、Crave 等)内置了货币/国家或地区选择器。在 Online Store → Themes → Customize 中,添加 Header → Country/Region selector 区块。
付款结算: 使用 Shopify Payments 时,付款会以客户的货币收取。Shopify 会处理货币转换,并以默认提现货币向你的银行账户付款。对于 Shopify Plus,你可以配置多币种付款,并为每种货币分别设置银行账户。
WooCommerce
选项 A:WooCommerce Payments(原生多币种)
- 安装并启用 WooCommerce Payments(由 Stripe 提供支持)
- 前往 WooCommerce → Settings → WooCommerce Payments → Multi-currency
- 点击 Add currencies,选择要提供的币种
- 为每种币种配置:汇率来源(使用 WooCommerce 每日汇率数据自动更新或手动设置)、取整规则(例如,取整到 .99),以及是否收取汇率转换加价
- 启用 Currency switcher widget:前往 Appearance → Widgets,并将 Currency Switcher 小组件添加到页眉或侧边栏
选项 B:WooCommerce Multilingual + WPML
- 安装 WPML 和 WooCommerce Multilingual & Multicurrency
- 前往 WPML → WooCommerce Multilingual → Currencies 并添加币种
- 为每种币种设置汇率(手动设置或通过自动更新)和取整规则
- 每种币种的商品价格可以逐个商品手动设置,也可以自动转换
选项 C:Currency Switcher for WooCommerce(免费插件)
如需仅切换显示币种(付款仍以基础币种结算),请安装 Aelia 开发的 Currency Switcher for WooCommerce。该插件会转换显示的价格,但仍以基础币种结算——这种方式更简单,但需要让客户了解他们将以 USD(或你的基础币种)付款。
BigCommerce
- 前往 Settings → Store Setup → Currencies
- 点击 Add a currency,并从下拉列表中选择币种
- 为每种币种配置:
- 汇率:手动设置,或通过 BigCommerce 的汇率数据源自动更新
- 取整规则:取整到最接近的 0.99、0.95 或整数
- 显示设置:设置币种选择器的显示位置
- 将一种币种设为 Default——该币种用于报表,并作为后备币种
- 启用币种选择器:前往 Storefront → My Themes → Customize,并将币种选择器组件添加到页眉
使用 BigCommerce 结算付款: 配置支付网关,以接受多种币种的付款。Stripe(在 Settings → Payments → Stripe 下配置)支持以客户使用的币种收款,并自动以你的币种结算。
自定义 / 无头架构
获取汇率:
// Fetch and cache daily exchange rates from OpenExchangeRates (free tier available)
async function getExchangeRates() {
const cached = await redis.get('exchange_rates');
if (cached) return JSON.parse(cached);
const res = await fetch(
`https://openexchangerates.org/api/latest.json?app_id=${process.env.OER_API_KEY}&base=USD&symbols=EUR,GBP,CAD,AUD,JPY`
);
const { rates } = await res.json();
// Cache for 24 hours — daily rates are sufficient for display prices
await redis.setex('exchange_rates', 86400, JSON.stringify(rates));
return rates;
}
async function convertPrice(amountUSD, targetCurrency) {
if (targetCurrency === 'USD') return amountUSD;
const rates = await getExchangeRates();
return amountUSD * rates[targetCurrency];
}
Stripe 多币种扣款:
// Charge in customer's currency — Stripe handles conversion and settles in your payout currency
const paymentIntent = await stripe.paymentIntents.create({
amount: Math.round(displayPrice * 100), // Amount in smallest unit (EUR cents, JPY yen)
currency: customerCurrency.toLowerCase(), // 'eur', 'gbp', 'jpy'
automatic_payment_methods: { enabled: true },
metadata: { order_id: orderId, base_currency_amount: String(basePriceUSD) },
});
// Note: for JPY and other zero-decimal currencies, multiply by 1 (not 100)
const jpy_amount = Math.round(jpyPrice); // ¥3,000 → 3000, not 300000
从浏览器检测币种:
// Detect preferred currency from browser language or IP country header
function detectCurrency(req) {
// Check explicit user preference first
if (req.cookies.preferred_currency) return req.cookies.preferred_currency;
// Cloudflare and similar CDNs provide the visitor's country
const country = req.headers['cf-ipcountry'];
const countryToCurrency = { US:'USD', GB:'GBP', DE:'EUR', FR:'EUR', AU:'AUD', JP:'JPY', CA:'CAD' };
return countryToCurrency[country] ?? 'USD';
}
第 3 步:验证行为是否正确
上线前测试以下情形:
- 价格显示正确:通过英国 IP 的 VPN 访问——价格应以 GBP 显示
- JPY 不显示小数位:日本价格应显示为整数(¥3,000,而不是 ¥30.00)
- 付款金额与显示价格一致:Stripe 扣款金额必须与页面显示的金额一致
- 币种选择器设置会保留:切换币种后,在浏览不同页面时仍应保留所选币种
- 购物车总额使用正确币种:购物车和结账页面应使用所选币种
最佳实践
- 使用平台原生的多币种功能——Shopify Markets、WooCommerce Payments 和 BigCommerce 内置功能都能正确处理汇率、取整和价格显示
- 每日更新汇率——对于显示价格,每日汇率已足够;不要在每次加载页面时都获取汇率
- 以基础币种存储订单金额——为确保报表一致,始终在数据库中以基础币种记录价格;同时存储显示币种和所用汇率,以供参考
- 针对不同市场应用相应的取整规则——€9.99 看起来很自然;€9.847 则不然;请在平台的币种设置中配置取整规则
- 专门测试 JPY——JPY 不设小数位;常见错误是显示为 ¥29.99,而不是 ¥3,000;请将测试币种设为 JPY 进行验证
常见问题
| 问题 | 解决方案 |
|---|---|
| 页面加载时,价格闪现为基础货币 | 在服务器端(从 Cookie 中)读取用户的货币偏好,并在首次加载时以正确的货币渲染;避免仅在客户端切换货币 |
| 将 JPY 金额以分为单位传给 Stripe | 对于零小数位货币(JPY、KRW),传入整数金额——¥3,000 → amount: 3000,而不是 amount: 300000 |
| 支付金额与显示的价格不符 | 在结账时,使用存储的汇率在服务器端重新计算支付金额;切勿信任客户端提交的金额 |
| 缺少某种货币的汇率 | 默认使用基础货币或显示错误;不要默默使用零汇率,否则商品会变成免费 |
| Shopify 显示了某种货币,但结账时不接受 | 除了 Settings → Markets,还必须在 Settings → Payments → Supported currencies 中启用该货币;这两项都必须配置 |
相关技能
- @checkout-flow-optimization
- @tax-calculation
- @stripe-integration
- @paypal-integration