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