PAYATHON 2026

如何在新支付系统中定义 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。如果需要支持多币种定价,应事先确定每种币种的实际售价,并分别保存。

建议的排查步骤

  1. 查看固定价格配置中的币种代码,确认是 USD 还是 GBP。
  2. 检查创建订单、支付会话或 Payment Intent 时提交的币种。
  3. 确认金额、订单、价格 ID 和结算币种使用的是同一套配置。
  4. 如果需要收取 GBP,确认商户账户和所用支付方式都支持该币种。
  5. 查看支付接口返回的原始错误码和服务端日志,不要只看结账页面上的通用提示。
  6. 如果希望由支付渠道换汇,应保持交易币种为 USD,同时确认付款人的支付方式支持外币交易。

注意事项

API 中应使用标准币种代码,美元为 USD,英镑为 GBP。不要把 sterling、£ 或其他展示文本作为币种值提交。

具体字段名称以及价格创建后是否允许修改,取决于所使用的支付平台。许多支付系统不允许更改已有固定价格的币种。遇到这种情况,应新建一个 GBP 价格,而不是修改原来的 USD 价格。

备注:内容仅供参考。