订单如何避免重复支付,完美的处理方案是怎样的

  • 支付方式
    小程序 - 微信支付
    APP - 支付宝、微信支付

  • 示例场景如下
    张三、李四是夫妻,两个人使用的是同一个账号(支持多设备登陆)
    他们分别在 小程序APP 登陆。
    张三在直播间下了一单,但是没有支付。
    五分钟后,张三要进行支付时,这时恰巧李四也看到了这个订单
    此时张三唤起了微信支付,李四唤起了支付宝支付
    他们都进行了支付,且支付成功了,但是会有一方的回调失败

在这样的一个场景下,应该如何避免这样的问题发生,怎样处理才是完美的

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 33

你的情况是已经生成了 订单号,

  1. 吊起支付的时候判断是否已经支付过,已支付就返回提醒
  2. 同一个单号提交支付,调起支付,发送给三方支付,这个时候需要三方支付来操作,根据他们返回的数据进行下一步操作,其中一个应该是返回已经支付的,这个时候,你就要在前台告知客户已支付订单,并去订单详情确认

如果没有创建订单,又可以多点登录,可以考虑下,给客户提示是否存在待支付的订单

用到了最终一致性,可能会用到:数据库事务,redis 锁,队列等

2年前 评论
一个人的江湖 (楼主) 2年前
kis龍 (作者) 2年前

同一个订单,再同一个网关下,不会重复支付。 现在问题是不同支付网关,重复支付的问题。其实再第三方支付回调的时候,查询到已经被支付了,且不是本渠道支付的。就设一个延时任务,几分钟再确认一下,如果是重复支付,就申请撤单就可以了

2年前 评论

后支付的那个自动退款即可

2年前 评论

外部交易号相同的话就不可能同时支付吧

2年前 评论
orange1994

你这个不用考虑了,微信给你考虑了已经。

2年前 评论
陈先生

这个就类似于 急速拼团的人数溢出情况,怎么办? 后来的退款吧

2年前 评论
一个人的江湖 (楼主) 2年前

不同支付方式这种情况避免不了,只能谁后付费谁退款

2年前 评论
一个人的江湖 (楼主) 2年前
xiaobei 2年前

单点登陆,解决

2年前 评论
一个人的江湖 (楼主) 2年前
一个人的江湖 (楼主) 2年前
MArtian 2年前
一个人的江湖 (楼主) 2年前
一个人的江湖 (楼主) 2年前
MArtian 2年前
邢闯洋 2年前
Imuyu 2年前
MArtian 2年前

加锁,调起支付就先改为支付中,这样就保证了只会有一方进行支付,顾客取消了支付就修改回去,微信支付宝取消支付都是有返回状态的。

2年前 评论

拉起支付前接口加锁,一个订单发起支付时,如果拿不到锁就意味着 「有其他相同的账号同一时间在支付相同的订单」这不就完美解决了吗?

参考
问答:我的站内有一些类似用户和用户之间转账的功能,如何保证这个功能的安...

2年前 评论
yybawang

支付前,就要写入是唤醒微信/支付宝渠道字段了,方便用户订单页可以重新支付,你只需要判断这个字段是否已经存在值了
不要说下了微信的单,用户想换成支付宝支付怎么办

2年前 评论

lockforupdate 悲观锁,当一方进行点击后,锁定该条订单,并修改支付状态(支付中)。等上一个操作完成后,改订单状态已改变,直接提示给第二个人。

2年前 评论

订单状态加一个 支付中的状态就可以了

2年前 评论

小概率事件, 人工退款即可

2年前 评论

此题无解,只能人工退款。 淘宝商家后台都得选择下单减库存还是付款减库存。

2年前 评论

后支付自动退款即可。因为你不确定先去支付的是否会成功支付。一切行为都是为了促成交易而不是阻止消费

2年前 评论

本来支付系统就是一个订单只能支付一次,你总不能换订单号吧 :neutral_face:

2年前 评论

看完评论,我有点蒙,都没理解楼主意思吗?多端支付啊,不是单一订单微信支付,增加支付中什么的体验极差,你试想一下,你打开pc支付宝支付,切换页面,换成微信支付,提示有人在支付,客户还不明白谁再支付,且这种方案无法彻底解决,所以根本方案是在支付回调中利用队列机制处理,除了第一个支付者,其余全部退还,其余方案只是优化体验,起到缓解作用

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!