一次重复支付引发的思考
如何避免订单重复提交和重复支付, 在网上一些文章视频都很好的讲出怎么避免此类问题
然而重复支付真正发生在自己身上, 却还是焦头烂额
复盘
- 6月10日13点22分, 业务方反馈支付系统对人员自动打款没有到账, 让排查问题
- 13点36分, 我反馈支付服务压根没有收到支付请求, 产品让业务服务手动把支付状态改为支付失败, 这样可以在页面上手动支付
- 13点36分-13点44分, 业务服务修改支付状态后, 重新手动支付, 我查看日志中发现触发支付接口, 但是在流水中生成了对同一人的两笔支付流水, 我反馈大概触发了重复支付
三方支付api已经返回处理中, 我们只能眼睁睁的看着钱打进人员手上,还好领导在人员跟前,及时处理冲红了这笔流水
排查
追踪了一下业务, 业务系统每30分钟会触发一次支付 ( 付款方账户里的钱可能不足, 所以需要每30分钟校验账户钱是否满足支付 ) , 恰恰在定时任务load进支付任务后,页面又触发了手动支付, 导致打款重复
防线
防线之前
日志的重要性这时候就体现出来了, 好在日志是我入职以来一直在推进的流程, 有日志就能快速定位复盘问题
前端防抖
防本不防根
令牌机制
支付系统下发令牌, 只有在令牌有效期内才能支付, 令牌只能使用一次, 令牌无效返回错误
订单号处理
业务系统生成的单号, 支付系统针对单号做幂等处理, 重复提交会返回错误
预支付状态
支付中可能需要撤回相应的支付 ( 避免眼睁睁~~~ ), 因此可以设计处于3分钟(在风控中可逐步提高)的预支付状态, 系统扫描预支付状态的订单, 如果超过3分钟还处于预支付状态, 就对其进行支付
一次重复支付引发的思考
https://maocat.cc/2023/06/13/blog/article/the_pay/