用户下订单之后15分钟支付实现_用户提交订单,30分钟后没付款取消订单功能分析...
我先在要做这样的功能:
用户在创建订单后,订单表中记入的是未付款状态,如果用户在30分钟后,还未付款,然后就把该订单给取消。
关于用户创建订单,30分钟后还没付款,取消该订单的逻辑是怎么实现的。
我自己的想了两个方案:
(1):客户端记入这个订单,如果在30分钟后还没有付款,就发送一个请求,调用后台的接口,来取消这个订单。
(2):服务端写个脚本,然后crontab来执行,来监控在30分钟还没有付款的订单,如果有就取消订单。
各位大神,这是我想到的两个方案,不知道合不合适,求大神们指点指点,感激不尽。
不知道你的客户端是什么,但是方案1很依赖客户端,订单决策不应该由客户端发起
方案2的话就要考虑你的执行密度,要知道每时每刻都会有新订单发起的,每时每刻也会有订单过期。
用一些成熟的带TTL控制的方案吧,比如redis。
我之前的做法是在每次查询这个订单时候检查过期,被动过期。
比如,查询订单细节时,再去检查是否过期然后再处理。
当然,如果这条数据不被访问可能永远不会过期,直到有人访问它。
有点像薛定谔的猫,在你打开盒子(检查订单)之后,才知道它是否过期。所以叫被动过期
客户端数据被篡改就能无限修改这个时间阈值了
肯定不能依赖前端
2可以
创建订单后,放个30分钟执行的任务到工作队列。
补充一:
工作队列具体流程:
用户创建订单A
生成30分钟后执行的任务,任务内容是:检查订单A是支付成功,如果没支付则标记为失效订单
用户支付,如果订单已失效,说明已经过了30分钟,否则标记订单支付成功
Laravel自带的队列很方便:Queues
胡思乱想:
直接用Redis的过期功能把订单删了并不好,或者要预留多一点时间,不要准确30分钟过期。
考虑这种情况:
对接微信支付,用户在29分59秒支付成功,微信在支付成功时发送异步给服务器,1.1秒后到达服务器,而这个时候订单已经被删了。
在生成微信的订单时判定一次即可。
守护进程处理
查询的时候直接拿当前时间加上30分钟过滤,配合被动取消订单很完美的解决方案
我觉得性能最好的就是高票回答,也就是和php的session过期gc回收机制一样的原理。
如果理解不了那个方法,也可以试试看redis里面加过期时间的办法,这种方法有个缺陷就是如果某个redis节点当机,可能会导致那个节点下的用户订单丢失,这个时候就需要多机同步备份了。
订单创建成功后放进redis 超时时间设置为30分钟
做个crontab定时任务 检查订单是否超过30分钟
推荐第一种方法
未付款的订单都扔到临时表里,客户端去判断是否过期。
服务器做个定时任务,每天清除一次临时表的过期订单数据。没必要总是去清理。
普遍的做法是2,但是2比较尴尬crontab是分钟级别的。我觉得可以配合redis做一层下单时间校验。
虽然不是干客户端的,但是我感觉从客户端去计算时间未免有点不靠谱吧,在下单的时候服务器就应该有信息了,然后服务端去加定时就可以了.
写个定时任务脚步,一分钟执行一次,查库操作。
查询 未支付 并且 订单生产时间大于当前时间30分钟的
每次查询10条,去执行取消订单逻辑
想到了一个 为每个订单创建一次性定时任务 以创建时间为起点三十分钟后 检查一次 处理逻辑
方案一 个人觉得是不可行的
因为没有办法控制客户端能在半个钟准时的发送一个请求来撤销你的订单。
个人建议使用方案二,定时任务脚步,一分钟执行一次
查询数据库 判断下单时间超过30分钟,取消订单。(如订单量大,不可用此方法)
另请注意,请判断好支付完成回调的验证,因为
用户下单后,20几分钟后再点击付款,再到支付页面停留,时间已经超过30分钟,然后支付成功回调时请注意判断验证回调的信息
另外希望有支付经验丰富的大哥指点指点。
最近的项目也有类似的需求。我这边是被动更新 + crond 主动更新两种方式,因为是抢购,下单扣库存,5分钟不支付马上过期恢复库存。
当碰到支付完成到回跳时,订单刚好过期的时候,直接将订单设置为待退款状态,然后走另一个定时任务完成退款。
其实没必要做成定时器之类的,你可以在订单生成的时候同时插入数据库 一个结束时间
我刚好做过这样的功能,要看你取消订单后需不需要恢复库存了,不需要的话可以插入个结束时间来做标识,如果需要恢复库存的话可使用swoole里面的毫秒定时器swoole_timer_after来实现,如果使用的是laravel框架的话也可以使用延时队列来实现。
我的思路有点不同,有类似Redis, 或者打个比方说Cookie吧(当然不能直接就用cookie)
//新创建订单后
$order_sn = '123456'; //订单号
//这个方法自己看着建立,实际项目中没有这个函数方法,这只是思路!
cookie()->push($order_sn, 1800);
//支付订单等操作时
//先检测cookie中是否还有这个订单号
if(!cookie()->has($order_sn)){
die('该订单已过期!');
}
用户下订单之后15分钟支付实现_用户提交订单,30分钟后没付款取消订单功能分析...相关推荐
- 订单失效怎么做的_30 分钟未付款取消订单,怎么做?
点击上方" 码农编程进阶笔记 ",选择"置顶或者星标" 文末有干货,每天定时与您相约! 第一次亲密接触 问题:我这边有个需求,用户下单后 30 分钟如果没付款就 ...
- 30 分钟未付款取消订单,怎么做?
点击上方" 码农编程进阶笔记 ",选择"置顶或者星标" 文末有干货,每天定时与您相约! 第一次亲密接触 问题:我这边有个需求,用户下单后 30 分钟如果没付款就 ...
- mysql查询当前用户下的表空间_oracle 如何查看当前用户的表空间名称
如何查询当前用户的表空间名称?因为oracle建立索引,需要知道当前用户的表空间,查找了一下资料 --查询语法-- select default_tablespace from dba_users w ...
- oracle将一个用户下的所有表复制到以一个用户下
在测试过程中,一般为了让测试环境与开发环境隔离,一般要球测试环境对应的数据库也与开发环境进行隔离 这时候我的做法是:先创建一个用于测试环境的用户,然后将开发环境中该用户对应的表及数据导出,再导入到测试 ...
- php redis zset 延迟队列_用PHP+Redis实现延迟任务,实现自动取消订单
简单定时任务解决方案:使用redis的keyspace notifications(键失效后通知事件) 需要注意此功能是在redis 2.8版本以后推出的,因此你服务器上的reids最少要是2.8版本 ...
- k8s aws 部署_如何在短短30分钟内使用CircleCI设置到AWS S3的持续部署
k8s aws 部署 by Adam Watt 通过亚当·瓦特 如何在短短30分钟内使用CircleCI设置到AWS S3的持续部署 (How to setup Continuous Deployme ...
- python 30分钟_一张图30分钟快速Python入门
国外一个大牛使用一张图来讲述Python的基本概念,让你30分钟快速入门.通过该程序,可以了解快速Python语言基本的语法结构和使用方法,它的基本程序如下: 当然看不懂没关系这里还有中文版的 # - ...
- 服务器可视化_疫情来袭,30分钟学会用python开发部署疫情可视化网站
2019-nCov疫情实时数据可视化--30分钟python快速版 疫情来袭,宅在家不如学习用python如何开发并部署一个疫情实时追踪可视化页面.页面预览 本文将介绍如何使用python开发网站,「 ...
- 项目review会议的步骤_进行完美的30分钟会议的6个步骤
项目review会议的步骤 几周前,我读了吉姆·怀特赫斯特(Jim Whitehurst)的电话, 禁止在< 时间>第25条"每天的习惯"中 进行为时一个小时的会议 , ...
- 有没有可以刷python题的软件_这个工具,30分钟可以把科研人一天的工作都给干完!...
原标题:这个工具,30分钟可以把科研人一天的工作都给干完! 一入科研深似海,每逢返校倍忧桑. 被 paper 和发际线上移支配的恐惧要回来了--一个假发片还够用吗? 1 文献看到眼花,科研热点总是无缘 ...
最新文章
- 【Qt】QtCreator中使用ActionManager类管理标题栏(MunuBar)、菜单(Menu)和菜单中的项目(Action)
- 滑轨声源定向的理论模型与参数估计
- HDU-5532(LIS-nlogn)
- 矩阵乘法c语言3*3,c语言矩阵相乘
- c++ map是有序还是无序的_C++ STL中Map的按Key排序和按Value排序
- java的case_java中的switch case语句使用详解
- html调用chr,FpHtmlEnCode 函数之标题过滤特殊符号的代码
- C++之父:比特币是用C++开发的,我为此感到遗憾。
- centos安装redmine项目管理系统
- 安装一直初始化_win10开机一直卡在正在准备自动修复怎么办
- phpMyAdmin view_create.php 跨站脚本漏洞
- 信息安全期末复习整理
- 手把手教你开发-滚动效果号码抽奖(QT)
- 二维码加logo demo
- 安卓桌面html便签,手机桌面便签
- 二进制转八进制公式计算机,2进制转8进制(二进制转8进制公式)
- sort 自定义排序使用方法
- python鼠标点击事件
- layer.open关闭弹窗,刷新表格
- excel给定一个日期,确定是本月的第几周