首页
学习
活动
专区
工具
TVP
发布

订单超时支付自动取消--实现简述

很多交易场景下的订单都会设置一个支付时间,超过该时间则会自动取消该订单(或者叫已过期),本文将会简述我是如何去实现这一功能的。...02 — 被动取消 被动取消的方式很简单:只有当用户查询订单信息时,我们再判断该订单是否超时,如果超时再进行超时逻辑的处理。...但是这种方式依赖于用户的查询操作触发,这也就是说如果用户不进行查询订单的操作,该订单就永远不会被取消。...03 — 主动取消 为了避免轮询并且在服务端主动取消订单,可以使用类似于消息队列的方式,比如 redis 的 pub/sub 服务。 ?...如上图所示,应用服务在成功提交订单支付)后,延时(时长就是支付的最大时间间隔)发布该订单到 redis 的自定义 channel ,而订单取消服务则订阅同一个 channel,一旦接收到消息则进行订单取消的逻辑处理

3.1K31
您找到你想要的搜索结果了吗?
是的
没有找到

订单超时支付自动关闭的几种实现方案

做电商,就会遇到订单超时问题,而且还经常被拿来面试提问! 今天,周末放假,抽时间给大家总结了几种订单超时支付自动关闭的实现方案。...被动取消 这种实现方案和懒加载的思想一直,就是被动的取消订单。只有当用户或商户查询订单信息时,再判断该订单是否超时,如果超时再进行超时逻辑的处理。...但是这种方式依赖于用户的查询操作触发,这也就是说如果用户不进行查询订单的操作,该订单就永远不会被取消。不会取消的订单,也就可能意味着库存可能被占用。...缺点: 会产生额外影响,比如统计,订单数,库存等产生影响。 影响用户体验,用户打开订单列表可能要处理大量数据,影响显示的实时性。 优点,同样是实现起来简单。...我们将订单超时时间戳与订单号分别设置为 score 和 member。系统扫描第一个元素判断是否超时,具体如下图所示。 ? 但是,这种实现方式,在高并发条件下,多消费者可能会取到同一个订单号。

12.8K51

订单支付

目录 前言 支付系统的作用 核心流程 架构图 代码流程 线程池中处理发送消息到MQ、持久化的数据库 支付成功后,消息分发流程图 ​订单作为消费者消费消息 测试 ---- ---- 前言 文章中的图片和在摘录不是来自一篇文章...订单支付: 用户支付订单后,需要获取订单支付信息,包括支付流水号、支付时间等。...支付订单接着就是等商家发货,但在发货过程中,根据平台业务模式的不同,可能会涉及到订单的拆分。...并不是所有的支付请求都要先经过第三方支付平台,比如支付宝;而对于微信,则还需要凭支付参数申请一个prepay_id,再经由客户端发起支付; Response,没什么好说的,第三方渠道返回的支付必要参数;...代码流程 创建支付 线程池中处理发送消息到MQ、持久化的数据库 支付成功后,消息分发流程图 订单作为消费者消费消息 测试 在测试程序中调用sendMessage 因为发送消息是在线程池中,当测试程序

1.3K40

订单支付功能测试

支付金额 1.小于最小值,如:小于0.01 2.大于最大值/金额上限 3.无实际意义金额,如0元 4.格式错误(负数、非数字) 5.余额小于实际需要支付的金额 6.超过第三方支付接口当日消费/单笔消费金额...支付接口 第三方接口,微信/支付宝/网银系统/post机终端服务 → 可以参照小鱼的这篇文章:《支付支付接口测试》 支付操作 1.指纹支付 2.免密支付 3.账号+密码支付 4.动态获取支付验证码支付...5.银行卡密支付 6.信用卡支付码 异常处理 1.退款处理 2.支付数据交换时中断(断电、断网、弱网),重新启动能否再支付 3.支付失败后如何处理 4.支付金额不足时,充值后可否继续支付 5.持续点击...6.多次扣款如何处理退款 7.取消支付/取消支付后再次支付 8.第三方支付登录时支付 兼容性 PC/笔记本/平板/手机端支付 后台处理订单 1.成功订单财务处理 2.失败订单财务处理 3.退款订单财务处理

92310

生成订单30分钟支付,则自动取消,该怎么实现?

例如 生成订单30分钟支付,则自动取消 生成订单60秒后,给用户发短信 对上述的任务,我们给一个专业的名字来形容,那就是延时任务。那么这里就会产生一个问题,这个延时任务和定时任务的区别究竟在哪里呢?...,进行方案分析 # 方案分析 (1)数据库轮询 思路 该方案通常是在小型项目中使用,即通过一个线程定时的去扫描数据库,通过订单时间来判断是否有超时的订单,然后进行update或delete等操作 实现...After 3003 MilliSeconds 00000002编号的订单要删除啦。。。。 After 6006 MilliSeconds 00000003编号的订单要删除啦。。。。...After 9006 MilliSeconds 00000004编号的订单要删除啦。。。。 After 12008 MilliSeconds 00000005编号的订单要删除啦。。。。...:订单ID为"+"OID0000001"+i); } } //消费者,取订单 public void consumerDelayMessage(){

59820

生成订单30分钟支付,则自动取消,该怎么实现?

例如 生成订单30分钟支付,则自动取消 生成订单60秒后,给用户发短信 对上述的任务,我们给一个专业的名字来形容,那就是延时任务。那么这里就会产生一个问题,这个延时任务和定时任务的区别究竟在哪里呢?...,进行方案分析  方案分析 (1)数据库轮询 思路 该方案通常是在小型项目中使用,即通过一个线程定时的去扫描数据库,通过订单时间来判断是否有超时的订单,然后进行update或delete等操作 实现 博主当年早期是用...After 3003 MilliSeconds 00000002编号的订单要删除啦。。。。 After 6006 MilliSeconds 00000003编号的订单要删除啦。。。。...After 9006 MilliSeconds 00000004编号的订单要删除啦。。。。 After 12008 MilliSeconds 00000005编号的订单要删除啦。。。。...:订单ID为"+"OID0000001"+i);         }     }          //消费者,取订单     public void consumerDelayMessage(){

57220

实现订单 30 分钟支付则自动取消,我有五种方案!

例如 生成订单30分钟支付,则自动取消 生成订单60秒后,给用户发短信 对上述的任务,我们给一个专业的名字来形容,那就是延时任务。那么这里就会产生一个问题,这个延时任务和定时任务的区别究竟在哪里呢?...,进行方案分析 2方案分析 1.数据库轮询 思路 该方案通常是在小型项目中使用,即通过一个线程定时的去扫描数据库,通过订单时间来判断是否有超时的订单,然后进行update或delete等操作 实现 博主当年早期是用...After 3003 MilliSeconds 00000002编号的订单要删除啦。。。。 After 6006 MilliSeconds 00000003编号的订单要删除啦。。。。...After 9006 MilliSeconds 00000004编号的订单要删除啦。。。。 After 12008 MilliSeconds 00000005编号的订单要删除啦。。。。...:订单ID为"+"OID0000001"+i); } } //消费者,取订单 public void consumerDelayMessage

33120

订单视角看支付

商户前端将页面跳转至该支付产品官方中间页,如果用户手机上安装了该支付产品 App,则自动唤起 App;如果安装,则继续在当前页面进入官方 H5 收银台。用户完成密码输入并支付。...完成本次支付。交易关闭接口针对需要的业务场景,支持主动取消订单(针对支付订单,已支付单可走退款流程)。- 用户发起/商户后台管理员发起订单取消申请。- 商户系统向该支付产品系统发起关闭订单请求。...四、订单支付得物订单支付交互由于监管 KYC 的要求,一笔支付单不仅需要支付相关信息的如支付方式、支付金额、支付有效时间等,也需要订单的买家信息、卖家信息、商品信息等等。...正确做法是对于 0 元订单,只走创建商户订单的流程,并直接更新订单状态,不走支付回调流程。支付订单过期时间设计在电商交易系统中有两个过期时间的概念:订单过期时间和支付单过期时间。...具体来讲,如果用户点击「去支付」创建预支付单时传递的过期时间是个固定值,那么就有可能会出现一种情况:在订单系统该订单已经过期失效了,但用户在支付平台内还能支付该笔订单(而此时支付成功回调订单系统,订单已取消

22620

使用RabbitMQ实现支付订单在30分钟后自动过期

常见业务场景:订单在30分钟内还未支付则自动取消。 该业务的其他实现方案: 使用Redis,设置过期时间,监听过期事件。...plugin 重启RabbitMQ # 业务相关代码编写(实现订单在规定的时间内还未支付则过期) 订单实体(仅保留相关字段) ? OrderEntity 订单状态枚举(仅保留相关状态) ?...调用消费者的代码在上面OrderController中,下定之后,订单数据落库,并且向MQ中投递延迟消息。可以回头看看。 消费者-监听过期的订单信息,并且将DB中相应的订单设置为已过期。 ?...100,待支付。...此时查看DB中订单状态: ? DB 订单状态为200已过期,且过期时间为2020-04-14 22:22:14 达到了订单在我们指定的时间后过期。

87830

使用swoole 定时器变更超时支付订单状态的解决方案

如果对几种方案没有很好的想法,可以先看一下延伸阅读里的其他方案,是一篇laravel china社区的讨论 借助 swoole 定时器和 redis 的 zset 来实现的定时检查并过期支付订单 起源于一个需求...:将30分钟内支付订单过期处理成已失效状态。...最常规简单的解决方案:在服务器上,跑一个定时任务,去数据表中查询数据,查到支付订单,update 一下这些数据的状态, 这些数据也可以存在在 redis 中,大致操作都是这样的。...另一种方案: 存储部分: 借助 redis 的 zset 有序集合,订单产生的时候, zadd orders timestamp orderid 将 orderid 保存到对应的 orders 集合中,

1K50

使用RabbitMQ实现支付订单在30分钟后自动过期

业务场景:订单在30分钟内还未支付则自动取消。 该业务的其他实现方案: 使用Redis,设置过期时间,监听过期事件。...- 接收延迟投递的订单 * * @param orderQueue 订单队列名称 * @return */ @Bean public Queue...调用消费者的代码在上面OrderController中,下定之后,订单数据落库,并且向MQ中投递延迟消息。可以回头看看。 消费者-监听过期的订单信息,并且将DB中相应的订单设置为已过期。...的订单在2020-04-14 22:22:04.307进行了投递,此时数据库中该订单的状态为100,待支付。...此时查看DB中订单状态: [DB] 订单状态为200已过期,且过期时间为2020-04-14 22:22:14 达到了订单在我们指定的时间后过期。

97400

面试官:生成订单 30 分钟支付,则自动取消,该怎么实现?

例如 生成订单 30 分钟支付,则自动取消 生成订单 60 秒后,给用户发短信 对上述的任务,我们给一个专业的名字来形容,那就是延时任务。...,进行方案分析 方案 1:数据库轮询 思路 该方案通常是在小型项目中使用,即通过一个线程定时的去扫描数据库,通过订单时间来判断是否有超时的订单,然后进行 update 或 delete 等操作 实现 博主当年早期是用...After 3003 MilliSeconds 00000002编号的订单要删除啦。。。。 After 6006 MilliSeconds 00000003编号的订单要删除啦。。。。...After 9006 MilliSeconds 00000004编号的订单要删除啦。。。。 After 12008 MilliSeconds 00000005编号的订单要删除啦。。。。...:订单ID为" + "OID0000001" + i); } } //消费者,取订单 public void consumerDelayMessage() {

24320

订单支付相关问题总结

由于支付宝没有对订单金额进行校验,就会导致用户能唤起支付,能支付成功,能触发服务端的回调,然后你人就离职了 #_# 所以服务端在创建订单的时候,一定要在订单表记录一下用户需要支付的金额,并在回调的时候进行金额校验...因为notify_url是异步通知的,所以就会必然存在一个问题,用户收到了支付宝同步返回的支付结果,提示支付成功了,但是这时候,服务端还没有收到异步回调,相应的订单状态还没有进行修改,用户查看订单时显示的可能还是支付状态...针对问题三,这个是无法避免的,所以在异步通知的接口中订单处理逻辑一定要做幂等。 针对问题二,起定时任务,对待支付订单主动查询支付状态进行补偿。...完美的办法(开发成本也是最高的),在用户收到支付成功后,由客户端调用接口执行订单后续逻辑的触发(加密啊、加签啊什么的都要做,为了安全),并且服务端收到调用后,也要主动去支付宝查询该笔订单支付结果,进行再次确认...并且,为了防止因服务器处理异常产生的订单没有支付成功的现象,同时启动定时任务,定时轮询待支付订单,查看支付到底有没有成功,进行补偿(会发生与客户端回调并发处理的问题,所以要加锁控制)。

56610

面试官:生成订单30分钟支付,则自动取消,该怎么实现?

例如 生成订单30分钟支付,则自动取消 生成订单60秒后,给用户发短信 对上述的任务,我们给一个专业的名字来形容,那就是延时任务。那么这里就会产生一个问题,这个延时任务和定时任务的区别究竟在哪里呢?...,进行方案分析 方案分析 (1)数据库轮询 思路 该方案通常是在小型项目中使用,即通过一个线程定时的去扫描数据库,通过订单时间来判断是否有超时的订单,然后进行update或delete等操作 实现 博主当年早期是用...After 3003 MilliSeconds 00000002编号的订单要删除啦。。。。 After 6006 MilliSeconds 00000003编号的订单要删除啦。。。。...After 9006 MilliSeconds 00000004编号的订单要删除啦。。。。 After 12008 MilliSeconds 00000005编号的订单要删除啦。。。。...:订单ID为"+"OID0000001"+i); } } //消费者,取订单 public void consumerDelayMessage(){

3.3K21

微信支付分 - 完结支付订单API

: "20191202102926" }, "total_amount": 1 } 常见请求错误返回: 错误一: { "code": "PARAM_ERROR", "message": "创建订单未填写服务结束时间...,则结束时间必填" } 解决方式: 1.创建支付订单时如果填写end_time,完结时为了省事,可以不填; 2.创建支付订单时,如果未填写end_time,完结时需要填写,而且填写的end_time...必须 > start_tim,且不能晚于调接口时间; 3.个人建议:创建支付订单时,填写start_time(OnAccept),不填写end_time; 在完结订单的时候,不填写start_time...错误二: { "code": "PARAM_ERROR", "message": "完结订单状态不合法" } 解决方式: 1.一般这种情况,可能是该订单已经完结了,无法再次完结,建议先查询支付订单状态..." } 解决方式: 1.创建订单start_time写OnAccept,end_time不填写;完结订单时start_time不写,end_time写new Date()记得格式化。

14730

面试官:生成订单30分钟支付,则自动取消,该怎么实现?

例如 生成订单30分钟支付,则自动取消 生成订单60秒后,给用户发短信 对上述的任务,我们给一个专业的名字来形容,那就是延时任务。那么这里就会产生一个问题,这个延时任务和定时任务的区别究竟在哪里呢?...- 方案分析 - (1)数据库轮询 思路 该方案通常是在小型项目中使用,即通过一个线程定时的去扫描数据库,通过订单时间来判断是否有超时的订单,然后进行update或delete等操作...00000001编号的订单要删除啦。。。。 After 3003 MilliSeconds 00000002编号的订单要删除啦。。。。...After 12008 MilliSeconds 00000005编号的订单要删除啦。。。。 After 15009 MilliSeconds 可以看到都是延迟3秒,订单被删除。...可以明显看到3秒过后,订单取消了。

1K10
领券