【不靠谱程序员】支付系统里,资金损失是如何产生的?

97 阅读1分钟

对于支付系统来说,接收到商户的付款请求,最基本的逻辑是,持久化本地支付单数据,然后调用外部三方银行通道发起付款。见如下示意图

支付逻辑

用伪代码来表示,注意用到了事务

@Transactional
public void pay(Order order){
    // 持久化本地支付单数据
    orderRepository.save(order);
    
    // 调用外部三方通道发起付款
    Bank bank = routeRepository.getMerchantPayRoot(order.getMerId());
    String reqMsg = encrypt("orderNo=123&amount=456"); // 伪代码
    String respMsg = HttpClient.sendPost(bank.getApiUrl(), reqMsg);
    
    // 收到响应,持久化响应报文
    orderRepository.updatePayResult(order.getId(), respMsg);
}

然后,有一天,三方银行通道付款成功了,本地交易表里却没有交易单。。

这意味着什么?

来,脑补一下情景:

情景①: 商户查单,发现我们返回的是订单不存在,然后,商户重新发起付款,这时,用户收到了两笔钱,用户自然高兴,你该哭了!

情景②:自己脑补吧~