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

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

一、前言

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

二、支付流程

要想知道什么时候会发生重复支付,首先梳理一下支付的流程。(以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。一般会把整个消息放入延时队列,等时间到期,消费数据的时候会主动查询三方接口,若已经支付,需要对数据进行支付处理,若未支付,修改订单即可。

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


目录
相关文章
|
1月前
|
API 开发者
淘宝店铺订单接口丨淘宝店铺订单交易接口技术文档
淘宝店铺订单接口丨淘宝店铺订单交易接口技术文档
94 0
|
1月前
|
消息中间件 供应链 NoSQL
电商订单待支付(思路分析)
电商订单待支付(思路分析)
|
7月前
|
设计模式 算法 NoSQL
淘东电商项目(57) -聚合支付(支付令牌接口)
淘东电商项目(57) -聚合支付(支付令牌接口)
48 0
|
9月前
|
JSON API 数据格式
淘宝API接口解析,实现获得淘宝商品快递费用
淘宝API接口解析,实现获得淘宝商品快递费用
116 1
|
11月前
|
XML JSON 缓存
Java实现订单ID获取淘宝买到的订单物流数据接口方法
Java实现订单ID获取淘宝买到的订单物流数据接口方法
114 0
|
11月前
|
XML JSON 缓存
Java实现商品ID获取淘宝商品快递费用数据方法
Java实现商品ID获取淘宝商品快递费用数据方法
174 0
|
JSON 安全 API
【淘宝/天猫】商品快递费用调用API接口封装简介
淘宝/天猫是国内最大的电商平台之一,每天都有数以亿计的人通过淘宝/天猫购买商品,而随着电商业务的不断发展,物流也成为了电商平台中不可或缺的一环。物流的速度和成本直接影响到消费者购物体验以及商家的盈利能力。为了让消费者和商家更好地掌握物流成本,淘宝/天猫提供了淘宝商品快递费用 API调用接口,方便开发者和商家获取淘宝商品的快递费用。
|
XML JSON 缓存
不甘心当小卖家的电商,都用了这个接口!
我们做电商,如果你甘心只做一个小卖家,零零散散的收订单。那么,这篇文章你可以掠过。但是,如果你还对电商保有热情,投入激情,相信电商事业会有爆发。请认真看完。
|
缓存 NoSQL Redis
【浅谈电商】如何防止重复下单
首先我们要知道什么时候是下单操作。以JD为例: 购物车 -> 结算页面 -> 下单页面 - 购物车:购物车 - 结算页面:此页面可以查看待支付金额,使用的优惠券,填写地址,运费等等。 - 下单页面:此页面可以选择结算方式,并且页面展示付款倒计时,也就是说订单已经创建完成。 在下单页面时,由于用户点击下单按钮多次、或者重试策略导致在订单服务中接收到了`两次同样`的下单请求。
529 0
【浅谈电商】如何防止重复下单