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

如何避免同一笔订单被不同支付平台支付

  •  
  •   Dylaan · 2021-03-03 13:27:24 +08:00 · 3986 次点击
    这是一个创建于 1142 天前的主题,其中的信息可能已经有所发展或是发生改变。
    问题:根据用户选择的支付方式生成二维码,如果用户在支付过程中更改支付方式,如何避免同一笔订单被不同支付平台重复支付?
    思考:目前的想法是切换支付方式的同时,关闭上一次的支付订单。
    支付平台:微信、支付宝;支付方式:扫码支付( scan );支付结果:支付平台回调。
    16 条回复    2021-03-03 21:19:25 +08:00
    linauror
        1
    linauror  
       2021-03-03 13:45:10 +08:00
    你的想法没错,就是通过关单的方式
    puzzle9
        2
    puzzle9  
       2021-03-03 13:57:11 +08:00
    楼上说的不错 关单方便
    还有一种 退款
    kop1989
        3
    kop1989  
       2021-03-03 14:00:09 +08:00
    我个人更推荐#2 的方式,既点击支付的时候同时开单支付宝、微信,并返回二维码。
    这样的优势是切换时没有延时,且 0 服务器端压力。

    然后每天走账的时候提示操作员进行手工确认退款操作。
    Dylaan
        4
    Dylaan  
    OP
       2021-03-03 14:16:50 +08:00
    @linauror 如果关闭支付订单,用户选择 微信->支付宝->微信,第二次选择微信支付时将不能创建二维码,提示订单已关闭。

    @puzzle9 退款也是一种四路,但可能权限不允许。
    FantaMole
        5
    FantaMole  
       2021-03-03 16:13:51 +08:00
    我记得以前遇到这种问题的时候,还拿美团外卖试验过,下一单然后两台手机同时支付。美团的做法的是,两边都可以成功支付,支付后给其中一方退款。设计一下这个支付后的检测重复支付退款逻辑就好了
    linauror
        6
    linauror  
       2021-03-03 16:25:10 +08:00   ❤️ 1
    @Dylaan 每次点击支付都是新下一个支付订单,关闭旧支付单(如果同一种支付方式则继续使用),这种需要区分下系统订单和支付订单,做关联
    gam2046
        7
    gam2046  
       2021-03-03 16:39:41 +08:00   ❤️ 1
    如果实时性比较高,支付时是比较难避免重复付款,因此需要设计对账、对冲。

    即假设本地业务系统的支付流水在数据库中分别保存与不同支付渠道的支付流水号对应关系,在业务低谷期(如次日凌晨),检索当日所有所有支付流水对应的第三方支付流水,是否存在多笔支付成功的第三方对应一笔流水号,如果存在将时间靠后的做自动退款。如果真的毫秒级都时间相同就按自定义顺序退款(如先尝试退微信,后退支付宝)。

    这是每日的对冲,每笔第三方支付成功回调时,也可以即刻检查本地的业务流水号是否已经被其他支付渠道标记支付成功,如果有就直接退款,当然这种方法对自身业务系统的并发设计能力较高,而第一种就简单一些,无脑收钱,次日对账,多了再退。
    dqzcwxb
        8
    dqzcwxb  
       2021-03-03 16:48:25 +08:00
    退款更优
    fucUup
        9
    fucUup  
       2021-03-03 18:19:27 +08:00
    @Dylaan 你是知乎挖坑的吗

    pay.weixin.qq.com/wiki/doc/api/img/chapter8_3_1.png

    微信异步回调你, 你发现订单被 zfb 占坑了, 就微信退款 api
    以及在返回 App 后你去查单, 发现微信支付成功但 zfb 占坑了, 就微信退款 api
    killergun
        10
    killergun  
       2021-03-03 18:26:50 +08:00
    多次支付成功 ,把多支付的退款就行了。
    mxT52CRuqR6o5
        11
    mxT52CRuqR6o5  
       2021-03-03 18:42:09 +08:00
    支付回调检查订单支付状态,已支付就退款
    没法绝对避免的
    MeteorCat
        12
    MeteorCat  
       2021-03-03 18:42:26 +08:00 via Android
    关单没错的
    wangxiaoaer
        13
    wangxiaoaer  
       2021-03-03 18:56:56 +08:00
    前端不管,后端支付的时候判断下是否是重复支付不就可以了?
    fucUup
        14
    fucUup  
       2021-03-03 19:24:58 +08:00
    切换支付方式关单, 解决不了用户有多部手机, 别想了, 不对的
    m2276699
        15
    m2276699  
       2021-03-03 19:39:36 +08:00
    按支付类型生成支付行,每个订单可能存在多个支付行。
    在支付回调完成订单时,关闭其他支付行。
    star1
        16
    star1  
       2021-03-03 21:19:25 +08:00
    订单和支付单,要分开。如果同时发起支付宝和微信回调。那么如果订单标记完成,支付链完整,可以退款另一个支付单。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1008 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 19:29 · PVG 03:29 · LAX 12:29 · JFK 15:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.