PAYATHON 2026

Amazon FPS 支付完成后如何返回商城网站?

支付老李

明确结论

在 Amazon FPS 支付请求中设置 returnURL 后,买家完成托管支付流程,Amazon 会把浏览器重定向到这个地址。

但浏览器成功返回不等于付款成功。商城后端仍需通过 Amazon FPS 的通知机制或交易状态查询接口核实支付结果,确认无误后再更新订单并通知第三方卖家。

Amazon FPS 已停止服务。以下方法只适合维护历史系统。新项目无法再接入 Amazon FPS,需要改用目前仍可用的支付平台。

实现步骤

1. 创建商城订单

跳转到 Amazon 前,先在数据库中创建订单,并生成唯一的业务编号,例如:

ORDER-20260901-000123

可以将这个编号用作 callerReference,以便关联商城订单与 Amazon FPS 交易。

2. 设置返回地址

构造 Amazon FPS Co-Branded UI 请求时,加入完整的 HTTPS 返回地址:

returnURL=https://market.example.com/payment/amazon/return

这个地址必须经过 URL 编码。不要直接拼接用户输入,也不要在地址中放入密码、密钥或其他敏感信息。

下面是简化后的请求结构:

https://authorize.payments.amazon.com/cobranded-ui/actions/start
    ?pipelineName=SingleUse
    &callerKey=YOUR_CALLER_KEY
    &callerReference=ORDER-20260901-000123
    &transactionAmount=USD%2019.99
    &paymentReason=Order%20ORDER-20260901-000123
    &returnURL=https%3A%2F%2Fmarket.example.com%2Fpayment%2Famazon%2Freturn
    &signatureMethod=HmacSHA256
    &signatureVersion=2
    &signature=GENERATED_SIGNATURE

实际使用哪些参数,取决于系统采用的 FPS 流程。如果买家直接向第三方卖家付款,通常还需要提供与收款方授权或支付令牌相关的参数,不能只靠 returnURL 完成交易。

所有参与签名的参数都要按照 Amazon FPS 当时的规范进行排序、编码和签名计算。签名生成后,不能再修改 returnURL 或其他参数。

3. 将买家跳转到支付页面

服务端生成支付 URL 并完成签名后,可以通过普通重定向将买家带到支付页面:

HTTP/1.1 302 Found
Location: https://authorize.payments.amazon.com/cobranded-ui/actions/start?...

不要把 Amazon Secret Key 保存在浏览器端,也不要用前端 JavaScript 计算请求签名。

4. 处理买家返回

返回接口可以读取 Amazon 附带的交易信息,但这些查询参数只适合展示中间结果,不能直接用来判断是否可以发货。

下面是一个示意性的 Node.js 处理方式:

app.get("/payment/amazon/return", async (req, res) => {
  const callerReference = String(req.query.callerReference || "");

  if (!callerReference) {
    return res.status(400).send("缺少订单标识");
  }

  const order = await findOrderByCallerReference(callerReference);

  if (!order) {
    return res.status(404).send("订单不存在");
  }

  // 不直接信任 req.query.status 等浏览器参数。
  // 应通过服务端通知或 Amazon FPS 交易查询接口核实付款状态。
  const payment = await loadVerifiedPaymentResult(order.id);

  if (payment.status === "SUCCESS") {
    return res.redirect(`/orders/${encodeURIComponent(order.id)}?paid=1`);
  }

  if (payment.status === "PENDING") {
    return res.redirect(`/orders/${encodeURIComponent(order.id)}?payment=pending`);
  }

  return res.redirect(`/orders/${encodeURIComponent(order.id)}?payment=failed`);
});

这里的 loadVerifiedPaymentResult() 代表系统自己的服务端核验逻辑,并不是 Amazon FPS 的正式 API 名称。

为什么返回页面不能证明付款成功

买家可能关闭支付窗口、反复刷新返回页面,甚至手动修改 URL 参数。支付也可能暂时处于待处理状态,之后才变为成功或失败。因此,需要把浏览器返回和支付核验分开处理:

  • returnURL:将买家的浏览器带回商城,让支付流程保持连贯。
  • 服务端核验:确认交易的最终状态,并据此决定是否标记已付款、结算或发货。

订单状态建议至少包括:

CREATED
PAYMENT_PENDING
PAID
PAYMENT_FAILED
CANCELLED

只有收到可信的服务端支付结果,并核对订单编号、金额、币种、收款方和交易状态后,才能把订单更新为 PAID。

注意事项

  • returnURL 应使用 HTTPS,并指向商城控制的域名。
  • callerReference 必须唯一,并与本地订单绑定。
  • 返回接口需要支持重复访问,防止重复记账、重复通知卖家或重复发货。
  • 必须核对实际收款方,防止第三方卖家的收款令牌被替换。
  • 金额和币种应以服务端保存的订单记录为准,不要采用浏览器提交的金额。
  • 支付失败、被取消或仍在处理中时,也要提供清晰的订单状态页面。
  • Amazon FPS 是已经停用的历史服务。如果旧系统仍在运行,应优先制定迁移方案。新商城则需要选择支持平台型交易、第三方卖家收款和回调通知的现行支付产品。

备注:内容仅供参考。