订单系统

月伴飞鱼 2024-09-18 10:50:32
系统设计
支付宝打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者!

如何避免重复订单

为什么会重复下单?

客户端问题

比如下单的按键在点击之后,在没有收到服务器请求之前,按键的状态没有设为已禁用状态,还可以被点击。

  • 又或者,在触摸屏下,用户手指的点按可能被手机操作系统识别为多次点击。

超时

用户的设备与服务器之间可能是不稳定的网路,这样一个下单请求过去,返回不一定回得来。

超时最大的问题是:

  • 从用户的角度,他无法确定下单的请求是还没到服务器,还是已经到了服务器但是返回丢失了。

  • 这样在等待一个超时后,UI可能会提示用户下单超时,请重复再试。

用户APP闪退/人工强退,之后重新打开重新下单

img

用幂等防止重复订单:

防止重单的关键是使用一个由客户端生成的,可用于避免重复的KEY

这个KEY可以用任意可以保证全局唯一性的方式生成,比如UUID。

  • 客户端和服务器需要使用这个KEY作为串联条件,解决去重问题。

整体流程:

用户点击 确认下单 时,客户端应该产生一个独一无二的KEY,连定订单数据发送给服务器端。

在服务器返回之前,该界面应该一直等待,直到服务器响应成功/失败或者超时发生(比如15秒后,收不到服务器响应)。

  • 如果超时发生,应该向用户提示是否重试下单或者退出该界面。

当用户点击 重试 时,应该用刚刚生成的KEY来再次发送下单请求。

  • 如果用户一直不退出这个流程,每次用户点击重试,都应该用这个KEY来重试下单。
    • 直到服务器正常返回,或者用户放弃返回。
img

考虑一种情况:

用户中途强制退出客户端,或者直接点击 返回 回到产品页,重新走下单流程。

  • 这个时候客户端就无法判断用户到底是想重新下单,还是想第二次下单。
    • 此时,可以从产品设计上考虑一下。
支付宝打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者!