一次重复支付引发的思考

如何避免订单重复提交和重复支付, 在网上一些文章视频都很好的讲出怎么避免此类问题

然而重复支付真正发生在自己身上, 却还是焦头烂额


复盘

  1. 6月10日13点22分, 业务方反馈支付系统对人员自动打款没有到账, 让排查问题
  2. 13点36分, 我反馈支付服务压根没有收到支付请求, 产品让业务服务手动把支付状态改为支付失败, 这样可以在页面上手动支付
  3. 13点36分-13点44分, 业务服务修改支付状态后, 重新手动支付, 我查看日志中发现触发支付接口, 但是在流水中生成了对同一人的两笔支付流水, 我反馈大概触发了重复支付

三方支付api已经返回处理中, 我们只能眼睁睁的看着钱打进人员手上,还好领导在人员跟前,及时处理冲红了这笔流水


排查

追踪了一下业务, 业务系统每30分钟会触发一次支付 ( 付款方账户里的钱可能不足, 所以需要每30分钟校验账户钱是否满足支付 ) , 恰恰在定时任务load进支付任务后,页面又触发了手动支付, 导致打款重复


防线

防线之前

日志的重要性这时候就体现出来了, 好在日志是我入职以来一直在推进的流程, 有日志就能快速定位复盘问题

前端防抖

防本不防根

令牌机制

支付系统下发令牌, 只有在令牌有效期内才能支付, 令牌只能使用一次, 令牌无效返回错误

订单号处理

业务系统生成的单号, 支付系统针对单号做幂等处理, 重复提交会返回错误

预支付状态

支付中可能需要撤回相应的支付 ( 避免眼睁睁~~~ ), 因此可以设计处于3分钟(在风控中可逐步提高)的预支付状态, 系统扫描预支付状态的订单, 如果超过3分钟还处于预支付状态, 就对其进行支付


一次重复支付引发的思考
https://maocat.cc/2023/06/13/blog/article/the_pay/
发布于
2023年6月13日
许可协议