支付方式有银联和微信H5支付,用户没有做单点登录,同一订单如何能防止用户同时调起第三方支付

支付方式有银联和微信H5支付,用户没有做单点登录,同一订单如何能防止用户同时调起第三方支付

JensonWang
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 18

不防,,做好同一个订单多次付款后,自动对重复的进行退款操作。

我们线上业务遇到,请求了订单支付签名后,几个小时后这个货才***去付款,

3个月前 评论
JensonWang (楼主) 3个月前
第二天堂 3个月前

严格来说无法预防,即便发起支付前取消其他支付渠道订单也会存在时间差,而且用户体验极差,做好兜底操作就行,在异步通知里面如果订单已支付,而且接收到的交易流水不一样,则认为多渠道支付,做退款处理即可,这种情况几率很小,做限制影响用户体检得不偿失

3个月前 评论
JensonWang (楼主) 3个月前

用分布式锁,看谁先竞争到。然后在支付的时候做好订单是否已支付的判断即可

3个月前 评论
Imuyu 3个月前
JensonWang (楼主) 3个月前

避免重复支付,挺难的,支付后做检测退款,这个简单点

微信/支付宝/银联支付调起

  • 支付成功,队列检查该订单所有支付,如有重复,自动退款
  • 支付失败/取消支付,不做处理
3个月前 评论
JensonWang (楼主) 3个月前

不用任何限制,京东就是多次支付,会把第一次支付作为真实支付,剩下的退款。如果要限制也可以,以前看过微信支付里面有取消订单的API,调用其它支付前先取消订单。但是银联里面不知道是否有相关接口,而且以后扩展其它支付方式也不一定有相关接口。所以还是采用不限制的方法最为通用。

3个月前 评论
sanders

如果仅允许一次支付,可以将订单关联支付单写入数据库,通过在事务中判断是否存在有效的待支付数据来阻塞新支付单的生成。

3个月前 评论
JensonWang (楼主) 3个月前

从你的需求来看,你的业务要确保幂等性操作,从后端层面来做的话:

  1. 业务层面:加锁,单体架构,redis和文件锁都可以,节点集群的考虑分布式锁,支付完成后释放锁。
  2. 数据库层面:订单表支付状态增加中间状态作为过渡,业务判断支付存在中间状态,禁止C端用户支付,缺点是增加了中间状态,业务变得繁琐。
3个月前 评论

没办法做,重复了支付只能走退款,而且这种场景很少吧,哪有人会同时用两个支付软件去付两次钱?顶多是先选微信支付,微信没钱,退回到订单页面再去用银联支付

3个月前 评论
Buffett-Cai

你对单点登录的理解有错误 :joy:

3个月前 评论
yonghuming945 3个月前

额,你这是业务逻辑没理清楚? 我用淘宝举例,我点击立刻下单,按道理应该是先生成订单,选择哪个支付的时候,按道理应该是请求后端,后端才能生成调起支付相关的操作(那么这个操作你就可以锁住这个订单就可以),但是这里还有个问题,不过我调起之后,不支付,回来选其他支付方式,按道理也是常理,应该也可以调起(不过正常操作的话,不应该很快,你可以锁定一段时间,这段时间重复调用就报错,让客户等一两分钟,按道理支付操作一分钟应该没啥问题也看你们对调起支付时设置的过期时间),当然如果有人恶意,那就让他慢慢走退款流程咯

如果是重复下单那就不是同一个订单,就不管

3个月前 评论

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