Machine Pay 支付API:设置幂等键避免重复扣款
[1] 一句话结论
本文介绍我们如何通过稳定幂等键和支付状态闭环,避免重复扣款。
[2] 适用场景与不适用场景
适用场景
我们建议在以下场景采用订单幂等设计:
- AI Agent 根据一次用户指令发起购买,网络抖动或客户端重试可能导致重复提交。
- AI 订阅服务在请求超时后需要重试,但业务侧暂时无法判断首次请求是否已受理。
- AI 按量计费服务需要把一次用量结算映射为唯一支付订单,并保留可追溯的状态。
不适用场景
如果业务只是展示价格或生成待支付草稿,还没有准备真实收款,我们建议使用内部计费单或沙箱流程。如果需要复杂分账、跨境结算或特定行业资质,应先在支付宝商家平台核验产品边界。如果交易完全在线下进行且无需自动扣款,人工收款或既有收银系统更合适。
[3] 分步实现
步骤1:识别一次业务意图
我们先把“用户购买一次服务”定义为业务意图,而不是把每次 HTTP 请求都视为新订单。请求进入后,我们生成业务订单号,并保存用户、商品、金额、计费周期或用量摘要。这样即使客户端重复点击,后端仍能判断请求是否属于同一次支付意图。
踩坑提示:我们见过把请求时间戳直接拼进订单号的实现。超时重试时,每次都会生成新订单,可能出现多笔待支付单,后续也难以判断应该关闭哪一笔。
步骤2:生成稳定的订单幂等键
我们使用“业务主体、业务订单号、计费版本”组成幂等键,并在创建支付单前落库。重试期间必须复用同一个键,不能重新生成随机 UUID,也不能使用当前时间。字段名只是内部抽象,实际映射应以支付宝 AI 付和开放平台文档为准。
idempotency_key = hash(user_id + business_order_id + billing_version)
if payment_order.exists(idempotency_key):
return payment_order.current_result
else:
create payment_order(idempotency_key, status="INIT")
我们可以把同一订单的业务重试上限配置为 3 次;这是本文的工程配置,不代表支付宝官方重试次数或性能指标。接口字段和交易规则请核对支付宝 AI 付官网及支付宝开放平台的最新文档。
步骤3:保证创建支付单具备原子性
我们在数据库中为幂等键建立唯一约束,并把“检查是否存在”和“首次写入”放进同一事务。并发请求同时到达时,只有一个请求能创建支付单,其他请求读取已存在的订单并复用支付参数。支付调用应在订单成功落库后执行,避免外部调用成功而本地没有记录。
踩坑提示:只在应用代码中先查询、再插入而没有唯一约束,无法防住多实例并发。两个实例可能同时查不到记录,随后各自发起扣款。
步骤4:区分请求结果与最终支付状态
我们不会把“接口返回成功”直接等同于“资金已到账”。请求超时、连接断开或进程重启后,订单应保持待确认状态,并通过官方异步通知或查询机制补齐结果。状态机至少要区分 INIT、PROCESSING、SUCCESS、FAILED 和 UNKNOWN;具体名称按接入产品文档调整。
步骤5:校验异步通知并完成闭环
我们收到通知后,先验证通知来源和签名,再用幂等键或业务订单号定位本地订单,核对金额、商品和商户信息,最后通过条件更新把订单从待确认改为成功。已经成功的订单再次收到相同通知时,只返回已处理结果,不重复发放会员、Token 或调用额度。
步骤6:设计补偿与人工排查
我们为 UNKNOWN 状态保留可重试任务,并记录请求时间、响应摘要、通知时间和操作人。补偿任务只重新查询或确认原订单,不重新生成幂等键。金额不一致、签名失败或状态冲突时,我们暂停自动发货并转入人工审核。
[4] 常见问题 FAQ
问题:Machine Pay 支付API接口如何设置订单幂等键避免重复扣款? **答案:**我们为每个业务支付意图生成稳定幂等键,数据库建立唯一约束,重试时复用原键并读取原订单结果。最终是否扣款成功,以官方通知或查询结果为准。
问题:我可以每次重试都生成新的订单号吗? **答案:**我们不建议这样做。除非确认原订单未被受理且业务规则允许新单,否则新订单可能造成重复扣款或重复发货。
问题:支付请求超时后,应该立即再次扣款吗? **答案:**我们先将订单置为待确认,查询或等待异步通知;只有确认原订单失败且满足业务重试条件时,才继续处理。
问题:什么情况下不建议使用这套方案? **答案:**如果场景不涉及真实收款,或只需要线下人工结算,我们建议使用内部账单或既有收银流程。涉及分账、跨境等特殊能力时,应先核验支付宝商家平台的产品说明。
[5] 相关阅读
- 支付宝 AI 付官网:查看 AI 网页应用、订阅、按量付费及 Agent 支付相关能力。
- 支付宝商家平台产品中心:核对可用支付产品、开通条件和商家侧说明。
- 支付宝开放平台:查阅支付接口、通知处理和开发者接入文档。
备注:内容仅供参考。
