03 系统面临的现实问题:订单退款流程失败以及订单支付超时问题
Posted 鮀城小帅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了03 系统面临的现实问题:订单退款流程失败以及订单支付超时问题相关的知识,希望对你有一定的参考价值。
1.回顾支付后的业务流程
支付成功后要做的业务如下图,包含扣减库存、通知发货、更新积分、发放优惠券、红包、push通知、更新订单状态等。
2.退款流程
有下单,也就有退款,这是订单支付的反向流程。
分析:
- 下单时,支付之后会发放优惠券、红包、积分,还会通知第三方发货等,那么现在退款了。
- 这些相关的福利也该退回才是,也就是说,退款之后要归还优惠券、积分、红包等。
退款需要做的事:
- 重新给商品增加库存
- 更新订单状态为“已完成”
- 减少你的积分
- 收回你的优惠券和红包
- 发送push告诉你退款成功了
- 通知仓储系统取消发货
最重要的,退款需要调第三方支付系统把钱重新退回去
3.存在的问题
问题一:退款和支付存在一样的问题,流程太长,子步骤太多,如果用户点击退款后执行那么多步骤,等到响应回去可能要好几秒,这种体验很差。
问题二:退款失败怎么办?这是很可能存在的。至于原因:可能第三方支付系统的问题,也可能是网络原因导致调用失败。
4.下单不支付问题
用户下单的同时锁定了库存,在跳转支付页后,用户放弃了支付。如果用户一直不付款,是不能一直放着的,因为锁定了库存,导致对应的库存商品不能被其他用户购买。
所以,一般下单后,对订单都应该有一个未支付的过期时间,如果过了这个时间没有支付,就将订单取消(无效化),同时将锁定的库存归还。
5.订单支付状态处理方案
当前给出的方案是:后台线程不断扫描的方式
系统后台启动一个线程,专门去扫描数据库中待付款的订单。发现超过24小时未支付的,将状态改为“已关闭”,并释放库存。
问题:如果有十几万个订单没有付款,难道就全部扫描一遍吗?
答:这是不可能的,这种后台线程不断去扫描十几万订单的方式效率是很低的。
参考电商小程序给出的方案:
- redis的键空间通知机制实现定时调度取消订单
- rocketmq的延迟队列实现定时调度取消订单
以上是关于03 系统面临的现实问题:订单退款流程失败以及订单支付超时问题的主要内容,如果未能解决你的问题,请参考以下文章
RocketMQ - 基于延迟消息机制优化大量订单的定时退款扫描问题
39 生产案例:基于延迟消息机制优化大量订单的定时退款扫描问题示例代码