php 如何实现订单限时支付

1459970418
  • 39

ecshop搭建的商城,有个需求,用户下的订单需要限制两个小时内支付,如果未支付则取消订单。

本来想的是做一个cron定时扫脚本,可这不是长久之计,但是php不像java有多线程

试问该如何实现呢?

回复
阅读 11.2k
14 个回答
✓ 已被采纳

php是触发式的,
也就是说,你先保存订单生成的时间戳,状态字段为0,
到支付页面的时候,判断超时没有,如果超时,就把状态改成-1,给出超时提示,
如果没有超时,就支付,把状态改成1,如果支付成功,就把状态改成2。
搞不懂为啥要用crontab。

这个限时两小时内支付,按正常需求来说这个并不一定要特别准时吧,上下差个几分钟还是没关系的吧。

那就写个job,每5分钟去跑一次。

直接用计划任务呗。

一般做法:
写个计划任务 在Linux上面定时把满足条件的订单状态改为已取消

比较粗暴:

做个clear_ord.php 做个url_write 变成clear_ord.js

入口页面加个random,随机概率低点,看用户访问量

优雅:

redis,memcache都可以解决

显示的地方把未支付的并且时间超过两小时的显示为已取消的订单就行了。
在构造支付信息的页面也判断一下时间。

这个有点像短信验证码的有效期!memcache存储相关支付信息,设个有效期就行了吧。

支付的时候判断一下订单生成时间不就是了。查看订单列表的时候再读一下时间就OK啦。

@tiyee 说的是后端验证,我再补充一点,你用js的定时器来做一个倒计时,用户能看到还剩多长时间,你看时间到了,直接就把状态置为过期!~

提交订单时,记录一个时间,支付时,再判断当前时间 减去 提交时的时间,如果大于2小时,提示定单已过期.

数据库字段加个创建订单的时间戳,看你自己需求也可以设置过期时间戳(创建订单时间戳+2个小时的时间戳),然后读取订单的时候判断当前时间戳跟数据库的时间戳的差值就可以了。不用定时跑任务啥的。很多系统都是这么搞的

zengzhangsong
  • 1
新手上路,请多包涵

订单生成时,以订单号为key写入到redis,同时设置缓存时间两小时,支付操作时,从redis里取订单信息,如果取不到,不允许支付,这样是否能满足你的需求

如果要严格执行你想要的逻辑,就需要做定时任务,可以用cron。如果取巧,可以在查看订单的时候去修改订单状态,保证看的时候是正确的就可以了,注意最好前后台都做同样地逻辑。

composer 里有个Carbon包 可以用这个

写个mysql的事件:
set GLOBAL event_scheduler = ON;
create event event_canle
on schedule every 1 DAY
starts date_add(date(curdate() + 1),interval 3 hour)
do update order_info set o_status = 2,finish_time = unix_timestamp(now())
where ( (unix_timestamp(now()) - add_time) > 86400)
and pay_id in(2,3) and pay_status = 0 ;

宣传栏