我目前负责开发一个公司小程序的拼团功能,把之前同事写的下单流程看了一遍。
确认他并没有考虑到一个并发情况:
1、用户支付后,系统等待微信支付的支付通知回调。
2、目前订单超时功能是用 Redis 过期通知做的,订单支付超时回调订单关闭的方法。
若两个方法同时触发,岂不是有并发的问题?
我目前给两个方法都加了 Redis 锁,锁订单——>判断订单状态——>执行业务
订单关闭也先查询了订单支付状态。
但是这样会出现用户支付后,微信没回调,Redis 键过期,把订单给取消,微信支付成功回调会把这笔钱退款。(我猜想的...目前还没出现这种情况)
感觉这样的交互体验并不理想,各位有做支付的是怎么设计或者处理的呢?能指点一二吗?
1
airyland 2019-12-22 22:49:10 +08:00 1
1.前端用户支付后让后端主动向微信支付发起支付确认查询
2.订单关闭前去微信支付查询订单支付状态,如果为支付,则不关闭并更新支付状态 |
2
mlboy 2019-12-23 06:30:21 +08:00 via iPhone
异步通知逻辑中增加判断订单是否关闭判断,如果关闭了则原路退。另外,根据业务理解一般都是希望支付的,其实可以用支付成功的状态直接刷掉关闭的状态
|
3
xuanbg 2019-12-23 09:06:04 +08:00
不需要锁。调用支付接口时判断下状态是否已关闭,回调回来不用判断是否已关闭,直接改状态为已支付就好了。
|
4
changdy 2019-12-23 09:10:32 +08:00 1
233 看到 Redis 过期监听 滚进来了.
Redis 的过期策略并不准确 , 不能保证 key 在指定时间内进行过期通知 , 建议: 如果量不多的话 可以 单独搞一台 redis 做过期通知 , 多的话...那就不要用这个功能 |
6
quan7u OP |
7
mituxiaomanong 2019-12-23 10:42:58 +08:00 via Android
我遇到过。
订单未支付状态 15 分钟取消, 客户付款后,微信支付回调 超过了 15 分钟,订单被伪删除。 微信支付回调 没检查订单是否被伪删除,所以产生结果: 订单业务正常,就是被删除了。 最简单解决:设置更大的订单取消时间 实际解决方案:取消订单前查询微信订单状态,如果支付中不取消订单 |
8
mituxiaomanong 2019-12-23 10:43:53 +08:00 via Android
这种情况 很少发生。 主要取决于微信支付那边😂
|
9
quan7u OP @mituxiaomanong
哈哈,我目前也是取消前查询订单状态,不是已支付的话就主动关闭订单。 不过微信支付文档[统一下单]API 的状态机并不对应[查询订单]API 的状态...所以我有点迷惑,不知道这个[支付中]对应的场景..... |
10
519718366 2019-12-23 12:54:37 +08:00 via iPhone
冰菓,奉太郎?!我很好奇!
|
11
IamUNICODE 2019-12-23 13:12:47 +08:00
定时取消,但是回调来了就把原来取消的状态刷成已支付就行了
|
12
Dganzh 2019-12-23 14:10:16 +08:00
关闭订单先去微信那边关闭订单,关闭成功才能在本地执行其他关闭逻辑
|
13
mituxiaomanong 2020-02-27 17:34:29 +08:00 via Android
@IamUNICODE 最简单方案! 哈哈 强 😄
|