agentwallets.si
← 返回博客

独立解读

怎么防止 Agent 重复付款?从一次超时说起

文章图解 · 概念示意
01请求超时02查询状态03安全重试

Agent 请求一份 1 美元数据,付款接口一直没有响应。Agent 看到“超时”之后立即再付一次,可能发生什么?第一次请求可能已经成功,只是结果在网络途中丢失;第二次可能再产生一笔付款。

阅读边界:下面讨论通用设计,并不声称所有支付接口都支持相同的重试、幂等或退款语义。请以具体服务文档和测试结果为准。

flowchart TD A[付款请求超时] --> B[标记状态未知] B --> C[查询订单与支付记录] C --> D{状态是否明确?} D -->|已付款| E[检查数据是否交付] D -->|未付款| F[按服务规则决定重试] D -->|仍未知| G[暂停并人工处理]

先把状态拆开

状态 它说明什么 不能说明什么
客户端超时 客户端未及时收到结果 服务端一定没有执行
付款成功 支付系统确认达到其成功条件 商品或数据已经交付
数据交付成功 收到了服务商的响应 账务已经完成最终结算
请求重复 收到相同或类似请求 每个服务都会自动去重

什么是幂等键?

可以把幂等键理解为给一次业务操作贴上的稳定标识:当接口支持该机制时,同一次操作因网络故障重试,应按照该接口的规则复用同一键。Stripe 的 API 对幂等请求记录首次结果,并规定键的保留与参数比较规则;这只是 Stripe 具体 API 的语义,不可直接套到别家。Stripe 幂等请求文档

幂等键不是万能保险:要确认它的作用范围、有效期、相同键与不同参数如何处理,以及第一次请求返回错误时能否重试。新键通常会被当成新操作;超过服务保留期,也不能假设仍能去重。

实用检查清单

  • 一次任务、订单、付款请求和服务交付分别有什么标识?
  • 可以查询哪些状态?支付方和服务商各保存什么?
  • 回调重复或迟到时如何去重?
  • 状态未知时,系统是否暂停后续支付并保留预算占用?
  • 何时需要人工联系服务商,是否有退款与对账路径?

有些链上或 x402 实现的凭证、交易及重试机制不同,不能把一种银行卡 API 的幂等规则当成全行业标准。付款与交付的区别可参考失败处理文章。