防止,支付订单,重复提交,如何做?

沙海 2021年6月2日01:28:18Java评论38字数 1744阅读5分48秒阅读模式
摘要

智能摘要

智能摘要文章源自JAVA秀-https://www.javaxiu.com/28441.html

那么实际我们在设计支付系统时,如何来避免这一问题呢。支付的话,一般是走支付网关(支付中心),然后支付中心与第三方支付渠道(微信、支付宝、银联)交互,支付成功以后,异步通知支付中心,支付中心更新自身支付订单状态,再通知业务应用,各业务再更新各自订单状态。这个过程中经常可能遇到的问题是掉单,无论是超时未收到回调通知也好,还是程序自身报错也好,总之由于各种各样的原因,没有如期收到通知并正确的处理后续逻辑等等,都会造成用户支付成功了,但是服务端这边订单状态没更新,这个时候有可能产生投诉,或者用户重复支付。文章源自JAVA秀-https://www.javaxiu.com/28441.html

原文约 1844 | 图片 2 | 建议阅读 4 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/28441.html

防止,支付订单,重复提交,如何做?

架构师专栏 文章源自JAVA秀-https://www.javaxiu.com/28441.html

收录于话题文章源自JAVA秀-https://www.javaxiu.com/28441.html

#架构进阶106文章源自JAVA秀-https://www.javaxiu.com/28441.html

#Java进阶37文章源自JAVA秀-https://www.javaxiu.com/28441.html

#历史专栏244文章源自JAVA秀-https://www.javaxiu.com/28441.html

大家好,我是磊哥。文章源自JAVA秀-https://www.javaxiu.com/28441.html

文章源自JAVA秀-https://www.javaxiu.com/28441.html

在我们支付系统设计中,经常会遇到这样一个问题,防止用户重复支付。用户明明只想购买一次,却因为系统问题,导致重复支付,带来额外的物流成本和扯皮退货的运营成本,对商家的信誉和系统的体验很不好。文章源自JAVA秀-https://www.javaxiu.com/28441.html

那么实际我们在设计支付系统时,如何来避免这一问题呢。文章源自JAVA秀-https://www.javaxiu.com/28441.html

如图是一个简化的下单流文章源自JAVA秀-https://www.javaxiu.com/28441.html

防止,支付订单,重复提交,如何做?文章源自JAVA秀-https://www.javaxiu.com/28441.html

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

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

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

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

 文末有:3625页互联网大厂面试题 文章源自JAVA秀-https://www.javaxiu.com/28441.html

为了防止掉单,这里可以这样处理:

1、 支付订单增加一个中间状态“支付中”,当同一个订单去支付的时候,先检查有没有状态为“支付中”的支付流水,当然支付(prepay)的时候要加个锁。支付完成以后更新支付流水状态的时候再讲其改成“支付成功”状态。另外关注:架构师专栏,在后台回复:“面试题”可以获取,高清PDF最新版3625页互联网大厂面试题。文章源自JAVA秀-https://www.javaxiu.com/28441.html

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

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

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

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

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

为了防止订单重复提交,可以这样处理:

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

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

作者:废物大师兄文章源自JAVA秀-https://www.javaxiu.com/28441.html

来源:https://sourl.cn/Nvxvim文章源自JAVA秀-https://www.javaxiu.com/28441.html

防止,支付订单,重复提交,如何做?文章源自JAVA秀-https://www.javaxiu.com/28441.html

近期技术热文文章源自JAVA秀-https://www.javaxiu.com/28441.html

1、SpringBoot打包成exe程序,干货教程!2、牛逼哄哄的 BitMap,到底牛逼在哪?3、MySQL 8.0 的 5 个新特性,太实用了4、ZK、Eureka、Consul 、Nacos,注册中心怎么选?文章源自JAVA秀-https://www.javaxiu.com/28441.html

第3版:互联网大厂面试题文章源自JAVA秀-https://www.javaxiu.com/28441.html

包括 Java 集合、JVM、多线程、并发编程、设计模式、算法调优、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈!文章源自JAVA秀-https://www.javaxiu.com/28441.html

阅读原文: 高清 7701页大厂面试题  PDF文章源自JAVA秀-https://www.javaxiu.com/28441.html

阅读原文文章源自JAVA秀-https://www.javaxiu.com/28441.html

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

发表评论

匿名网友 填写信息

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

确定