系统设计层面怎样防止重复扣款

没明白具体需求。按照题主简单的描述,核心问题是订单拆分的问题,不是重复扣款的问题。此类问题的大致思路:1、将原订单按照单笔限额拆分成多笔子订单2、对拆分的子订单,每一笔发起支付请求,生成支付订单,调用对应的支付通道接口扣款。此部分为标准的支付过程,需要处理诸如支付状态未知(例如银行支付回调通知未接收到)、重复支付等问题。由于是拆分订单,因此支付订单最好带上父订单的订单号,这样方便对账处理。3、按照与上游渠道的对账周期(一般为T+1),处理长款、短款问题。内部交易系统与账务系统最好也针对拆分订单做一下对账。关于重复支付,以前的回答,供参考。系统怎么处理重复缴费问题? - 梁川的回答关于订单合并、拆分,以前的回答,供参考。订单合并付款之后,是否需要拆分支付流水? - 电子商务
■网友
从题主的描述来看,应该是想问拆单过程中防止多支付。这块 @梁川已经说得比较清楚了。我再稍微补充下:对于拆单系统:一个业务订单可以对应多个支付订单,一个支付订单可能与第三方支付公司的多个支付流水对应。正常情况下仅需限制多个支付订单(成功状态)的总金额不高于业务订单金额,当达到时该业务订单支付完成。最大的风险点其实在于实际支付成功了但是商户却没有收到通知,包括第三方支付本身也未获取到交易结果、未成功收到第三方的异步回调结果等。针对前者,我们无能为力,所以主要讨论后者异步通知的问题:1、提示服务器负载能力,如最大连接数、高并发的处理能力。前期可以做一些压力测试。2、与第三方协商异步通知失败时的补发机制,可以考虑幂等方式的补发3、使用交易状态查询接口查询未获得交易状态的订单状态。4、适当考虑是否有必要使用长连接keepalive其实,对拆单支付,如果第三方公司愿意帮你拦截同一个业务订单下超出金额的支付订单,这是最好的选择,但是应该会涉及到一定的开发定制量==========分割线==========再讨论下同笔支付订单二次支付的问题。主要可以考虑以下2个方法:1、在第三方真正发起支付时,通过查询接口确认是否允许该笔订单进行支付2、第三方内部对同订单二次支付做拦截。


    推荐阅读