服务端如何防止重复支付

沙海 2021年4月18日05:56:53Java评论30字数 1334阅读4分26秒阅读模式
摘要

速读摘要

速读摘要文章源自JAVA秀-https://www.javaxiu.com/13296.html

这个过程中经常可能遇到的问题是掉单,无论是超时未收到回调通知也好,还是程序自身报错也好,总之由于各种各样的原因,没有如期收到通知并正确的处理后续逻辑等等,都会造成用户支付成功了,但是服务端这边订单状态没更新,这个时候有可能产生投诉,或者用户重复支付。支付订单增加一个中间状态"支付中",当同一个订单去支付的时候,先检查有没有状态为"支付中"的支付流水,当然支付(prepay)的时候要加个锁。文章源自JAVA秀-https://www.javaxiu.com/13296.html

原文约 1182 | 图片 5 | 建议阅读 3 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/13296.html

服务端如何防止重复支付

戳一戳→ 程序员的成长之路 文章源自JAVA秀-https://www.javaxiu.com/13296.html

服务端如何防止重复支付文章源自JAVA秀-https://www.javaxiu.com/13296.html

程序员的成长之路文章源自JAVA秀-https://www.javaxiu.com/13296.html

互联网/程序员/技术/资料共享 文章源自JAVA秀-https://www.javaxiu.com/13296.html

关注文章源自JAVA秀-https://www.javaxiu.com/13296.html

阅读本文大概需要 2 分钟。文章源自JAVA秀-https://www.javaxiu.com/13296.html

来自:cnblogs.com/cjsblog/p/14516909.html文章源自JAVA秀-https://www.javaxiu.com/13296.html

概述文章源自JAVA秀-https://www.javaxiu.com/13296.html

服务端如何防止重复支付文章源自JAVA秀-https://www.javaxiu.com/13296.html

如图是一个简化的下单流程,首先是提交订单,然后是支付。支付的话,一般是走支付网关(支付中心),然后支付中心与第三方支付渠道(微信、支付宝、银联)交互,支付成功以后,异步通知支付中心,支付中心更新自身支付订单状态,再通知业务应用,各业务再更新各自订单状态。文章源自JAVA秀-https://www.javaxiu.com/13296.html

这个过程中经常可能遇到的问题是掉单,无论是超时未收到回调通知也好,还是程序自身报错也好,总之由于各种各样的原因,没有如期收到通知并正确的处理后续逻辑等等,都会造成用户支付成功了,但是服务端这边订单状态没更新,这个时候有可能产生投诉,或者用户重复支付。文章源自JAVA秀-https://www.javaxiu.com/13296.html

由于③⑤造成的掉单称之为外部掉单,由④⑥造成的掉单我们称之为内部掉单文章源自JAVA秀-https://www.javaxiu.com/13296.html

为了防止掉单,这里可以这样处理:文章源自JAVA秀-https://www.javaxiu.com/13296.html

1、支付订单增加一个中间状态“支付中”,当同一个订单去支付的时候,先检查有没有状态为“支付中”的支付流水,当然支付(prepay)的时候要加个锁。支付完成以后更新支付流水状态的时候再讲其改成“支付成功”状态。文章源自JAVA秀-https://www.javaxiu.com/13296.html

2、支付中心这边要自己定义一个超时时间(比如:30秒),在此时间范围内如果没有收到支付成功回调,则应调用接口主动查询支付结果,比如10s、20s、30s查一次,如果在最大查询次数内没有查到结果,应做异常处理文章源自JAVA秀-https://www.javaxiu.com/13296.html

3、支付中心收到支付结果以后,将结果同步给业务系统,可以发MQ,也可以直接调用,直接调用的话要加重试(比如:SpringBoot Retry)文章源自JAVA秀-https://www.javaxiu.com/13296.html

4、无论是支付中心,还是业务应用,在接收支付结果通知时都要考虑接口幂等性,消息只处理一次,其余的忽略文章源自JAVA秀-https://www.javaxiu.com/13296.html

5、业务应用也应做超时主动查询支付结果文章源自JAVA秀-https://www.javaxiu.com/13296.html

对于上面说的超时主动查询可以在发起支付的时候将这些支付订单放到一张表中,用定时任务去扫文章源自JAVA秀-https://www.javaxiu.com/13296.html

为了防止订单重复提交,可以这样处理:文章源自JAVA秀-https://www.javaxiu.com/13296.html

1、创建订单的时候,用订单信息计算一个哈希值,判断redis中是否有key,有则不允许重复提交,没有则生成一个新key,放到redis中设置个过期时间,然后创建订单。其实就是在一段时间内不可重复相同的操作文章源自JAVA秀-https://www.javaxiu.com/13296.html

附上微信支付最佳实践:文章源自JAVA秀-https://www.javaxiu.com/13296.html

服务端如何防止重复支付文章源自JAVA秀-https://www.javaxiu.com/13296.html

PS:如果觉得我的分享不错,欢迎大家随手点赞、在看。文章源自JAVA秀-https://www.javaxiu.com/13296.html

<END>文章源自JAVA秀-https://www.javaxiu.com/13296.html

推荐阅读:文章源自JAVA秀-https://www.javaxiu.com/13296.html

聊一聊我在 B 站上自学编程的经历吧文章源自JAVA秀-https://www.javaxiu.com/13296.html

SQL语句中 left join 后用 on 还是 where,区别大了!文章源自JAVA秀-https://www.javaxiu.com/13296.html

5T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,单片机,树莓派,等等。在公众号内回复「2048」,即可免费获取!!文章源自JAVA秀-https://www.javaxiu.com/13296.html

服务端如何防止重复支付文章源自JAVA秀-https://www.javaxiu.com/13296.html

微信扫描二维码,关注我的公众号文章源自JAVA秀-https://www.javaxiu.com/13296.html

朕已阅 服务端如何防止重复支付文章源自JAVA秀-https://www.javaxiu.com/13296.html

继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
  • 版权声明:本站是JAVA秀团队的技术分享社区,我们会经常分享资源和教程。
  • 转载请注明:服务端如何防止重复支付 - JAVA秀 ☜(ˆ▽ˆ)
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定