服务端如何防止重复支付

点击上方 "编程技术圈"关注, 星标或置顶一起成长

后台回复“大礼包”有惊喜礼包!

日英文

Life has to have cracks in it so that the sun can shine through. 

生命必须有裂缝,阳光才照得进来。

每日掏心话

有些故事落下了帷幕,有些却还没来得及开始却要结束;故事是短暂而美好的,只因那懵懂的心灵与对感情的向往,便不顾一切,纵身跃下那悬崖。

责编:乐乐 | 来自:废物大师兄链接:cnblogs.com/cjsblog/p/14516909.html

编程技术圈(ID:study_tech)第 1199 次推文

往日回顾:推荐一个高仿微信的项目 有点屌!!

     

   正文   




概述
如图是一个简化的下单流程,首先是提交订单,然后是支付。支付的话,一般是走支付网关(支付中心),然后支付中心与第三方支付渠道(微信、支付宝、银联)交互,支付成功以后,异步通知支付中心,支付中心更新自身支付订单状态,再通知业务应用,各业务再更新各自订单状态。这个过程中经常可能遇到的问题是掉单,无论是超时未收到回调通知也好,还是程序自身报错也好,总之由于各种各样的原因,没有如期收到通知并正确的处理后续逻辑等等,都会造成用户支付成功了,但是服务端这边订单状态没更新,这个时候有可能产生投诉,或者用户重复支付。搜索公众号后端架构师后台回复“架构整洁”,获取一份惊喜礼包。由于③⑤造成的掉单称之为外部掉单,由④⑥造成的掉单我们称之为内部掉单为了防止掉单,这里可以这样处理:1、支付订单增加一个中间状态“支付中”,当同一个订单去支付的时候,先检查有没有状态为“支付中”的支付流水,当然支付(prepay)的时候要加个锁。支付完成以后更新支付流水状态的时候再讲其改成“支付成功”状态。2、支付中心这边要自己定义一个超时时间(比如:30秒),在此时间范围内如果没有收到支付成功回调,则应调用接口主动查询支付结果,比如10s、20s、30s查一次,如果在最大查询次数内没有查到结果,应做异常处理3、支付中心收到支付结果以后,将结果同步给业务系统,可以发MQ,也可以直接调用,直接调用的话要加重试(比如:SpringBoot Retry)4、无论是支付中心,还是业务应用,在接收支付结果通知时都要考虑接口幂等性,消息只处理一次,其余的忽略5、业务应用也应做超时主动查询支付结果对于上面说的超时主动查询可以在发起支付的时候将这些支付订单放到一张表中,用定时任务去扫为了防止订单重复提交,可以这样处理:1、创建订单的时候,用订单信息计算一个哈希值,判断redis中是否有key,有则不允许重复提交,没有则生成一个新key,放到redis中设置个过期时间,然后创建订单。其实就是在一段时间内不可重复相同的操作附上微信支付最佳实践:
PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!
欢迎加入后端架构师交流群,在后台回复“学习”即可。
在这里,我为大家准备了一份2021年最新最全BAT等大厂Java面试经验总结别找了,想获取史上最简单的Java大厂面试题学习资料扫下方二维码回复「手册」就好了猜你还想看阿里、腾讯、百度、华为、京东最新面试题汇集一次 HTTP 请求到底经历了什么?
新版Win10来了!网友:丑哭了
面试这样回答Java调优,至少加1000块!!!
嘿,你在看吗?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值