商城订单未支付30分钟自动取消

1.准备工作

1.1 创建 thinkphp5.1.40 项目

composer create-project topthink/think=5.1.40 orderService

1.2 安装消息队列依赖

composer require topthink/think-queue 2.0.4 

注意:如果是TP6版本要去掉后面的版本号,TP5.1只能安装上面的包

1.3 依赖安装好以后会在config目录下生成queue.php的配置文件,直接修改配置文件如下

return [
    'connector' => 'redis',
    'REDIS_CLIENT' => 'predis',
    'REDIS_HOST' => '127.0.0.1',
];

1.4 由于配置文件内配置了 predis,所以需要安装predis

composer require predis/predis

要注意的是PHP环境必须要事先安装redis扩展,具体安装过程这里不做赘述

2.开始开发

2.1 创建任务: application/job/CloseOrder.php,在文件内添加代码

namespace app\job;

use app\common\model\Orders;
use think\queue\Job;

class CloseOrder
{
    public function fire(Job $job, $data)
    {
        // 查询订单信息
        $order = Orders::get($data);
        // 如果处于没有处于待支付状态则返回
        if ($order['state'] != 2) {
            $job->delete();
            return;
        }
        // 更新订单状态为已取消
        $order->state = 1;
        $result = $order->save();
        
        if($result!==false){
            // 如果执行成功则删除任务
            $job->delete();
        }else{
            // 重复3次都没结束则强制删除任务
            if ($job->attempts() > 3) {
                $job->delete();
                return;
            }else{
                // 延迟10秒钟再执行一次这个任务
                $job->release(10);
            }
        }


    }
    public function failed($data)
    {
        // ...任务达到最大重试次数后,失败了
    }
}

Orders为订单表的模型文件,用于操作订单表

2.2 触发任务

当事务提交成功后,执行任务处理器。在生成订单的控制器内添加如下代码

use think\Db;
use think\Queue;
.
.
.
.
// 提交事务
DB::commit();
// 30 * 60为 30分钟的秒数
// $oid为创建成功的订单ID
Queue::later(30*60,CloseOrder::class,$oid);

关于Queue的参数请参考消息队列的文档,已经解释得很清楚了

2.3 监听并执行任务

在项目根目录运行终端代码

php think queue:listen

php think queue:work

可配合supervisor使用,保证进程常驻

3 测试

前台提交订单不支付,等待30分钟,自动更改到取消状态

你可能感兴趣的:(商城订单未支付30分钟自动取消)