1.如何防止订单重复提交

102 阅读2分钟

1.背景

2.问题原因

为什么会重复下单? 原因1:用户端原因:按钮点击过快,导致发出重复订单请求 原因2:网关层接收响应超时重试,但是服务器处理完成(此时落表完成)

3.解决方案

(1) 用户端短时间内发起重复请求

这种情况可以通过防抖、节流对button实现点击一次发出请求后,实现disabled禁止操作。

(2) 通过预生成全局唯一订单号

我们重复生成订单问题和用户自身想多次生成订单的区别,但是在数据库种都是自生成id递增的,因此会把重复点击/超时重试的接口当成多次下单。

因此我们需要在数据库中将这两种下单方式区分开。即数据库中不是通过自增的id作为主键,而是进入订单页面的时候,就预先生成一个订单ID(前端生成、后端生成),然后在提交的时候就将这个预生成id一起提交给后端。后端会先去表中校验是否表中已经有了这样一个hash-key。如果存在我就认为这属于“订单重复下单”,如果不存在就属于“多次选择同样商品的订单”。

因为如果我们后端处理成功落表成功,但是响应失败或nginx超时失败,前端依然是停留在当前提交页面,那么用户即使再次点击提交(幂等请求),但是这次请求和上一次请求带入的预生成id是相同的,表中已经存在这样的id,因此认为是重复提交。

但是提交成功的页面一定会跳转到详情页面,那么用户如果再次新建订单,那么刚进入页面一定会请求后端接口生成一个新的预生成ID,那么表中也不存在这个id。