问一个关于订单模块的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在答技术问题时复制粘贴 AI 生成的内容
quan7u
V2EX    程序员

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

  •  
  •   quan7u 2019 年 12 月 22 日 3206 次点击
    这是一个创建于 2211 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

    13 条回复    2020-02-27 17:34:29 +08:00
    airyland
        1
    airyland  
       2019 年 12 月 22 日   1
    1.前端用户支付后让后端主动向微信支付发起支付确认查询
    2.订单关闭前去微信支付查询订单支付状态,如果为支付,则不关闭并更新支付状态
    mlboy
        2
    mlboy  
       2019 年 12 月 23 日 via iPhone
    异步通知逻辑中增加判断订单是否关闭判断,如果关闭了则原路退。另外,根据业务理解一般都是希望支付的,其实可以用支付成功的状态直接刷掉关闭的状态
    xuanbg
        3
    xuanbg  
       2019 年 12 月 23 日
    不需要锁。调用支付接口时判断下状态是否已关闭,回调回来不用判断是否已关闭,直接改状态为已支付就好了。
    changdy
        4
    changdy  
       2019 年 12 月 23 日   1
    233 看到 Redis 过期监听 滚进来了.

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

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

    最简单解决:设置更大的订单取消时间
    实际解决方案:取消订单前查询微信订单状态,如果支付中不取消订单
    mituxiaomanong
        8
    mituxiaomanong  
       2019 年 12 月 23 日 via Android
    这种情况 很少发生。 主要取决于微信支付那边
    quan7u
        9
    quan7u  
    OP
       2019 年 12 月 23 日
    @mituxiaomanong


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


    不过微信支付文档[统一下单]API 的状态机并不对应[查询订单]API 的状态...所以我有点迷惑,不知道这个[支付中]对应的场景.....
    519718366
        10
    519718366  
       2019 年 12 月 23 日 via iPhone
    冰,奉太郎?!我很好奇!
    IamUNICODE
        11
    IamUNICODE  
       2019 年 12 月 23 日
    定时取消,但是回调来了就把原来取消的状态刷成已支付就行了
    Dganzh
        12
    Dganzh  
       2019 年 12 月 23 日
    关闭订单先去微信那边关闭订单,关闭成功才能在本地执行其他关闭逻辑
    mituxiaomanong
        13
    mituxiaomanong  
       2020 年 2 月 27 日 via Android
    @IamUNICODE 最简单方案! 哈哈 强
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2620 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 02:27 PVG 10:27 LAX 18:27 JFK 21:27
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86