关于订单超时后用户却已支付的疑问

2023-03-03 16:00:44 +08:00
 Outshine

用户订单支付超时了,我现在需要:

假如用户在超时前发起了支付但是在超时后才支付成功,或者因为支付回调通知等问题导致我上面流程已经跑了一部分或跑完了,这时候该如何处理?给用户退款?

或者有啥办法能避免这个问题嘛?

3396 次点击
所在节点    程序员
42 条回复
Puteulanus
2023-03-03 16:07:17 +08:00
先将订单标记为支付超时,关闭支付的入口,但是留一点时间再进行库存这类的操作?
这段时间如果他支付了,就回滚订单状态,还是算他成功下单了
gam2046
2023-03-03 16:11:38 +08:00
一般第三方支付方的接入(支付宝、银联等)创建订单时,都是允许设置订单支付有效期的,所以原则上这口锅,第三方已经帮你解决了。

对于超售问题,可以考虑事后的对账,然后对冲超期订单。
T110E5
2023-03-03 16:15:51 +08:00
愚见:
订单过期时间假设为 A ,发起支付上送时记录时间 B ,收到支付成功回调时间为 C ,
如果 B 小于 A 时,可以发起支付,但是对于 C 是否必须小于 A ,可以看业务容忍度,有些就要求立即退款,走逆向流程,有些就认为 OK 。
或者硬给 B 时间加一个偏移,作为支付回调通知延迟送达的修正。
koloonps
2023-03-03 16:20:05 +08:00
你关闭订单的时候先锁定当前订单不让产生新的支付订单,然后关闭支付订单。最后再关闭订单
Outshine
2023-03-03 16:20:42 +08:00
@gam2046 订单超时时间是自己系统的,但是支付超时时间,是发起支付成功才开始计算的,所以并不能解决我的问题。
vibbow
2023-03-03 16:20:49 +08:00
你需要更新你自己的代码逻辑,支付成功回调后检查订单是否可用。
如果不可用的话自动退款。
zhou405x
2023-03-03 16:25:02 +08:00
1.创建订单
2.跳转第三方支付
3.订单超时,状态修改
4.第三方支付成功回调
5.订单非待支付状态
6.发起退款
Outshine
2023-03-03 16:30:24 +08:00
@koloonps @zhou405x @koloonps 有个问题就是用户在我这边订单支付超时前发起了支付,但是并没有及时支付(支付宝有 15 分钟的支付时间),那我在订单支付超时时只锁定不让用户再发起支付,在支付超时 15 分钟后再之后退还库存等操作?
Outshine
2023-03-03 16:31:51 +08:00
#8 的疑问同样适用于 #3 @T110E5 的回答
monstervivi
2023-03-03 16:36:54 +08:00
刚刚把 OP 问题,直接复制问了 ChatGPT
以下是回答,OP 可以看看是否有参考价值
---------------------------------------------------------------------------------
如果用户在超时前发起了支付但是在超时后才支付成功,或者因为支付回调通知等问题导致流程已经跑了一部分或跑完了,可以考虑以下解决方案:

如果订单库存已经恢复到商品库存并且尚未发货,可以让用户继续购买,同时将已支付的金额转移到新订单中。

如果订单库存已经恢复到商品库存并且已经发货,可以考虑给用户退款,同时要求用户退回商品。

如果订单库存还没有恢复到商品库存,可以等待支付成功后再将库存恢复,或者让用户选择退款或继续购买其他商品。

为了避免这个问题,可以在用户下单时设置支付超时时间,并在订单支付超时后自动取消订单,并将库存恢复到商品库存。同时,可以加强支付回调的监控和处理,确保订单状态的准确性。
oxromantic
2023-03-03 16:38:24 +08:00
支付超时的订单你们有需求要立刻释放库存?没有的话晚几分钟释放也没问题吧
hhjswf
2023-03-03 16:45:54 +08:00
@Outshine 你不可能不让他支付的。比如我就在摁密码界面不支付,等超时后再摁密码支付
optional
2023-03-03 16:49:08 +08:00
你先把你的状态机画出来。
按我看,订单超时了,可能 sku 都占用释放了,不一定能恢复订单了
tudouxian
2023-03-03 16:58:30 +08:00
用分布式锁吧能解决吧
zhou405x
2023-03-03 17:05:16 +08:00
@Outshine 不管什么时间什么状态 , 只要是支付成功回调的时候订单状态是正确的就 ok 了.
改状态的时候加锁 ,然后那一套代码是一个事物里的 ,不管你是本地事物还是分布式事务
Felldeadbird
2023-03-03 17:06:13 +08:00
现实问题不应该程序解决,找领导决定流程,在开发修复这个问题。

例如,产品超售时,一般钱直接退到客户的账户上。这样公司现金流多了。 如果你没有决定权,调用了退款接口。万一出错了,你要负担责任的。
Felldeadbird
2023-03-03 17:08:28 +08:00
我说一下我司的做法:
1. 订单一般存活 4 小时,4 小时内支付成功就可以了。
2. 超过 4 小时后才支付,一律不变状态。让对方找客服。财务确认后退款。
Marinaaaa
2023-03-03 17:10:52 +08:00
建议超时支付成功 自动退款。

例如:用户支付的时候使用了优惠券,订单超时取消,优惠券退回。 如果这个时候用户支付成功,订单状态改成了成功,那么这个优惠券怎么算?
DinnyXu
2023-03-03 17:14:58 +08:00
假如用户在超时前发起了支付但是在超时后才支付成功:
OP 的这个问题是:用户在下单前发起的支付,这个时候订单还未超时,常见的手机支付,微信或支付宝在唤起支付时,付钱的那一刻,也就是输入密码或者面容识别,OP 的系统是无法感知的。

举个例子:
- OP 的订单设置为 10 分钟内必须支付完成。
- 用户在 10 分钟内发起了支付,此时已经停留在输入密码的界面。
- 用户停留在输入密码的界面超过 10 分钟,并且成功付钱了,OP 需要控制的是这个过程

解决方案:在用户点击支付时(此次在输入密码的界面),进行预下单,这个时候会生成一笔订单,我对接过的支付宝和微信中有一个订单过期参数,OP 需要将这个参数设置为你的订单超时时间,这样用户停留在输入密码页面超过 10 分钟后,付钱的时候三方系统会通过你的这个超时参数判断,是不是已经超时了,从而拒绝该笔订单。
Raw778
2023-03-03 17:15:46 +08:00
一般第三方支付方都会有个 close 订单的 api 的,在你系统订单超时的时候去调用 close,这样用户会支付失败.
如果刚好卡时间点,用户支付成功回调的中途,你的系统订单超时回滚库存了,那么最好走退款流程(怕库存超卖).
不过如果你能加上分布式锁的话,应该不会存在卡时间点的情况

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/920860

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX