• 请不要在回答技术问题时复制粘贴 AI 生成的内容
quan7u
V2EX  ›  程序员

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

  •  
  •   quan7u · Dec 22, 2019 · 3424 views
    This topic created in 2343 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

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

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

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

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

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


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


    不过微信支付文档[统一下单]API 的状态机并不对应[查询订单]API 的状态...所以我有点迷惑,不知道这个[支付中]对应的场景.....
    519718366
        10
    519718366  
       Dec 23, 2019 via iPhone
    冰菓,奉太郎?!我很好奇!
    IamUNICODE
        11
    IamUNICODE  
       Dec 23, 2019
    定时取消,但是回调来了就把原来取消的状态刷成已支付就行了
    Dganzh
        12
    Dganzh  
       Dec 23, 2019
    关闭订单先去微信那边关闭订单,关闭成功才能在本地执行其他关闭逻辑
    mituxiaomanong
        13
    mituxiaomanong  
       Feb 27, 2020 via Android
    @IamUNICODE 最简单方案! 哈哈 强 😄
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2842 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 01:46 · PVG 09:46 · LAX 18:46 · JFK 21:46
    ♥ Do have faith in what you're doing.