【浅谈电商】如何防止重复支付

简介: 一、前言最近正在做电商相关的项目,整理一下解决方案并帮助自己巩固知识点,此方案是结合了目前的业务环境,若有更好的解决的方式很高兴与大家一起讨论。

一、前言

最近正在做电商相关的项目,整理一下解决方案并帮助自己巩固知识点,此方案是结合了目前的业务环境,若有更好的解决的方式很高兴与大家一起讨论。

二、支付流程

要想知道什么时候会发生重复支付,首先梳理一下支付的流程。(以APP为例)

image.png

  1. 用户在APP中对订单进行发起支付。
  2. 服务端根据订单信息构建支付参数,调起三方支付。
  3. 三方返回支付的参数。
  4. APP跳转到相应三方APP。
  5. 展示支付信息。
  6. 用户进行支付操作。
  7. 返回支付结果。
  8. 异步通知服务端,订单支付结果。

以上是支付的一般流程,当支付成功后,三方系统会立即回调系统,当没有应答时,还会间隔一段时间进行回调,直至回答或两天以上还没有回答为止。

看似以上流程上没有漏洞,其实其中有多个漏洞。

三、为什么会重复支付

情景一

   触发多次步骤2.调起支付,把返回的支付二维码进行记录,那么这几个二维码都是可以进行支付的,这样可以造成重复支付。或者说多端的情形下,PC和APP同时调起了支付,并都进行支付操作。

情景二

   假设步骤8.异步通知支付结果没有触发,或者网络突然不同,没有接收到支付结果,导致APP跳转回订单页面时,查看订单还是未支付状态,可能会再次支付。

情景三

   以上情景都是建立在同一种支付方式上,若第一次是微信支付,第二次换成了AliPay,在不同支付方式中进行支付,也会导致重复支付的情况下出现。

四、如何防止重复支付

在上述情景中,情景一情景三都是支付多次导致的,这样我们还是以加锁的方式去解决,当然这里是分布式锁。

image.png

我们展开说明其中的细节问题:

  1. 当我们第一次调起支付时,会在Redis中获取到此订单的锁,这样其他相对此订单调起支付的线程都会被拒绝。
  2. 锁在什么时候释放呢,在调起支付后就会释放锁,此时其他线程可以拿到此订单的锁,可以去调用其他支付方式,此时若调起的支付方式与之前的方式不同,需要去三方调用取消订单方法,返回成功后,才可以进行此次请求,即调用第二个支付方式接口。这样能保证就算是用户拿到两个支付二维码,也是只能支付其中一个的。

还有一个细节

在调起支付时,会有一个有效期,例如20:00调起支付,设置失效时间为20:30。一般会把整个消息放入延时队列,等时间到期,消费数据的时候会主动查询三方接口,若已经支付,需要对数据进行支付处理,若未支付,修改订单即可。

这样的话在订单失效后的时间是不会重复支付的。在订单可支付的时间内,保证只有一种支付方式可以支付,且支付方式切换时保证能够关闭之前的订单。


目录
相关文章
|
NoSQL Java Redis
服务端如何防止订单重复支付!
如图是一个简化的下单流程,首先是提交订单,然后是支付。 支付的话,一般是走支付网关(支付中心),然后支付中心与第三方支付渠道(微信、支付宝、银联)交互。 支付成功以后,异步通知支付中心,支付中心更新自身支付订单状态,再通知业务应用,各业务再更新各自订单状态。
服务端如何防止订单重复支付!
|
微服务 测试技术 Java
阿里技术专家详解 DDD 系列- Domain Primitive
关于DDD的一系列文章,希望能继续在总结前人的基础上发扬光大DDD的思想,但是通过一套我认为合理的代码结构、框架和约束,来降低DDD的实践门槛,提升代码质量、可测试性、安全性、健壮性。
61880 17
阿里技术专家详解 DDD 系列- Domain Primitive
|
移动开发 vr&ar
数据库系统概论——关系代数详解
关系代数是一种抽象的查询语言,是关系数据操纵语言的一种传统表达方式,它是利用对关系的运算来表达查询的。任何运算都是将一定的运算符作用于一定的运算对象上,得到预期的运算结果。关系代数的运算对象是关系,运算结果亦为关系。集合运算符将关系看成元组的集合从关系的“水平”方向即行的角度来进行运算专门的关系运算符不仅涉及行而且涉及列算术比较符辅助专门的关系运算符进行操作逻辑运算符辅助专门的关系运算符进行操作。
1419 1
数据库系统概论——关系代数详解
|
弹性计算
阿里云备案审核一般多久能过?域名备案需要几天?
阿里云域名备案是大家比较关心的问题,尤其是网站域名备案时间,阿里云备案时间还是比较快的,如果用户材料齐全,提交到阿里云审核无误后,一般一天即可提交到所对应省事的管局,备案号下来的时间要以管局的审核时间为准,一般管局审核时间为10天左右。
|
9月前
|
决策智能 数据库 开发者
使用Qwen2.5+SpringBoot+SpringAI+SpringWebFlux的基于意图识别的多智能体架构方案
本项目旨在解决智能体的“超级入口”问题,通过开发基于意图识别的多智能体框架,实现用户通过单一交互入口使用所有智能体。项目依托阿里开源的Qwen2.5大模型,利用其强大的FunctionCall能力,精准识别用户意图并调用相应智能体。 核心功能包括: - 意图识别:基于Qwen2.5的大模型方法调用能力,准确识别用户意图。 - 业务调用中心:解耦框架与业务逻辑,集中处理业务方法调用,提升系统灵活性。 - 会话管理:支持连续对话,保存用户会话历史,确保上下文连贯性。 - 流式返回:支持打字机效果的流式返回,增强用户体验。 感谢Qwen2.5系列大模型的支持,使项目得以顺利实施。
2840 8
使用Qwen2.5+SpringBoot+SpringAI+SpringWebFlux的基于意图识别的多智能体架构方案
|
8月前
|
机器学习/深度学习 人工智能 云计算
与阿里合作项目荣获2024年度教育部产学合作协同育人项目优秀案例
该项目强调利用阿里云计算有限公司的低代码开发平台和算力资源,开发创新性的教学案例,以支持机器学习和深度学习等前沿技术课程的教学和实验。项目部分成果纳入了即将出版的《深度学习实战案例》教材中,该教材由人民邮电出版社出版。
475 10
|
10月前
|
网络协议 算法 网络性能优化
|
消息中间件 NoSQL Kafka
订单超时取消的11种方式(非常详细清楚)
订单超时取消的11种方式(非常详细清楚)
7129 4
订单超时取消的11种方式(非常详细清楚)
|
10月前
|
NoSQL Redis
Redis分布式锁如何实现 ?
Redis分布式锁通过SETNX指令实现,确保仅在键不存在时设置值。此机制用于控制多个线程对共享资源的访问,避免并发冲突。然而,实际应用中需解决死锁、锁超时、归一化、可重入及阻塞等问题,以确保系统的稳定性和可靠性。解决方案包括设置锁超时、引入Watch Dog机制、使用ThreadLocal绑定加解锁操作、实现计数器支持可重入锁以及采用自旋锁思想处理阻塞请求。
216 16

热门文章

最新文章