Commit 45422d84ab1c3dab96381aff11d01c8731b65f1b

Authored by YunaiV
1 parent 9b9a1069

fix: 修复微信转账确认收款 packageInfo 丢失

- 转账中状态下允许补写缺失的 channelPackageInfo
- 处理同步任务与发起转账接口并发更新转账状态的场景
- 增加仅空值时更新 channelPackageInfo 的 Mapper 方法
- 补充转账状态推进单测覆盖 Issue #1144
yudao-module-pay/src/test/java/cn/iocoder/yudao/module/pay/service/transfer/PayTransferServiceTest.java
@@ -18,7 +18,6 @@ import org.springframework.test.context.bean.override.mockito.MockitoBean; @@ -18,7 +18,6 @@ import org.springframework.test.context.bean.override.mockito.MockitoBean;
18 18
19 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; 19 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
20 import static org.junit.jupiter.api.Assertions.assertEquals; 20 import static org.junit.jupiter.api.Assertions.assertEquals;
21 -import static org.junit.jupiter.api.Assertions.assertNull;  
22 21
23 /** 22 /**
24 * {@link PayTransferServiceImpl} 的单元测试类 23 * {@link PayTransferServiceImpl} 的单元测试类
@@ -45,42 +44,47 @@ public class PayTransferServiceTest extends BaseDbAndRedisUnitTest { @@ -45,42 +44,47 @@ public class PayTransferServiceTest extends BaseDbAndRedisUnitTest {
45 44
46 @Test 45 @Test
47 public void testNotifyTransferProgressing_fillChannelPackageInfoIfAbsent() { 46 public void testNotifyTransferProgressing_fillChannelPackageInfoIfAbsent() {
48 - // mock 数据(PayTransferDO):初始为等待转账 47 + // mock 数据(PayTransferDO):同步任务先把 WAITING 更新为 PROCESSING,但是不返回 package 信息
49 PayTransferDO transfer = randomPojo(PayTransferDO.class, 48 PayTransferDO transfer = randomPojo(PayTransferDO.class,
50 o -> o.setAppId(10L) 49 o -> o.setAppId(10L)
51 .setNo("T110") 50 .setNo("T110")
52 - .setStatus(PayTransferStatusEnum.WAITING.getStatus()) 51 + .setStatus(PayTransferStatusEnum.PROCESSING.getStatus())
53 .setChannelPackageInfo(null)); 52 .setChannelPackageInfo(null));
54 transferMapper.insert(transfer); 53 transferMapper.insert(transfer);
55 // 准备参数 54 // 准备参数
56 PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setAppId(10L)); 55 PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setAppId(10L));
57 - PayTransferRespDTO syncNotify = PayTransferRespDTO.processingOf("WX_TRANSFER_110",  
58 - "T110", "sync");  
59 -  
60 - // 调用:模拟同步任务先把 WAITING 更新为 PROCESSING,但是不返回 package 信息  
61 - transferService.notifyTransfer(channel, syncNotify);  
62 -  
63 - // 断言:状态已转账中,package 信息为空  
64 - PayTransferDO dbTransfer = transferMapper.selectById(transfer.getId());  
65 - assertEquals(PayTransferStatusEnum.PROCESSING.getStatus(), dbTransfer.getStatus());  
66 - assertNull(dbTransfer.getChannelPackageInfo());  
67 -  
68 - // 调用:模拟发起转账接口随后返回 PROCESSING,并携带微信确认收款 package 信息  
69 PayTransferRespDTO createNotify = PayTransferRespDTO.processingOf("WX_TRANSFER_110", 56 PayTransferRespDTO createNotify = PayTransferRespDTO.processingOf("WX_TRANSFER_110",
70 "T110", "create"); 57 "T110", "create");
71 createNotify.setChannelPackageInfo("package-info-110"); 58 createNotify.setChannelPackageInfo("package-info-110");
  59 +
  60 + // 调用:模拟发起转账接口随后返回 PROCESSING,并携带微信确认收款 package 信息
72 transferService.notifyTransfer(channel, createNotify); 61 transferService.notifyTransfer(channel, createNotify);
73 62
74 // 断言:已是 PROCESSING 时仍会补写 package 信息 63 // 断言:已是 PROCESSING 时仍会补写 package 信息
75 - dbTransfer = transferMapper.selectById(transfer.getId()); 64 + PayTransferDO dbTransfer = transferMapper.selectById(transfer.getId());
76 assertEquals(PayTransferStatusEnum.PROCESSING.getStatus(), dbTransfer.getStatus()); 65 assertEquals(PayTransferStatusEnum.PROCESSING.getStatus(), dbTransfer.getStatus());
77 assertEquals("package-info-110", dbTransfer.getChannelPackageInfo()); 66 assertEquals("package-info-110", dbTransfer.getChannelPackageInfo());
  67 + }
  68 +
  69 + @Test
  70 + public void testNotifyTransferProgressing_notOverwriteChannelPackageInfo() {
  71 + // mock 数据(PayTransferDO):已经存在 package 信息
  72 + PayTransferDO transfer = randomPojo(PayTransferDO.class,
  73 + o -> o.setAppId(10L)
  74 + .setNo("T110")
  75 + .setStatus(PayTransferStatusEnum.PROCESSING.getStatus())
  76 + .setChannelPackageInfo("package-info-110"));
  77 + transferMapper.insert(transfer);
  78 + // 准备参数
  79 + PayChannelDO channel = randomPojo(PayChannelDO.class, o -> o.setAppId(10L));
  80 + PayTransferRespDTO syncNotify = PayTransferRespDTO.processingOf("WX_TRANSFER_110",
  81 + "T110", "sync");
78 82
79 - // 调用:后续同步任务仍不返回 package 信息,不应覆盖已有值 83 + // 调用:后续同步任务不返回 package 信息
80 transferService.notifyTransfer(channel, syncNotify); 84 transferService.notifyTransfer(channel, syncNotify);
81 85
82 // 断言:已有 package 信息不被空值覆盖 86 // 断言:已有 package 信息不被空值覆盖
83 - dbTransfer = transferMapper.selectById(transfer.getId()); 87 + PayTransferDO dbTransfer = transferMapper.selectById(transfer.getId());
84 assertEquals("package-info-110", dbTransfer.getChannelPackageInfo()); 88 assertEquals("package-info-110", dbTransfer.getChannelPackageInfo());
85 } 89 }
86 90