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 18  
19 19 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
20 20 import static org.junit.jupiter.api.Assertions.assertEquals;
21   -import static org.junit.jupiter.api.Assertions.assertNull;
22 21  
23 22 /**
24 23 * {@link PayTransferServiceImpl} 的单元测试类
... ... @@ -45,42 +44,47 @@ public class PayTransferServiceTest extends BaseDbAndRedisUnitTest {
45 44  
46 45 @Test
47 46 public void testNotifyTransferProgressing_fillChannelPackageInfoIfAbsent() {
48   - // mock 数据(PayTransferDO):初始为等待转账
  47 + // mock 数据(PayTransferDO):同步任务先把 WAITING 更新为 PROCESSING,但是不返回 package 信息
49 48 PayTransferDO transfer = randomPojo(PayTransferDO.class,
50 49 o -> o.setAppId(10L)
51 50 .setNo("T110")
52   - .setStatus(PayTransferStatusEnum.WAITING.getStatus())
  51 + .setStatus(PayTransferStatusEnum.PROCESSING.getStatus())
53 52 .setChannelPackageInfo(null));
54 53 transferMapper.insert(transfer);
55 54 // 准备参数
56 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 56 PayTransferRespDTO createNotify = PayTransferRespDTO.processingOf("WX_TRANSFER_110",
70 57 "T110", "create");
71 58 createNotify.setChannelPackageInfo("package-info-110");
  59 +
  60 + // 调用:模拟发起转账接口随后返回 PROCESSING,并携带微信确认收款 package 信息
72 61 transferService.notifyTransfer(channel, createNotify);
73 62  
74 63 // 断言:已是 PROCESSING 时仍会补写 package 信息
75   - dbTransfer = transferMapper.selectById(transfer.getId());
  64 + PayTransferDO dbTransfer = transferMapper.selectById(transfer.getId());
76 65 assertEquals(PayTransferStatusEnum.PROCESSING.getStatus(), dbTransfer.getStatus());
77 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 84 transferService.notifyTransfer(channel, syncNotify);
81 85  
82 86 // 断言:已有 package 信息不被空值覆盖
83   - dbTransfer = transferMapper.selectById(transfer.getId());
  87 + PayTransferDO dbTransfer = transferMapper.selectById(transfer.getId());
84 88 assertEquals("package-info-110", dbTransfer.getChannelPackageInfo());
85 89 }
86 90  
... ...