php订单超过未支付,商城订单未支付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分钟,自动更改到取消状态

你可能感兴趣的:(php订单超过未支付)