6.5. 关闭未支付订单

关闭未支付订单

上一节我们实现了创建订单的功能,在创建订单的同时我们减去了对应商品 SKU 的库存,恶意用户可以通过下大量的订单又不支付来占用商品库存,让正常的用户因为库存不足而无法下单。因此我们需要有一个关闭未支付订单的机制,当创建订单之后一定时间内没有支付,将关闭订单并退回减去的库存。

对于这个需求我们可以用 Laravel 提供的延迟任务(Delayed Job)功能来解决。当我们的系统触发了一个延迟任务时,Laravel 会用当前时间加上任务的延迟时间计算出任务应该被执行的时间戳,然后将这个时间戳和任务信息序列化之后存入队列,Laravel 的队列处理器会不断查询并执行队列中满足预计执行时间等于或早于当前时间的任务。

1. 创建任务

我们通过 make:job 命令来创建一个任务:

$ php artisan make:job CloseOrder

创建的任务类保存在 app/Jobs 目录下,现在编辑刚刚创建的任务类:

app/Jobs/CloseOrder.php

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illumi...

本文章首发在 LearnKu.com 网站上。

为了保证课程的高品质,我们需要对课程进行收费。付费后 才能观看剩余内容。 购买

上一篇 下一篇
leo
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 48

小豚兔
在 Laravel 6 中使用 predis 而不用教程中的 phpredis
7 个点赞 | 3 个回复 | 分享 | 课程版本 6.x
kdj1219
如果队列执行过程中出错,那一致性将出现问题
1 个点赞 | 9 个回复 | 问答 | 课程版本 5.5
iVerywang
Homestead 中启动 PHP artisan queue:work 没反应?
1 个点赞 | 6 个回复 | 问答 | 课程版本 5.5
PHP artisan queue:work 卡死,是在环境下的?
1 个点赞 | 4 个回复 | 问答 | 课程版本 5.5
景哥哥
一直执行队列任务?
1 个点赞 | 4 个回复 | 问答 | 课程版本 5.5
abing
队列也执行成功了,但库存数量没有加回去是么原因呢?
1 个点赞 | 3 个回复 | 问答 | 课程版本 5.8
小龙
关于队列使用场景的困惑
1 个点赞 | 3 个回复 | 问答 | 课程版本 5.5
girl-manong
使用定时计划?
1 个点赞 | 2 个回复 | 问答 | 课程版本 5.5
minororange
关于启动队列处理器?
1 个点赞 | 2 个回复 | 问答 | 课程版本 5.5
reboot
Homestead 中启动 PHP artisan queue:work 卡死的解决办法
1 个点赞 | 1 个回复 | 分享 | 课程版本 6.x
wesen
Class 'App\Models\Order' not found 异常导致无法执行 job
0 个点赞 | 14 个回复 | 问答 | 课程版本 5.5
surest
handle 未进行处理?
0 个点赞 | 10 个回复 | 问答 | 课程版本 5.5
walt-white
请问异步任务执行后,Redis 内存占用太多,怎么删除
0 个点赞 | 7 个回复 | 问答 | 课程版本 6.x
lawrencepu
创建 job 后提交订单报错是什么原因导致?
0 个点赞 | 5 个回复 | 问答 | 课程版本 5.8
Unkn0wn
PHP artisan queue:work 命令卡死?
0 个点赞 | 5 个回复 | 问答 | 课程版本 5.5
livelys
关于模型关联的问题
0 个点赞 | 4 个回复 | 问答 | 课程版本 5.7
_杭城浪子
return 不带返回参数的意义
0 个点赞 | 4 个回复 | 问答 | 课程版本 5.5
mark666
Trying to get property 'paid_at' of non-object
0 个点赞 | 4 个回复 | 问答 | 课程版本 5.5
shwfz01a
Heroku 线上环境 提交订单就关闭 教程 5 6.5 章
0 个点赞 | 3 个回复 | 问答 | 课程版本 5.8
the_panic
消息队列和监听器队列
0 个点赞 | 3 个回复 | 问答 | 课程版本 5.7
heibai_2018
DanielDu
变量 $delay 在哪定义的?
0 个点赞 | 3 个回复 | 问答 | 课程版本 5.7
xiaocao
提交订单报错.....?
0 个点赞 | 3 个回复 | 问答 | 课程版本 5.5
lzlphp
Laravel6 使用 phpredis 启动队列处理器报 class Redis not found
0 个点赞 | 2 个回复 | 问答 | 课程版本 6.x
wwwj
启动队列处理器一直执行的是 App\Listeners 的内容
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.8
断桥红颜V
延迟任务(Delayed Job)功能的原理是什么
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.7
025tao
执行 PHP artisan queue:work 值是修改了,但是会报错停止
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.7
lcyitar
延迟任务(Delayed Job)与 第三方支付 "卡时" 产生的问题?
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.7
_杭城浪子
老师 queue:work 和 queue:listen 这两个有啥区别呢
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.5
hsy
PHP artisan queue:work 也会影响其它项目吗
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.5
bestkyle
每次提交订单之后立即就被关闭了?
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.5
zengxianghua
Redis 的问题?
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.5
msmax
Laravel 安装 Redis 踩坑和 artisan queue:work 启动失败原因 [视频]
0 个点赞 | 1 个回复 | 分享 | 课程版本 6.x
lawrencepu
在 dispatch job 的时候,能不能避免使用 new 关键字呢?
0 个点赞 | 1 个回复 | 问答 | 课程版本 5.8
Zark
收货地址问题
0 个点赞 | 1 个回复 | 问答 | 课程版本 5.8
ZcZmm
Redis 队列问题
0 个点赞 | 1 个回复 | 问答 | 课程版本 5.5
user_maomin
用了队列之后是不是会延迟执行
0 个点赞 | 1 个回复 | 问答 | 课程版本 5.7
houmuxu
在 Homestead 环境安装 phpredis 扩展
0 个点赞 | 0 个回复 | 分享 | 课程版本 6.x
lvtian
提交完订单立马关闭了?坑在这里
0 个点赞 | 0 个回复 | 分享 | 课程版本 5.8
不负韶华。
加库存没执行?
0 个点赞 | 0 个回复 | 问答 | 课程版本 5.7