商城设计要点(一)-避免重复下单

zszdevelop大约 2 分钟

商城设计要点(一)-避免重复下单

1. 简介

用户快速点了两次 “提交订单” 按钮,浏览器会向后端发送两条创建订单的请求,最终会创建两条一模一样的订单。

2. 解决方案

解决方案就是采用幂等机制,多次请求和一次请求产生的效果是一样的。

2.1 方案一:创建订单页面,预生成订单ID

利用数据库自身特性 “主键唯一约束”,在插入订单记录时,带上主键值,如果订单重复,记录插入会失败。

操作过程:

  • 引入一个服务,用于生成一个“全局唯一的订单号”
  • 进入创建订单页面时,前端请求该服务,预生成订单ID
  • 提交订单时,请求参数除了业务参数外,还要带上这个预生成订单ID
  1. mall 商城项目未采用该方案
  2. 订单id是在提交订单时sql生成

2.2 **方案二:**前端控制

前端通过js脚本控制,无法解决用户刷新提交的请求。另外也无法解决恶意提交。

不建议采用该方案,如果想用,也只是作为一个补充方案

mall商城本身也没有商城前端

2.3 **方案三:**创建订单页面,预生成token

前后约定附加参数校验。

当用户点击购买按钮时,渲染下单页面,展示商品、收货地址、运费、价格等信息,同时页面会埋上Token 信息,用户提交订单时,后端业务逻辑会校验token,有且匹配才认为是合理请求。

注意:同一个 Token 只能用一次,用完后立马失效掉。

注意:同一个 Token 只能用一次,用完后立马失效掉。

<form action="/add-name-v2" method="post">
    {% csrf_token %}
    <input type="text" name="name">
    <input type="submit" value="提交">
</form>
  1. mall 商城项目未采用该方案

  2. 此方案与方案一,异曲同工之妙,一个是数据库id,一个是临时token

参考文章

聊聊电商系统中常见的9大坑!库存超卖、重复下单、物流单ABAopen in new window

关于幂等的处理,更多解决方案可以看这两篇文章

Loading...