如何防止订单重复支付?

4周前 (11-18 07:25)阅读2回复0
路人甲
路人甲
  • 管理员
  • 注册排名2
  • 经验值77245
  • 级别管理员
  • 主题15449
  • 回复0
楼主

在停止线上付出的时候,有可能会呈现订单反复付出的情状,要若何避免呢?本文做者对此停止了阐发,一路来看一下吧。

在停止线上付出的时候,有可能会呈现订单反复付出的情状,要若何避免呢?本文做者对此停止了阐发,一路来看一下吧。

想必各人对在线付出都不生僻,今天和各人聊聊若何避免订单反复付出。

01 看看订单付出流程

我们来看看,电商订单付出的简要流程:

订单钱包付出流程

从下单/计算起头:

1)下单/结算

那一步固然不是间接的付出起点,但是付出相关的金额等等信息都来自结算,此时订单的形态是未付出。

展开全文

2)申请付出

用户选择申请付出,客户端挪用付出办事,此时在系统内产生一笔付出流水,那笔流水的形态是未付出。

3)倡议付出

付出办事挪用三方付出,凡是那种钱包类的付出,在倡议付出那一步,会响应一些付出的链接,客户端会对链接停止对应的处置。

4)钱包付出

用户停止付出,凡是是通过对应的钱包停止的,各人能够回忆一下本身在购物中,付出的过程,差别的端,对钱包付出的处置是不太一样的。

京东PC端付出页

APP端: 在国内,购物大部门都是在APP端,产物司理会设法设法把用户带到APP,为什么我的示例图都用京东,不消淘宝呢?因为我拿UC翻开淘宝,会间接跳转APP。

APP端的钱包付出,我们应该都十分熟悉,一般是拉起钱包,付出。

APP付出

WAP端:手机的网页站,WAP端的付出一般是间接拉起对应的钱包,若是拉起钱包失败,就跳转界面。

京东付出WAP端

PC端:PC端,凡是是翻开收银台,展现一个二维码,通过钱包扫码付出,下面是京东的微信付出扫码页。

5)付出回调

用户完成付出后,三方付出平台,会回调商户,通知付出成果。

6)同步订单形态

付出办事在确认付出完成后,会向订单办事同步付出的成果,订单办事变动订单的形态,由未付出—待发货,客户端通过轮询、长毗连,或者办事端主动推送的体例,在界面上变动订单形态。

我们再从付出流水的角度看一下付出形态的改变:

付出形态改变

从未付出,到有付出成果的末态,中间还有一个中间形态——付出中。

用户通过翻开钱包—完成付出—付出回调,那段时间的付出流水就处于付出中。为什么要花那么多篇幅来讲付出的营业流程、交互过程呢?因为我认为,避免订单的反复付出,不行是手艺上的问题,也是营业和产物上的问题。

02 为什么订单会反复付出 1. 未防重招致的反复付出

我们能够看到PC端付出,是扫描二维码,那些二维码,就是对应响应的付出流水,假设用户反复点击付出,若是不做防重的话,会生成两笔付出流水,也就是两个差别的二维码,如果用户别离扫了两个差别的付出码,那么毫无疑问,就会产生反复付出。

2. 掉单招致的反复付出

“我明明付款了,为什么我的订单还没付出呢?”

那就是所谓的“掉单”:

外部掉单:三方付出的付出形态没有同步或者没有及时同步到商城,那叫外部掉单。

内部掉单:付出办事的形态没有同步到订单,或者客户端没有及时获取到订单形态,那叫内部掉单。

用户一看,本身付了款,成果商城里订单还未付款,但是又出格想要,可能就会再下一单,如许就反复付出了。

3. 多渠道招致的反复付出

我们国内付出的体验仍是十分快速的,各人可能没有觉得,若是领会过海外付出的可能领会,良多付出的渠道,消耗的时间十分长。

好比用户保罗选择了一种付出体例Boleto,成果付出的网点离保罗他们村太远了,保罗又选择了Paypal付出,保罗去赶集的时候,又随手去网点把Boleto的那一笔付出了,成果就反复付出了。

那种情状各人可能很少碰到,我们能够用美团下一个单,先翻开微信付出,不要付出啊,接着回到美团,翻开付出宝,用付出宝付出完成后,用微信接着付出,各人猜猜,两笔付出是不是都能胜利?谜底是能够。

美团多渠道付出

04 若何避免订单反复付出 1. 加锁

不论是申请付出、仍是付出回调,都应该以订单维度加锁,避免并发下的反复操做。

加锁,毫无疑问,也是散布式锁,凡是我们会选择Redis散布式锁。

加锁

2. 缓存成果

申请付出胜利,付出回调胜利,都应该缓存成果。

再申请付出,收到胜利回调的时候,都应该先去查抄付出的形态。

3. 付出中流水取缔

假设说,用户反复付出了,再次申请付出的时候,若是已经申请付出胜利了,那么那笔付出必定是要回绝的。

但是,如果已经存在的那笔流水还在付出中呢?——我们不确定它是胜利仍是失败,必定是不克不及回绝付出的,因为可能用户付出失败了,但是形态还没同步,如许必定是不可的。

所以,我们能够取缔掉正在付出中的流水,再停止付出。

付出中流水取缔

4. 已付出流水退款

如今又有新的问题了,假设倡议付出的时候,有流水正在付出中,若是第三方付出平台不撑持取缔付出,或者用户新的付出是通过差别的渠道,我们希望尽可能进步用户的付出胜利率,怎么办呢?

我们能够在倡议付出的时候,订单还在付出中的情状下,允许用户倡议多笔付出,在付出回调的时候,查抄用户能否已经有胜利流水,对后来的流水停止退款处置。

付出回调

当然,退款是个很危险的操做,究竟结果钱退了,可就很难逃回来,必然要做好风险的掌握。

5. 主动轮询重试避免掉单

1)主动轮询避免外部掉单

若是因为毛病没有收到回调,或者没有及时收到回调,就可能会发作所谓的外部掉单。

避免外部掉单的关键,就在于,不克不及傻傻地只等三方的回调通知,而要主动去查询,用户倡议付出的3s之后,就能够倡议轮询了,曲到拿到付出流水的最末形态,主动轮询,一般能够那么实现:

轮询

①按时使命轮询

利用按时使命,扫描表中付出中的流水,主动查询付出的形态,按时使命的实现体例有良多,线程池、调度框架、散布式调度框架等等。

按时使命轮询的缺点有两个:

②延时动静轮询

别的一种体例就是利用延时动静,用户倡议付出之后,发送一个延时动静,消费到延时动静之后,查询流水付出形态,没有拿到最末形态,就再发一个延时动静。延时动静的益处是对数据库的压力没有那么大,轮询的梯度也能够停止掌握,缺点是实现起来复杂一些,并且要敬服动静队列。

2)同步+异步避免内部掉单

付出办事在收到异步通知回调、或者主动轮询到流水的最末形态后,要通知订单办事付出流水的改变,订单办事同步更新订单的形态,那个过程要尽可能包管通知胜利,能够接纳同步+异步的体例。

同步伐用:付出办事挪用订单办事的通知接口,有可能会因为收集等等的原因失败,也能够重试,但是根据经历,若是收集呈现一些颠簸,重试很可能也会失败。

异步通知:付出办事还应该发送一个付出胜利的动静,订单办事能够操纵动静队列的重试机造,来尽可能包管付出形态的同步。

那里还有一个问题,客户端若何同步那个形态?因为可能办事端更新了订单形态,但是客户端的界面上仍是未付出,得用户主动刷新一下,才气拿到最新的形态,如许明显是不太适宜的。

办事端、客户端的形态同步,无非就拉和推:

拉:很简单,就是客户端在用户跳回订单形态页的时候,轮询一会,若是用户完成付出,凡是很短时间就能获取到形态的变动,当然那种体例对客户端的性能会有一些影响,并且很呈现形态同步“丧家之犬”的情状。

推:推的实现有些费事,Web凡是是用Websocket,对APP端的推送,一般接纳第三方的推送平台。

不管从产物的角度,仍是手艺的角度,客户端倡议付出那一步,其实应该尽可能地不要外跳,PC端利用付出办事生成的付出码,而不是跳转;挪动端网页、APP在应用内展现付出页,当然那个是由第三方付出平台决定的。

在UC内内嵌付出宝

不晓得各人留意到了没有,如今的付出宝,已经做到了不消拉起钱包,在应用内就能够完成付出,那个关于商家的意义仍是比力大的,对用户体验、付出胜利率,都有正面的感化,相信以国内的内卷水平,其它付出供给商,必然会“跟进”的。

好了,关于若何避免反复付出,就讲到那里。关于付出,老三也只是初窥门径,希望列位大佬不吝金玉。

参考:

[1] 办事端若何避免反复付出

本文由 @三分恶 原创发布于人人都是产物司理。未经答应,制止转载

题图来自Unsplash,基于CC0协议

0
回帖

如何防止订单重复支付? 期待您的回复!

取消
载入表情清单……
载入颜色清单……
插入网络图片

取消确定

图片上传中
编辑器信息
提示信息