技术解析

如何避免同一笔订单被不同支付平台支付
0
2021-06-10 21:59:20
idczone
问题:根据用户选抗投诉服务器择的支付方式生成二维码,如果用户在支付过程中更改支付方式,如何避免同一笔订单被不同支付平台重复支付?
思考:目前的想法是切换支付方式的同时,关闭上一次的支付订单。
支付平台:微信、支付宝;支付方式:扫码支付( scan );支付结果:支付平台回调。

你的想法没错,就是通过关单的方式

楼上说的不错 关单方便
还有一种 退款

我个人更推荐的方式,既点击支付的时候同时开单支付宝、微信,并返回二维码。
这样的优势是切换时没有延时,且 0 服务器端压力。
然后每天走账的时候提示操作员进行手工确认退款操作。

如果关闭支付订单,用户选择 微信->支付宝->微信,第二次选择微信支付时将不能创建二维码,提示订单已关闭。
退款也是一种四路,但可能权限不允许。

我记得以前遇到这种问题的时候,还拿美团外卖试验过,下一单然后两台手机同时支付。美团的做法的是,两边都可以成功支付,支付后给其中一方退款。设计一下这个支付后的检测重复支付退款逻辑就好了

每次点击支付都是新下一个支付订单,关闭旧支付单(如果同一种支付方式则继续使用),这种需要区分下系统订单和支付订单,做关联

如果实时性比较高,支付时是比较难避免重复付款,因此需要设计对账、对冲。
即假设本地业务系统的支付流水在数据库中分别保存与不同支付渠道的支付流水号对应关系,在业务低谷期(如次日凌晨),检索当日所有所有支付流水对应的第三方支付流水,是否存在多笔支付成功的第三方对应一笔流水号,如果存在将时间靠后的做自动退款。如果真的毫秒级都时间相同就按自定义顺序退款(如先尝试退微信,后退支付宝)。
这是每日的对冲,每笔第三方支付成功回调时,也可以即刻检查本地的业务流水号是否已经被其他支付渠道标记支付成功,如果有就直接退款,当然这种方法对自身业务系统的并发设计能力较高,而第一种就简单一些,无脑收钱,次日对账,多了再退。

退款更优

你是知乎挖坑的吗
pay.weixin.qq.com/wiki/doc/api/img/chapter8_3_1.png
微信异步回调你, 你发现订单被 zfb 占坑了, 就微信退款 api
以及在返回 App 后你去查单, 发现微信支付成功但 zfb 占坑了, 就微信退款 api

多次支付成功 ,把多支付的退款就行了。

支付回调检查订单支付状态,已支付就退款
没法绝对避免的

关单没错的

前端不管,后端支付的时候判断下是否是重复支付不就可以了?

切换支付方式关单, 解决不了用户有多部手机, 别想了, 不对的

按支付类型生成支付行,每个订单可能存在多个支付行。
在支付回调完成订单时,关闭其他支付行。

订单和支付单,要分开。如果同时发起支付宝和微信回调。那么如果订单标记完成,支付链完整,可以退款另一个支付单。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服