问一个关于订单模块的问题

2019-12-22 22:42:36 +08:00
 quan7u

我目前负责开发一个公司小程序的拼团功能,把之前同事写的下单流程看了一遍。

确认他并没有考虑到一个并发情况:

1、用户支付后,系统等待微信支付的支付通知回调。

2、目前订单超时功能是用 Redis 过期通知做的,订单支付超时回调订单关闭的方法。

若两个方法同时触发,岂不是有并发的问题?

我目前给两个方法都加了 Redis 锁,锁订单——>判断订单状态——>执行业务

订单关闭也先查询了订单支付状态。

但是这样会出现用户支付后,微信没回调,Redis 键过期,把订单给取消,微信支付成功回调会把这笔钱退款。(我猜想的...目前还没出现这种情况)

感觉这样的交互体验并不理想,各位有做支付的是怎么设计或者处理的呢?能指点一二吗?

2547 次点击
所在节点    程序员
13 条回复
airyland
2019-12-22 22:49:10 +08:00
1.前端用户支付后让后端主动向微信支付发起支付确认查询
2.订单关闭前去微信支付查询订单支付状态,如果为支付,则不关闭并更新支付状态
mlboy
2019-12-23 06:30:21 +08:00
异步通知逻辑中增加判断订单是否关闭判断,如果关闭了则原路退。另外,根据业务理解一般都是希望支付的,其实可以用支付成功的状态直接刷掉关闭的状态
xuanbg
2019-12-23 09:06:04 +08:00
不需要锁。调用支付接口时判断下状态是否已关闭,回调回来不用判断是否已关闭,直接改状态为已支付就好了。
changdy
2019-12-23 09:10:32 +08:00
233 看到 Redis 过期监听 滚进来了.

Redis 的过期策略并不准确 , 不能保证 key 在指定时间内进行过期通知 ,

建议: 如果量不多的话 可以 单独搞一台 redis 做过期通知 , 多的话...那就不要用这个功能
quan7u
2019-12-23 10:00:22 +08:00
@changdy 已在官方文档看到[明显延迟]的说明,学到了
quan7u
2019-12-23 10:03:38 +08:00
@mlboy @xuanbg 关于支付异步通知直接覆盖超时支付造成的[取消]订单状态,前端页面需要不停轮询?不然用户没有及时刷新页面,就会有支付了订单却被取消的情况。
mituxiaomanong
2019-12-23 10:42:58 +08:00
我遇到过。
订单未支付状态 15 分钟取消,
客户付款后,微信支付回调 超过了 15 分钟,订单被伪删除。
微信支付回调 没检查订单是否被伪删除,所以产生结果:
订单业务正常,就是被删除了。

最简单解决:设置更大的订单取消时间
实际解决方案:取消订单前查询微信订单状态,如果支付中不取消订单
mituxiaomanong
2019-12-23 10:43:53 +08:00
这种情况 很少发生。 主要取决于微信支付那边😂
quan7u
2019-12-23 10:58:00 +08:00
@mituxiaomanong


哈哈,我目前也是取消前查询订单状态,不是已支付的话就主动关闭订单。


不过微信支付文档[统一下单]API 的状态机并不对应[查询订单]API 的状态...所以我有点迷惑,不知道这个[支付中]对应的场景.....
519718366
2019-12-23 12:54:37 +08:00
冰菓,奉太郎?!我很好奇!
IamUNICODE
2019-12-23 13:12:47 +08:00
定时取消,但是回调来了就把原来取消的状态刷成已支付就行了
Dganzh
2019-12-23 14:10:16 +08:00
关闭订单先去微信那边关闭订单,关闭成功才能在本地执行其他关闭逻辑
mituxiaomanong
2020-02-27 17:34:29 +08:00
@IamUNICODE 最简单方案! 哈哈 强 😄

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

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

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

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

© 2021 V2EX