多重路由怎么做,才不会重复扣款?
从通道资格、交易状态和幂等开始,设计能解释、可恢复的支付路由。
多路由是把适合的交易交给适合的通道。它不只是把多个接口排成失败重试列表;更不应该为了追求成功率,在多个通道同时提交可能扣款的请求。
第一步是资格过滤
先判断商户与通道是否获准处理这类业务,再看国家、币种、支付方式、商户类别、金额限额、3DS 和凭据支持。即使有接口,也不能把未批准的商户交易转到另一个账户处理。
卡片令牌通常有作用域。某家 PSP 的 token 不一定能交给另一家使用;如需跨服务商使用,先确认独立令牌库、网络令牌或受支持的迁移方案及其 PCI 责任。不能把原始卡数据随意复制到所有通道。
在可用通道里排序
资格通过后,再按实际市场、币种与业务分组比较成功率、成本、延迟、结算、资金占用和风控表现。先建立简单、可解释的规则,再用足够样本调整权重。
不要把不同客群的总体成功率直接比较。记录交易分组、样本量和时间窗口,并把故障、维护和限流纳入健康判断。新的路由可先小比例试用,预设停止和回退条件。
一个订单,可以多次尝试,只能结清一次
将订单、付款意图、付款尝试分开:订单表示应付业务,付款意图控制这笔应付金额,尝试记录每次向哪家通道提交了什么。每次尝试使用稳定的请求标识,重复提交遵循该通道的幂等规则。
跨通道的幂等不能只依赖通道自己。A 通道的幂等键不会阻止 B 通道再次扣款,本地还需要锁定或原子状态控制,限制同一付款意图的活动尝试。异步回调必须核对业务、金额、币种与通道编号。
超时是未知,先查询再决定
请求超时可能发生在银行已经批准之后。如果立即切 B 通道,A 的迟到成功加上 B 的成功就可能造成双扣。
一个清楚的恢复顺序是:记录未知状态,使用原请求标识查询 A;结合回调与结算记录确认结果;只有在规则允许且旧尝试已被确认失败、撤销或安全结束后,才创建新的尝试。长期不明的状态进入人工核查,不能为了界面好看改成失败。
如果确实出现多笔成功,记录异常并按规则处理撤销或退款,同时核对实际入账与费用。不要依赖前端按钮禁用来控制资金一致性。
拒绝码决定是否可以重试
明确区分硬性拒绝、可修正条件、需要身份验证、网络故障与未知结果。被盗卡、账户关闭等明确拒绝,不应盲目换通道循环尝试;资金不足也不能无限重试。按网络、发卡行和服务商规则控制次数、间隔与标志,必要时让客户选择其他方式。
保留规则版本、候选资格、选中原因、拒绝原因、尝试编号、通道引用与耗时,日志中不写完整卡号或验证码。观察最终成功、重复扣款、退款、欺诈和争议,才能判断路由是否真正改善了业务。
继续阅读授权与 3DS和欺诈、争议与拒付。如需讨论接入,查看支付通道合作;官方能力参考 FuturePay 及其开发文档,实现时以所接产品的协议和规则为准。