V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
quan7u
V2EX  ›  程序员

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

  •  
  •   quan7u · 2019-12-22 22:42:36 +08:00 · 2705 次点击
    这是一个创建于 1783 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

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

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

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

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


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


    不过微信支付文档[统一下单]API 的状态机并不对应[查询订单]API 的状态...所以我有点迷惑,不知道这个[支付中]对应的场景.....
    519718366
        10
    519718366  
       2019-12-23 12:54:37 +08:00 via iPhone
    冰菓,奉太郎?!我很好奇!
    IamUNICODE
        11
    IamUNICODE  
       2019-12-23 13:12:47 +08:00
    定时取消,但是回调来了就把原来取消的状态刷成已支付就行了
    Dganzh
        12
    Dganzh  
       2019-12-23 14:10:16 +08:00
    关闭订单先去微信那边关闭订单,关闭成功才能在本地执行其他关闭逻辑
    mituxiaomanong
        13
    mituxiaomanong  
       2020-02-27 17:34:29 +08:00 via Android
    @IamUNICODE 最简单方案! 哈哈 强 😄
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   939 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:03 · PVG 05:03 · LAX 13:03 · JFK 16:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.