如何在新支付系统中定义 static pricing 并完成支付?
结论
static pricing 通常指“固定金额 + 固定币种”。如果价格以 USD 定义,创建和确认支付请求时也必须使用 USD。不能只在结账时把支付币种改为英镑 GBP,否则价格配置、订单金额与支付请求的币种会不一致,支付系统可能拒绝交易并返回通用错误。
可采用以下两种方式:
- 始终以
USD发起支付。在支付渠道支持的情况下,由支付渠道或发卡行完成货币换算。 - 单独创建一个
GBP固定价格,用户选择英镑付款时使用对应的价格 ID。
出错原因
USD 和 GBP 是两种不同的结算币种。固定价格的配置通常类似:
{
"amount": 1000,
"currency": "USD"
}
这里的 amount 一般以最小货币单位表示,因此 1000 代表 10.00 USD。是否采用最小货币单位,应以当前支付系统的 API 文档为准。
如果创建订单时提交的是:
{
"price_id": "price_usd_001",
"currency": "GBP"
}
配置就会发生冲突。price_usd_001 定义的是美元价格,订单却要求以英镑结算。部分系统会明确返回 currency mismatch 错误,另一些系统可能只显示:
Sorry, there was a problem and we can’t complete your request. Please try again later.
这条提示不一定表示服务暂时不可用。币种、金额或支付方式配置不一致,也可能触发这类通用错误。
方案一:保持美元定价
如果商品只需要一个美元价格,整个支付流程都应使用 USD:
{
"price_id": "price_usd_001",
"currency": "USD"
}
付款人可以使用英镑账户或英镑银行卡,前提是支付渠道支持跨币种付款。换汇一般由支付渠道、银行卡组织或发卡行处理,付款人最终可能会看到以英镑计算的扣款金额,以及对应的汇率或手续费。
不要根据付款人的本地币种,直接修改已经定义好的价格币种。
方案二:为 GBP 单独创建固定价格
如果页面需要直接展示并收取英镑,应单独创建 GBP 价格。例如:
{
"product_id": "product_001",
"amount": 800,
"currency": "GBP"
}
然后根据用户选择的币种调用相应的价格:
const priceIds = {
USD: "price_usd_001",
GBP: "price_gbp_001"
};
const currency = userSelectedCurrency;
const paymentRequest = {
price_id: priceIds[currency],
currency
};
服务端也应检查价格币种与订单币种是否一致:
if (price.currency !== order.currency) {
throw new Error("Price currency does not match order currency");
}
不能直接把 10 USD 视为 10 GBP。如果需要支持多币种定价,应事先确定每种币种的实际售价,并分别保存。
建议的排查步骤
- 查看固定价格配置中的币种代码,确认是
USD还是GBP。 - 检查创建订单、支付会话或 Payment Intent 时提交的币种。
- 确认金额、订单、价格 ID 和结算币种使用的是同一套配置。
- 如果需要收取
GBP,确认商户账户和所用支付方式都支持该币种。 - 查看支付接口返回的原始错误码和服务端日志,不要只看结账页面上的通用提示。
- 如果希望由支付渠道换汇,应保持交易币种为
USD,同时确认付款人的支付方式支持外币交易。
注意事项
API 中应使用标准币种代码,美元为 USD,英镑为 GBP。不要把 sterling、£ 或其他展示文本作为币种值提交。
具体字段名称以及价格创建后是否允许修改,取决于所使用的支付平台。许多支付系统不允许更改已有固定价格的币种。遇到这种情况,应新建一个 GBP 价格,而不是修改原来的 USD 价格。
备注:内容仅供参考。
