用户点两次提交按钮生成两个订单扣两次钱,加接口幂等处理,再也没出过重复单

14年前 (2012-09-19)阅读1回复0
genmulu
genmulu
  • 管理员
  • 注册排名1
  • 经验值27950
  • 级别管理员
  • 主题5590
  • 回复0
楼主

新手写支付、下单接口,用户网络卡,点了两次提交按钮,结果生成了两个订单,扣了两次钱,客户投诉过来,才发现接口没做防重复提交。其实这就是接口幂等性的问题,同一个请求重复发,结果只能生效一次。

最常见的场景,用户点提交按钮,网络慢,以为没点上,又点一次,前端发了两次请求,后端没做处理,就生成两个订单。我之前做个商城下单接口,用户点了两次,生成两个订单,客户付了两次钱,来找客服退款,折腾了好久。之后给所有提交接口加了防重,同一个请求参数,短时间内只能生效一次。

实现起来特别简单,用户提交的时候,前端生成一个随机的请求id,带着这个id发请求,后端收到请求,先看这个id是不是已经处理过了,如果处理过了,直接返回上次的结果,别重复执行。前端按钮点完之后立刻置灰,别让用户点第二次,双保险,就算网络慢,用户也点不了第二次。

还有支付接口,一定要做幂等,不然用户付一次钱,后端收到两次支付通知,给用户发两次货,亏的是自己。支付通知的接口,拿到支付单号之后,先看这个单号是不是已经处理过了,处理过就别重复发货。很多新手只在前端做按钮置灰,后端不做处理,用户抓包重复发请求,还是会重复下单。

我现在写所有会修改数据的提交接口,第一步就加幂等处理,同一个请求10秒内重复提交,只生效一次,再也没出现过重复订单、重复扣款的问题。很多新手写接口只考虑正常流程,不考虑用户多点几次、网络重试、抓包重复发的情况,等出了资损问题,再补逻辑,钱已经亏出去了。

本站源码来源于网络收集修改或者交换,甚至可能并非原创,如遇未经考证信息需持审慎态度。若有疑问,可联系本站处理。

本文地址:https://www.genmulu.cn/genmulu/5492.html

0
回帖

用户点两次提交按钮生成两个订单扣两次钱,加接口幂等处理,再也没出过重复单 期待您的回复!

取消
载入表情清单……
载入颜色清单……
插入网络图片

取消确定

图片上传中
编辑器信息
提示信息