【不靠谱程序员】回调通知的处理逻辑

207 阅读1分钟

像资金下发这种业务,通常是在我们系统发给第三方支付通道后,第三方支付通道会进行资金业务处理。这是一个异步的过程。然后,付款完成后,会主动调用我们系统API发起回调,将付款结果通知给我们系统。

假定我们系统对回调通知的处理逻辑包括:① 修改本地支付单状态;② 将付款结果调用客户系统API,通知客户。见下方示意图。

银行回调通知

用伪代码来表示:

public void payNotify(Order order) {
    // ① 修改支付单状态
    orderRepository.updatePayResult(order.getId(), "PAY_SUCCESS");
    
    // ② 将付款结果调用客户系统API,通知客户
    Merchant merchant = merchantRepository.getById(order.getMerId());
    String reqMsg = encrypt("orderNo="+order.getOrderId()+"&state=PAY_SUCCESS");
    HttpClient.sendPost(merchant.getNotifyUrl(), reqMsg);
}

为了提高程序性能,出现了下面的不靠谱代码:

public void payNotify(Order order) {
    // ① 修改支付单状态
    new Thread(()->{
        orderRepository.updatePayResult(order.getId(), "PAY_SUCCESS");
    }).start();
    
    // ② 将付款结果调用客户系统API,通知客户
    new Thread(()->{
        Merchant merchant = merchantRepository.getById(order.getMerId());
        String reqMsg = encrypt("orderNo="+order.getOrderId()+"&state=PAY_SUCCESS");
        HttpClient.sendPost(merchant.getNotifyUrl(), reqMsg);
    }).start();
}

结果呢,出现了一种情况,当前系统里订单状态修改失败,可是通知商户却成功了。