馏栩梓 发表于 2025-6-9 04:47:11

【不靠谱程序员】接收到回调通知的异步处理

​支付系统中,像资金下发这种业务,通常是在我们系统发给第三方支付通道后,第三方支付通道会进行资金业务处理。然后,付款完成后,会主动发起回调,即,调用我们系统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();

 
结果呢,出现了一种情况,当前系统里订单的付款状态没能修改,可是通知商户却成功了。。
 
我们作为支付服务提供方,我们系统里的付款单不是终态,而商户系统里却是终态。在支付系统中,这样的程序是很要命的。尤其是当我们系统里的付款单是“付款中”而商户系统里是“付款失败”的情况。这时,商户系统可能会因为付款失败而重新发起付款。如果原单实际是付款成功的话,这就出现了资金风险,即,一笔订单付款了两次。就问你怕不怕?
 
所以,本案中,修改付款单状态的逻辑,必须在主线程执行,确保当前支付系统的付款单状态变更完成后,才可以做后续业务处理。通知商户则可以异步处理,即使通知失败也可以用相关方式来补偿。
 
这个案例告诉我们,代码中在使用JUC、消息队列、回调函数、消息中间件等提高程序性能的方式进行异步处理时,一定要分清主次,哪些逻辑必须在主线程执行,哪些逻辑可以异步处理。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

蒙飘 发表于 2025-12-12 12:47:13

喜欢鼓捣这些软件,现在用得少,谢谢分享!

强怀梅 发表于 2025-12-16 17:33:07

感谢,下载保存了

巴沛若 发表于 2025-12-21 10:37:23

感谢发布原创作品,程序园因你更精彩

襁壮鸢 发表于 2025-12-22 16:09:32

感谢分享,下载保存了,貌似很强大

缑莺韵 发表于 2025-12-31 04:26:14

这个有用。

滑清怡 发表于 2026-1-13 22:50:32

用心讨论,共获提升!

嘀荼酴 发表于 2026-1-17 23:02:49

用心讨论,共获提升!

骛扼铮 发表于 2026-1-22 01:52:43

很好很强大我过来先占个楼 待编辑

谷江雪 发表于 2026-1-23 08:35:00

这个有用。

滥眩 发表于 2026-1-27 08:03:35

这个有用。

喳谍 发表于 2026-2-3 09:37:10

前排留名,哈哈哈

韦逸思 发表于 2026-2-6 11:43:10

感谢,下载保存了

袁可佳 发表于 2026-2-7 03:48:04

鼓励转贴优秀软件安全工具和文档!

左优扬 发表于 2026-2-8 05:11:13

谢谢分享,试用一下

劳暄美 发表于 2026-2-9 21:54:24

谢谢分享,试用一下

薯羞 发表于 2026-2-10 00:34:20

不错,里面软件多更新就更好了

电棘缣 发表于 2026-2-10 08:31:44

东西不错很实用谢谢分享

予捻 发表于 2026-2-26 10:57:44

这个有用。

闹忧踫 发表于 2026-3-8 04:03:49

感谢,下载保存了
页: [1] 2
查看完整版本: 【不靠谱程序员】接收到回调通知的异步处理