素材牛VIP会员
用户提交订单,30分钟后没付款取消订单功能分析
 lo***ng  分类:PHP代码  人气:2920  回帖:18  发布于6年前 收藏

我先在要做这样的功能:

用户在创建订单后,订单表中记入的是未付款状态,如果用户在30分钟后,还未付款,然后就把该订单给取消。
关于用户创建订单,30分钟后还没付款,取消该订单的逻辑是怎么实现的。
我自己的想了两个方案:
(1):客户端记入这个订单,如果在30分钟后还没有付款,就发送一个请求,调用后台的接口,来取消这个订单。
(2):服务端写个脚本,然后crontab来执行,来监控在30分钟还没有付款的订单,如果有就取消订单。

各位大神,这是我想到的两个方案,不知道合不合适,求大神们指点指点,感激不尽。

 标签:php

讨论这个帖子(18)垃圾回帖将一律封号处理……

Lv4 码徒
黑***人 JS工程师 6年前#1
  • 肯定不能依赖前端

  • 2可以

Lv3 码奴
韩***3 学生 6年前#2

普遍的做法是2,但是2比较尴尬crontab是分钟级别的。我觉得可以配合redis做一层下单时间校验。

Lv5 码农
流***雨 交互设计师 6年前#3

方案一 个人觉得是不可行的
因为没有办法控制客户端能在半个钟准时的发送一个请求来撤销你的订单。

个人建议使用方案二,定时任务脚步,一分钟执行一次
查询数据库 判断下单时间超过30分钟,取消订单。(如订单量大,不可用此方法)

另请注意,请判断好支付完成回调的验证,因为

用户下单后,20几分钟后再点击付款,再到支付页面停留,时间已经超过30分钟,然后支付成功回调时请注意判断验证回调的信息

另外希望有支付经验丰富的大哥指点指点。

Lv3 码奴
陈***半 页面重构设计 6年前#4

我刚好做过这样的功能,要看你取消订单后需不需要恢复库存了,不需要的话可以插入个结束时间来做标识,如果需要恢复库存的话可使用swoole里面的毫秒定时器swoole_timer_after来实现,如果使用的是laravel框架的话也可以使用延时队列来实现。

Lv5 码农
36***2q Linux系统工程师 6年前#5

其实没必要做成定时器之类的,你可以在订单生成的时候同时插入数据库 一个结束时间

Lv2 入门
pu***wp 其它 6年前#6

虽然不是干客户端的,但是我感觉从客户端去计算时间未免有点不靠谱吧,在下单的时候服务器就应该有信息了,然后服务端去加定时就可以了.

Lv3 码奴
起***劲 页面重构设计 6年前#7

查询的时候直接拿当前时间加上30分钟过滤,配合被动取消订单很完美的解决方案

Lv6 码匠
奇***士 移动开发工程师 6年前#8

未付款的订单都扔到临时表里,客户端去判断是否过期。

服务器做个定时任务,每天清除一次临时表的过期订单数据。没必要总是去清理。

上一页12下一页
 文明上网,理性发言!   😉 阿里云幸运券,戳我领取