金融与交易
支付连接器实现幂等与防重复扣款:用…
在实现支付、取消、捕获、退款等支付连接器端点时,防止 Gateway 重试导致重复扣款、重复退款并保证状态转换合法。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
支付连接器实现幂等与防重复扣款:用 pa特定
解决思路
- Create Payment 用 paymentId 作为幂等键:处理前先按 paymentId 查询数据存储,若已存在记录则直接返回已存响应,不再调用收单方。
- Cancel、Capture、Refund 用 requestId 作为幂等键:处理前先查询是否已有该 requestId 的操作记录,存在则返回已存响应。
- 对重复的 Create Payment 请求必须原样返回已存储的响应,不得新建记录、不得重新生成 authorizationId、tid、nsu 等标识符。
- 异步支付方式(Boleto、Pix、银行转账、重定向类)的 Create Payment 必须返回 status: "undefined",在收单方确认前不得返回 "approved" 或 "denied",并通过 callbackUrl 通知 Gateway。
- 强制支付状态机:仅允许 undefined → approved → settled、undefined → denied、approved → cancelled 等合法转换,禁止非法转换(如捕获已取消的支付)。
- 支付状态必须存入持久化数据存储(PostgreSQL、DynamoDB、VTEX IO 的 VBase),禁止使用重启即丢失的内存存储(Map、局部变量)。
- 异步支付方式将 delayToCancel 延长为 604800 秒(7 天),同步方式使用 21600 秒。
- Cancel 处理中先做 requestId 幂等检查,再做状态校验:若支付不存在或状态不在 ["undefined", "approved"] 内,返回 cancel-failed 及说明信息。
- Cancel 成功后更新支付状态为 cancelled,并以 requestId 保存操作记录(含 paymentId、operation、response、createdAt)。
- Create Payment 首次处理时调用收单方,构造响应(含 paymentId、status、authorizationId、nsu、tid、acquirer、code、message、delayToAutoSettle、delayToAutoSettleAfterAntifraud、delayToCancel,异步时含 paymentUrl),保存后再返回。
- 按审查清单自检:Create Payment 是否先查 paymentId、重复请求是否原样返回、Cancel/Capture/Refund 是否查 requestId、状态机是否强制、异步是否返回 undefined、状态是否持久化、异步 delayToCancel 是否延长。
适用边界 · 注意事项
- 不适用于定义 PPP 端点响应结构与 HTTP 方法(应使用 payment-provider-protocol 技能)。
- 不适用于异步回调 URL 通知逻辑(应使用 payment-async-flow 技能)。
- 不适用于 PCI 合规与 Secure Proxy(应使用 payment-pci-security 技能)。