【大厂面试题】如何避免订单重复提交和支付?

作者: 程序员鸡翅分类: 软件应用 发布时间: 2022-06-04 22:00:00 浏览:28727 次

【大厂面试题】如何避免订单重复提交和支付?

淺山藏:
这类的问题可以归结为怎么保证接口的幂等性。 1,前端处理 2,后端接口参数验证 3,token 4,数据库的唯一约束,或者记录操作表或字段 5,第三方工具,如redis,zk,感觉和处理分布式锁差不多的原理。

【回复】回复 @战栗de小马达 :我不这么认为,幂等的定义是,无论请求多少次,所造成的结果一样。token不满足,更多的是防重。前端和幂等更没什么关系了。幂等针对api
【回复】和幂等还是有区别的,可以看到只有支付那块用到了幂等
【回复】回复 @经典鸡翅 :这种业务场景好像不需要防重吧,或者说防重没多大作用,只要保证幂等就可以了
_Consume:
鸡翅老哥。我做的项目里做了支付接口幂等性,但没有用到令牌桶。处理逻辑是当用户提交订单时使用雪花算法生成一个全局唯一的订单号,然后返回给前端这个订单号。同时把这个订单号发给mq,做一个超时的处理。当用户支付的时候带着这个订单号,通过redis分布式锁setnx命令,如果成功的话就代表第一次请求,继续业务操作。第二次setnx就会失败,保证幂等性。这样解决方案可行么

【回复】回复 @经典鸡翅 :确实是这样。我看老哥的视频,解决重复提交订单的时候,前端会去获取token,是前端先发起一个获取令牌token的请求,然后再携带这个token去发起订单提交请求。如果前端没有获取到,就不用发送订单提交请求,如果获取到了令牌,后端再校验这个令牌的合法性,合法之后再交到订单生成接口。是这样么?
【回复】回复 @_Consume : 前端要发起多个获取token的请求该怎么办呢?
【回复】回复 @我头发真多啊 : 我也没太想明白这个问题,我两次点击过快,不是两个不同的请求吗,岂不是获取到两个不同的token了?
星之所在丶约:
用户进入支付订单,还没真正完成支付就马上修改支付中状态吗?如果用户直接异常退出,重新登录想支付的时候不就支付不了吗?支付中的状态怎么切换回待支付呢?

【回复】回复 @狐狸彡汾潶 :而且就算做了互斥性登陆也没用,必须前端实时去检查token有效性,如果支付平台的支付界面必须要跳转到银联h5进行完成支付的话更加,前端连token检查都没用。只能说一般大多数软件都不需要考虑重复支付的问题,很少出现这种场景,就算出现大不了私下解决。只有用户量大的软件才需要考虑重复支付的问题
【回复】回复 @星之所在丶约 :老哥,不知道你能不能看到这消息,你说的这个问题可以采用分布式锁解决,首先订单的产生肯定是在点击提交订单后,此时订单状态待支付,并且加上分布式锁,待支付状态的订单操作时都需要获取锁才能操作,这样就能解决你说的这个问题了
【回复】回复 @狐狸彡汾潶 :所以说只能是在第三方支付平台回调的时候,主动做重复支付的退款操作
拯救鄙站:
想问下大佬: 1.后端防抖的令牌token,和用户登录获取的token是同一个不,还是服务器自己单独为了实现订单业务生成的token啊 2.后端防抖,这么做可以吗,根据下单用户uid+商品id作为key,利用这个key来实现分布式锁,过期时间是3s,然后不主动删除 这样的话,用户在3s内,只能下一个订单

芳华QAQ:
如果支付平台没有回调,主动去查第三方支付平台,订单还未处理完,那么就会出现本地订单状态未更新,而实际上支付平台订单已支付完成的情况,最后客户付了钱,而本地订单状态未改变的问题如何解决?

【回复】搞个定时任务,刷新第三方回掉的缓存[doge]成功直接给客户提示
坏小福啊:
前端可以获取到token,通过接口方式也可以先获取token再调用下单接口,这个还是防不住

雨田zzz:
还没做过订单支付类项目,好奇问一下,第三方支付支付成功后,出现网络故障,拿不到结果,这种怎么办啊?一直卡支付中吗?如果取消的话感觉会很麻烦。 还有同一个用户,可以同时在两个浏览器登录吧,这两个token值应该是不同的,这里确保同一用户只能有一个订单,给用户id加分布式锁会不会更好。

bili_37207750924:
有分布式锁了为啥还需要token啊,或者说有token了为啥海需要分布式锁啊

Parxival:
“5秒后主动查询订单”这个具体怎么实现呢?

87村长:
重复生成订单好像也不会影响业务对吧

唐诗三千句:
这里提交订单的时候,锁定当前人吗? 如果存在当前人的key,就说明是重复操作?

bili_54125922104:
整体流程:1,防重提交【防抖+token】。2,检查库存【超卖问题,cas+lua】。3,生成订单【少买问题,重试+补偿】。4,订单待支付【延迟队列】5,订单支付中【重复支付,cas 】

澡堂一条龙:
分布式锁也可以用来判断订单状态。鸡翅的意思是不是加锁后将订单状态修改为支付中,订单状态修改后这个锁就可以释放了,否则感觉单独记录一个订单状态是有点多余的

又菜又爱写bug的码农:
我的想法是把创建订单参数用md5算法生成一个key做为redis分布式锁key,并设置一个过期时间

程序员 学习 编程 实战 Java Java面试题 大厂面试题 打卡挑战 必剪创作 科技猎手计划2022第二季

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

更多相关阅读