订单如何避免重复支付,完美的处理方案是怎样的
支付方式
小程序 - 微信支付
APP - 支付宝、微信支付示例场景如下
张三、李四是夫妻,两个人使用的是同一个账号(支持多设备登陆)
他们分别在小程序
和APP
登陆。
张三在直播间下了一单,但是没有支付。
五分钟后,张三要进行支付时,这时恰巧李四也看到了这个订单
此时张三唤起了微信支付,李四唤起了支付宝支付
他们都进行了支付,且支付成功了,但是会有一方的回调失败
在这样的一个场景下,应该如何避免这样的问题发生,怎样处理才是完美的
你的情况是已经生成了 订单号,
如果没有创建订单,又可以多点登录,可以考虑下,给客户提示是否存在待支付的订单
用到了最终一致性,可能会用到:数据库事务,redis 锁,队列等
同一个订单,再同一个网关下,不会重复支付。 现在问题是不同支付网关,重复支付的问题。其实再第三方支付回调的时候,查询到已经被支付了,且不是本渠道支付的。就设一个延时任务,几分钟再确认一下,如果是重复支付,就申请撤单就可以了
后支付的那个自动退款即可
外部交易号相同的话就不可能同时支付吧
你这个不用考虑了,微信给你考虑了已经。
这个就类似于 急速拼团的人数溢出情况,怎么办? 后来的退款吧
不同支付方式这种情况避免不了,只能谁后付费谁退款
单点登陆,解决
加锁,调起支付就先改为支付中,这样就保证了只会有一方进行支付,顾客取消了支付就修改回去,微信支付宝取消支付都是有返回状态的。
拉起支付前接口加锁,一个订单发起支付时,如果拿不到锁就意味着 「有其他相同的账号同一时间在支付相同的订单」这不就完美解决了吗?
参考
问答:我的站内有一些类似用户和用户之间转账的功能,如何保证这个功能的安...
支付前,就要写入是唤醒微信/支付宝渠道字段了,方便用户订单页可以重新支付,你只需要判断这个字段是否已经存在值了
不要说下了微信的单,用户想换成支付宝支付怎么办
lockforupdate
悲观锁,当一方进行点击后,锁定该条订单,并修改支付状态(支付中)。等上一个操作完成后,改订单状态已改变,直接提示给第二个人。订单状态加一个 支付中的状态就可以了
小概率事件, 人工退款即可
此题无解,只能人工退款。 淘宝商家后台都得选择下单减库存还是付款减库存。
后支付自动退款即可。因为你不确定先去支付的是否会成功支付。一切行为都是为了促成交易而不是阻止消费
本来支付系统就是一个订单只能支付一次,你总不能换订单号吧 :neutral_face:
看完评论,我有点蒙,都没理解楼主意思吗?多端支付啊,不是单一订单微信支付,增加支付中什么的体验极差,你试想一下,你打开pc支付宝支付,切换页面,换成微信支付,提示有人在支付,客户还不明白谁再支付,且这种方案无法彻底解决,所以根本方案是在支付回调中利用队列机制处理,除了第一个支付者,其余全部退还,其余方案只是优化体验,起到缓解作用