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

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

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

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

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

3782 次点击
所在节点    程序员
42 条回复
swulling
2023-03-03 17:16:25 +08:00
最简单的方案:

在订单支付页面增加提醒:请跳转到第三方支付系统后尽快支付,如超过支付时间(剩余 x 分 x 秒),您的支付将会原路退款,商品将会释放。


复杂方案:

比如订单超时时间 是 1 小时,那么当 1 小时超过后,订单转入“已超时关闭中”状态。
这个状态内 sku 依然锁定,但是无法发起支付,但是可以接受第三方支付回调。状态持续时间比如 5 分钟或者 15 分钟都行。
如果持续时间到了,就转入“关闭”状态,释放 sku ,优惠券等。此后再接收到任何支付回调,一律退款。
wxw752
2023-03-03 17:17:20 +08:00
回调回来发现订单关闭了,会自动退款,我忘了用什么 APP 曾经遇到过。
OldCarMan
2023-03-03 17:20:04 +08:00
个人看法:
做电商的,人工处理流程基本是不可少的,极端情况下,比如你说的第三方支付延迟通知或第三方部分服务不可用导致你订单超时支付,建议走人工处理或半自动化处理(比如,自动退款同时短信通知),至于如何处理,是退款还是补偿,建议在商品规则的文案里写清楚,重点是让你们的处理方式公开透明,有理有据;

非极端情况下,只能通过技术手段不断完善整个订单支付流程,尽量避免这类事情发生,比如规划好订单状态变化流程,理清整个订单闭环操作,包括无论是手动还是定时变化。总之处理原则是理清责任归属,把有理可依作为底线处理方式。
git00ll
2023-03-03 17:24:37 +08:00
超时关单,关单后如果接到支付成功回调,则自动发起退款
mnhkahn
2023-03-03 17:30:30 +08:00
搞个状态机订单状态需要按要求流转。收到付款消息时驱动订单状态,无法驱动就需要发起退款
wu00
2023-03-03 17:35:16 +08:00
- 超时关闭任务触发时,如果订单为支付成功状态,结束本次任务
- 支付结果统一走回调处理,如果支付成功且订单为已关闭状态,走支付款原路返还流程。
- 超时任务时间设置略大于第三方支付有效期,订单创建成功及时向第三方创建支付单(不要等用户手动触发支付),尽可能避免原路返款流程
jaggle
2023-03-03 18:42:39 +08:00
@DinnyXu 你还没明白 op 的意思,op 是说支付完等待回调通知时,订单超时了,然后通知来了,这时该咋办
edis0n0
2023-03-03 18:56:17 +08:00
这种情况大公司也是经常出,要找人工客服退款
bk201
2023-03-03 18:59:13 +08:00
超时未支付,订单取消,订单取消订单系统通知给支付系统,发取消支付单指令,至于取消支付单后要做什么,压根不用订单系统去管,支付系统依据支付单的状态去做不同处理,比如支付中,那就发送取消支付单给第三方支付系统处理或者主动查询支付状态,成功就发起退款单流程,异常就发送给后台人工处理。
WindProtect
2023-03-04 09:28:54 +08:00
支付有回调的吧,回调查看订单状态,发现超时直接走退款。不过需要做好锁,不然也坑。
DinnyXu
2023-03-04 13:52:16 +08:00
@jaggle 假设我订单有效时长设置 30 秒,回调回来的时候已经超过 30 秒了? 那就计算总体库存数量呗。不可能所有人的回调都超时了吧,没超时的就把订单库存买完了啊。超时那个运气不好,自动退款就行了。
DinnyXu
2023-03-04 13:53:21 +08:00
@jaggle op 说了 2 种情况啊,我说的明显是解决第一种情况,回调超时的话处理更简单。
markgor
2023-03-05 14:21:26 +08:00
不太理解,为何支付渠道超时时间不能解决该问题?
假设系统订单超时时间为 5 分钟;

创建订单 09:00:00
用户点支付
判断当前时间是否超出 09:05:00 ,如果超过返回失败并 void 订单;
如果没超过,则用 09:05:00 - 现在时间 作为支付时间传递给支付渠道;

哪怕上面的操作有毫秒级的时间差,导致订单支付成功,但系统订单已经超时,此时回调时候判断下订单状态,如果是超时则走退款流程全款退还。
Outshine
2023-03-06 13:43:27 +08:00
@Felldeadbird 那你们商品库存也是 4 小时候才释放回去?
Outshine
2023-03-06 13:44:28 +08:00
@DinnyXu 那在订单快过期的时候去支付,用户的操作岂不是很极限?
DinnyXu
2023-03-06 14:03:34 +08:00
@Outshine 微信唤起支付那个页面,系统是不可控的,你可以去试试
Outshine
2023-03-06 14:05:43 +08:00
@markgor #33 你这个和 @DinnyXu 那个差不多,用户在订单快过期的时候去支付操作会很极限啊
DinnyXu
2023-03-06 14:12:03 +08:00
@Outshine 你说的的订单过期用户操作很极限,我给你举例个场景,你看极限不。点击支付的时候,该笔订单需要在 5 秒内支付完成,5 秒内用户已经唤起支付了,但是输入密码最后一位的时候,已经超过 5 秒了,但是这个订单其实也属于超时了对不。
DinnyXu
2023-03-06 14:15:21 +08:00
@Outshine 支付这一块,如果不想用户超时,第一个要规避的是唤起支付那用户输入密码可能会超时,还有一种是三方回调的时候可能会超时,因为根据你的说明是在回调后扣减库存,表示该笔订单已完成。回调这个地方你不能太依赖三方。特别是做这种限时的订单
Felldeadbird
2023-03-06 16:19:47 +08:00
@Outshine 是。因为我公司有一些特殊情况,客户会先下单,再过来取货。这时候店面的转 paid 。 而且这种订单锁了,再支付是一种极限状态。 不同公司有不同处理逻辑。所以我才说这个不应该程序解决,而是问上头用哪种方案。财务这玩意出问题了,你是要背锅的。

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

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

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

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

© 2021 V2EX