我先在要做这样的功能:
用户在创建订单后,订单表中记入的是未付款状态,如果用户在30分钟后,还未付款,然后就把该订单给取消。
关于用户创建订单,30分钟后还没付款,取消该订单的逻辑是怎么实现的。
我自己的想了两个方案:
(1):客户端记入这个订单,如果在30分钟后还没有付款,就发送一个请求,调用后台的接口,来取消这个订单。
(2):服务端写个脚本,然后crontab来执行,来监控在30分钟还没有付款的订单,如果有就取消订单。
各位大神,这是我想到的两个方案,不知道合不合适,求大神们指点指点,感激不尽。
阿神2017-04-10 18:10:37
方案一 个人觉得是不可行的
因为没有办法控制客户端能在半个钟准时的发送一个请求来撤销你的订单。
个人建议使用方案二,定时任务脚步,一分钟执行一次
查询数据库 判断下单时间超过30分钟,取消订单。(如订单量大,不可用此方法)
另请注意,请判断好支付完成回调的验证,因为
用户下单后,20几分钟后再点击付款,再到支付页面停留,时间已经超过30分钟,然后支付成功回调时请注意判断验证回调的信息
另外希望有支付经验丰富的大哥指点指点。
高洛峰2017-04-10 18:10:37
最近的项目也有类似的需求。我这边是被动更新 + crond 主动更新两种方式,因为是抢购,下单扣库存,5分钟不支付马上过期恢复库存。
当碰到支付完成到回跳时,订单刚好过期的时候,直接将订单设置为待退款状态,然后走另一个定时任务完成退款。
ringa_lee2017-04-10 18:10:37
我刚好做过这样的功能,要看你取消订单后需不需要恢复库存了,不需要的话可以插入个结束时间来做标识,如果需要恢复库存的话可使用swoole里面的毫秒定时器swoole_timer_after来实现,如果使用的是laravel框架的话也可以使用延时队列来实现。
PHPz2017-04-10 18:10:37
我的思路有点不同,有类似Redis, 或者打个比方说Cookie吧(当然不能直接就用cookie)
//新创建订单后
$order_sn = '123456'; //订单号
//这个方法自己看着建立,实际项目中没有这个函数方法,这只是思路!
cookie()->push($order_sn, 1800);
//支付订单等操作时
//先检测cookie中是否还有这个订单号
if(!cookie()->has($order_sn)){
die('该订单已过期!');
}