>  Q&A  >  본문

php - 用户提交订单,30分钟后没付款取消订单功能分析

我先在要做这样的功能:

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

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

PHP中文网PHP中文网2772일 전5406

모든 응답(18)나는 대답할 것이다

  • 阿神

    阿神2017-04-10 18:10:37

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

    회신하다
    0
  • PHPz

    PHPz2017-04-10 18:10:37

    写个定时任务脚步,一分钟执行一次,查库操作。
    查询 未支付 并且 订单生产时间大于当前时间30分钟的
    每次查询10条,去执行取消订单逻辑

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-10 18:10:37

    想到了一个 为每个订单创建一次性定时任务 以创建时间为起点三十分钟后 检查一次 处理逻辑

    회신하다
    0
  • 阿神

    阿神2017-04-10 18:10:37

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

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

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

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

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

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-10 18:10:37

    最近的项目也有类似的需求。我这边是被动更新 + crond 主动更新两种方式,因为是抢购,下单扣库存,5分钟不支付马上过期恢复库存。

    当碰到支付完成到回跳时,订单刚好过期的时候,直接将订单设置为待退款状态,然后走另一个定时任务完成退款。

    회신하다
    0
  • PHPz

    PHPz2017-04-10 18:10:37

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

    회신하다
    0
  • ringa_lee

    ringa_lee2017-04-10 18:10:37

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

    회신하다
    0
  • PHPz

    PHPz2017-04-10 18:10:37

    我的思路有点不同,有类似Redis, 或者打个比方说Cookie吧(当然不能直接就用cookie)

    //新创建订单后
    $order_sn = '123456'; //订单号
    
    //这个方法自己看着建立,实际项目中没有这个函数方法,这只是思路!
    cookie()->push($order_sn, 1800);
    
    //支付订单等操作时
    //先检测cookie中是否还有这个订单号
    if(!cookie()->has($order_sn)){
        die('该订单已过期!');
    }

    회신하다
    0
  • 취소회신하다