对于支付系统来说,接收到商户的付款请求,最基本的逻辑是,持久化本地支付单数据,然后调用外部三方银行通道发起付款。见如下示意图
用伪代码来表示,注意用到了事务
@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);
}
然后,有一天,三方银行通道付款成功了,本地交易表里却没有交易单。。
这意味着什么?
来,脑补一下情景:
情景①: 商户查单,发现我们返回的是订单不存在,然后,商户重新发起付款,这时,用户收到了两笔钱,用户自然高兴,你该哭了!
情景②:自己脑补吧~