糟糕,订单超时关闭成功,用户也支付成功了,我该怎么办?

在电商及金融类的系统中,用户在下完单之后没有立即付款,订单处于未支付状态,默认情况下订单会有30分钟或者1小时左右(具体时间可以设置)的超时时间。在此期间用户可以选择立即付款,支付成功后订单进入待发货状态,等待商家发货。若超过规定的付款时间,那么订单会被关闭,库存及使用到的优惠(包含优惠券、积分)都将会被返还。那么如果订单超时时间到期需要关闭订单,并且此时正好用户也支付成功了,对于订单服务来说该如何处理呢?

明确订单终态

正常情况下,支付业务只有支付成功和支付失败(用户取消)两种状态,两者中必有一个能进入到终态。必须明确一点的是,无论哪一个都代表着业务的最终态,不能被改变。如果终态随便转换,那么在设计上一定是不合理的。

业务处理

有两种情况:

  • 第一种: 用户支付成功处理成功,订单超时关闭处理失败;
  • 第二种:订单超时关闭处理成功,用户支付成功处理失败。

针对上面的这两种情况,如果用户已经支付成功,面对订单超时关闭的请求可以直接拒绝,也符合正常的业务逻辑。不过,要是出现订单超时关闭成功,但支付成功处理失败了,这样的情况该如何处理呢?用户的钱怎么处理?原路返回吗?

没错,就是原路返回。订单超时关闭了,用户支付成功会触发支付回调,开发人员可以在回调处理的过程中,如果发现订单已经被关闭了,那么就得触发退款流程,把钱退给用户。 这样,即使订单超时关闭了,但是用户付过的钱已经退回了,对用户来说也并不存在损失。

注:退款流程可能存在失败的情况,开发人员需要做好幂等以及兜底方案。

对账机制

类似这些与支付有关的业务,引入对账机制是必要的。根据支付流水以及支付单的状态以及用户的支付、退款情况,逐一比对(支付金额=冲退金额)。如果发现不一致的情况,要根据用户的实付金额进行退款重试,直到完全一致。

加锁

具体来说就是出现了并发问题,无论是用户支付成功回调还是订单即将超时关闭订单,在执行业务逻辑之前,都需要加锁控制,并且一定是分布式锁。谁抢到了这笔单子的锁,谁先处理,没抢到的只能等待下次重试。这样做不仅能够解决并发问题,而且也能够避免异常情况的出现。

总结

上面的方案整体看下来,能够很好的解决订单超时到期关闭,同时用户也支付成功出现的并发问题,不过除此之外,仍需做好幂等以及兜底方案,确保实际业务系统能够正常稳定运行。OK,今天就先分享到这里,感兴趣的朋友可以帮忙点点关注、点点赞,非常感谢!下篇文章再会~~

相关推荐
小码哥_常3 小时前
MyBatis-Plus:让数据库操作飞起来的神器
后端
2301_811274314 小时前
基于SpringBoot的智能家居管理系统
spring boot·后端·智能家居
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题】【Java基础篇】第15题:JDK1.7中HashMap扩容为什么会发生死循环?如何解决
java·开发语言·数据结构·后端·面试·哈希算法
舒一笑4 小时前
我把设备指纹生成逻辑拆开了:它到底凭什么区分不同设备?
后端·程序员·掘金技术征文
Nicander4 小时前
多数据源下@transcation事务踩坑
java·后端
郑州光合科技余经理4 小时前
同城O2O海外版二次开发实战:从支付网关到配送算法
开发语言·前端·后端·算法·架构·uni-app·php
sjsjsbbsbsn5 小时前
大模型核心知识总结
java·人工智能·后端
Moment6 小时前
2026 年,AI 全栈时代到了,前端简历别再只写前端技术了 🫠🫠🫠
前端·后端·面试
白晨并不是很能熬夜7 小时前
【PRC】第 2 篇:Netty 通信层 — NIO 模型 + 自定义协议 + 心跳
java·开发语言·后端·面试·rpc·php·nio
zshs0007 小时前
#从偶发无字幕到补偿探测链路:一次 B 站字幕导入问题的完整收敛过程
java·后端·重构