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订单超过未支付,商城订单未支付30分钟自动取消相关推荐

  1. 处理类似于12306订单30分钟自动取消?

    我们的QQ群606700249有人提到 如下问题  处理类似于12306订单30分钟自动取消? 做个redis hash结构的 ( 用户 id,   订单号id, value是个对象obj  ) ,  ...

  2. Redis key过期事件监听实现 - 30分钟自动取消未支付订单

    目录 一.前言 二.实现方案分析 三.Redis key过期事件方案实现步骤 3.1 Redis 安装步骤详见 3.2 修改 Redis 配置 3.3 在获取支付链接视图中设置key过期事件 3.4 ...

  3. 秒杀情况下,用户下单扣除库存创建订单之后,迟迟不付款,时间到了自动取消订单(思路)

    秒杀情况下,用户下单扣除库存创建订单之后,迟迟不付款,时间到了自动取消订单 解决方案1. 使用redis实现 1.下单之后把生成分布式全局唯一id,把订单id放进redis中,设置一个过期时间 2.定 ...

  4. 6-1 停车场收费问题 (20分) 在停车场收费系统中,收费者会根据车型的不同按不同的单价和计费方式收取不同的停车费,其中: 轿车Car:每小时8元,超过30分钟按一小时计算,未超过30分钟不收费

    作者徐婉珍单位广东东软学院代码长度限制16 KB时间限制400 ms内存限制64 M 作者:TOPKK **在停车场收费系统中,收费者会根据车型的不同按不同的单价和计费方式收取不同的停车费,其中: 轿 ...

  5. java实现订单未支付失效_未支付订单30分钟后,自动取消

    未支付订单30分钟后,自动取消 生成订单时发起延时30分钟的任务 /** * 取消订单的任务 * @Title: startCancelOrderTask * @Description: 取消订单的任 ...

  6. 【项目实战】Redis使用场景之待支付订单自动取消、订单自动收货

    一.使用背景 很多业务场景,例如订单过期自动删除,订单几天后自动好评,这些常用操作可以通过定时任务,数据库轮询做,但是订单量大的情况可能会对数据库产生大的压力. 二.Redis的key过期推送功能原理 ...

  7. 1.超时未支付订单处理

    1.超时未支付订单处理 1.1 需求分析 超过限定时间并未支付的订单,我们需要进行超时订单的处理:先调用微信支付api,查询该订单的支付状态.如果未支付调用关闭订单的api,并修改订单状态为已关闭,并 ...

  8. 阿里二面:针对一个100W/秒的未支付订单取消场景,说说你的解决方案

    在工作或面试时,常常被问起关于消息队列.MQ或延时消息场景相关的问题. 最常见的延时消息场景,一般有以下几个: 下单后超过30分钟未支付,后台自动取消订单: 订单超过48h未评论,系统自动生成一条好评 ...

  9. 商城订单中心实现及用户关单实现思路

    商城订单中心实现及用户关单实现思路 一.订单服务 1.1.订单中心 1.2.订单构成 1.3.订单状态 1.4.订单流程 1.5.订单幂等性处理 1.6.订单业务流程 二.关单方式 2.1.Rabbi ...

  10. 谷粒商城--订单服务--高级篇笔记十一

    1.页面环境搭建 1.1 静态资源导入nginx 等待付款 --------->detail 订单页 --------->list 结算页 --------->confirm 收银页 ...

最新文章

  1. 串口 发送 接收 高位_电工进阶PLC大神,必备PLC串口通讯的基本知识!
  2. 360推两款无刘海新机,主打安全和AI,起售价1199
  3. pandas使用replace函数和正则表达式移除dataframe字符串数据列中尾部指定模式字符串(Removing trailing substring in dataframe)
  4. Ubuntu 设置Android adb 环境变量
  5. python提高办公效率-用Python的这3个优点,让工作效率提升一倍
  6. 将一列数据转换成一个字段数据,逗号分隔
  7. Python学习笔记之类型判断,异常处理,终止程序操作小结
  8. 计算机科学与技术的专业论述,关于计算机科学专业的论文题目 计算机科学专业论文题目怎样定...
  9. 一张图看懂python编程
  10. 百度论文引用网络节点分类比赛
  11. 2021年C++项目中的十大Bug:乍一看都正确的代码,实则暗藏玄机
  12. Visual Basic 6.0精简版下载地址
  13. Excel汇总大师破解版 v1.6.8 免安装绿色版 Excel合并拆分
  14. 服务器gpt安装系统bios设置,系统安装的两种模式:UEFI+GPT、BIOS+MBR-网络教程与技术 -亦是美网络...
  15. 像电影里黑客高手一样写代码
  16. 【英语音节输入软件】模仿汉语拼音
  17. matplotlib 绘制图中图
  18. Derek Sivers:我是一个慢思考者(译)
  19. office2016和Visio2016安装冲突的解决办法(后附安装包链接)
  20. 用计算机研究甲骨文,基于图像识别技术的甲骨文数据系统

热门文章

  1. Solr高级查询Facet
  2. 前端开发工程师 - 02.JavaScript程序设计 - 第2章.进阶篇
  3. Java调用微信支付代码
  4. Volatility 工具分析
  5. ubuntu16.04火狐浏览器B站提示下载flash插件
  6. unity3d新手入门必备教程
  7. php调用和风天气api,推荐一个免费7天天气预报API服务:和风天气
  8. python语音控制地图导航_基于python语音控制大疆创新EP机器人并进行对话——第一步学会录音...
  9. 四个月宝宝厌奶期症状?
  10. 【摘抄】领导力21法则-约翰·C·马克斯韦尔