在Shopify第三方店铺开发场景中,currencies.js是平台内置的货币汇率脚本文件,包含全球主流货币的实时汇率数据,是店铺实现多货币切换功能的核心依赖。解析该文件时如果操作不当,不仅会导致汇率数据错误,还可能引入安全风险,因此需要遵循规范的解析流程。

解析前的安全准备
在获取和解析currencies.js之前,需要先做好基础安全配置,避免引入不可信的数据源。
- 仅从Shopify官方提供的CDN地址获取currencies.js文件,不要使用第三方镜像源,防止文件被篡改
- 确认获取文件的请求使用HTTPS协议,避免传输过程中数据被劫持修改
- 不要直接将currencies.js的内容通过
eval或者new Function方式执行,防止脚本注入攻击
安全解析的核心步骤
1. 获取文件内容
可以通过前端fetch或者后端HTTP请求获取currencies.js的内容,以下是前端安全获取示例:
// 安全获取currencies.js内容
async function fetchCurrencyScript() {
try {
const response = await fetch('https://cdn.shopify.com/s/javascripts/currencies.js');
if (!response.ok) {
throw new Error('获取汇率脚本失败,状态码:' + response.status);
}
const scriptContent = await response.text();
return scriptContent;
} catch (error) {
console.error('获取currencies.js出错:', error.message);
return null;
}
}
2. 提取汇率数据
currencies.js的内容通常是定义Shopify.Currencies对象的赋值语句,需要提取其中的汇率数据而非执行脚本。可以通过正则匹配的方式提取数据,避免执行脚本带来的风险。
// 从脚本内容中提取汇率数据
function extractCurrencyData(scriptContent) {
if (!scriptContent) return null;
// 匹配Shopify.Currencies对象的定义内容
const match = scriptContent.match(/Shopify.Currenciess*=s*({[sS]*})/);
if (!match || !match[1]) {
throw new Error('未找到有效的汇率数据格式');
}
try {
// 使用JSON.parse解析提取的对象字符串,避免使用eval
const currencyData = JSON.parse(match[1]);
return currencyData;
} catch (error) {
throw new Error('汇率数据解析失败,格式异常');
}
}
3. 数据校验
提取到汇率数据后,需要校验数据的合法性,避免错误数据被使用。
- 校验数据是否为对象类型,且包含预期的货币代码键值对
- 校验每个汇率值是否为大于0的数字类型
- 校验是否包含店铺支持的货币类型,缺失的货币需要设置默认汇率或者提示更新
// 校验汇率数据合法性
function validateCurrencyData(currencyData, supportedCurrencies) {
if (typeof currencyData !== 'object' || currencyData === null) {
return false;
}
for (const currencyCode of supportedCurrencies) {
const rate = currencyData[currencyCode];
if (typeof rate !== 'number' || rate <= 0) {
console.warn('货币' + currencyCode + '的汇率数据异常');
return false;
}
}
return true;
}
4. 应用汇率数据
校验通过的汇率数据可以用于店铺的货币转换计算,以下是简单的转换示例:
// 货币转换计算
function convertCurrency(amount, fromCurrency, toCurrency, currencyData) {
if (!currencyData[fromCurrency] || !currencyData[toCurrency]) {
throw new Error('不支持的货币类型');
}
// 先转换为基准货币(通常是USD)再转换为目标货币
const baseAmount = amount / currencyData[fromCurrency];
const result = baseAmount * currencyData[toCurrency];
// 保留两位小数
return Math.round(result * 100) / 100;
}
常见风险规避
永远不要信任currencies.js的内容,即使是从官方源获取,也需要做完整的校验,防止CDN被劫持或者文件版本异常带来的问题。
另外需要注意,currencies.js的汇率更新频率是固定的,不要假设汇率是实时最新的,如果需要更高精度的汇率,可以结合Shopify的Admin API获取官方最新的汇率数据做二次校验。
完整解析流程示例
// 完整的安全解析流程
async function safeParseCurrenciesJs(supportedCurrencies) {
// 1. 获取脚本内容
const scriptContent = await fetchCurrencyScript();
if (!scriptContent) return null;
// 2. 提取汇率数据
let currencyData;
try {
currencyData = extractCurrencyData(scriptContent);
} catch (error) {
console.error('提取汇率数据失败:', error.message);
return null;
}
// 3. 校验数据
if (!validateCurrencyData(currencyData, supportedCurrencies)) {
console.error('汇率数据校验不通过');
return null;
}
return currencyData;
}
// 使用示例:解析店铺支持的USD、EUR、GBP三种货币的汇率
safeParseCurrenciesJs(['USD', 'EUR', 'GBP']).then(data => {
if (data) {
console.log('解析成功的汇率数据:', data);
// 计算100美元转欧元的金额
const eurAmount = convertCurrency(100, 'USD', 'EUR', data);
console.log('100美元等于' + eurAmount + '欧元');
}
});
Shopifycurrencies.js货币汇率解析JavaScript安全解析修改时间:2026-07-20 15:18:30