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 是已经停用的历史服务。如果旧系统仍在运行,应优先制定迁移方案。新商城则需要选择支持平台型交易、第三方卖家收款和回调通知的现行支付产品。
备注:内容仅供参考。
