像资金下发这种业务,通常是在我们系统发给第三方支付通道后,第三方支付通道会进行资金业务处理。这是一个异步的过程。然后,付款完成后,会主动调用我们系统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();
}
结果呢,出现了一种情况,当前系统里订单状态修改失败,可是通知商户却成功了。