Commit 4c5134ae1cc17815ace13f86fece03f91174d695

Authored by YunaiV
1 parent 5107322e

fix:【system 系统功能】腾讯云短信回调没有 logId 需要 serialNo 来更新本地记录

yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsLogMapper.java
... ... @@ -22,4 +22,8 @@ public interface SmsLogMapper extends BaseMapperX<SmsLogDO> {
22 22 .orderByDesc(SmsLogDO::getId));
23 23 }
24 24  
  25 + default SmsLogDO selectByApiSerialNo(String apiSerialNo) {
  26 + return selectOne(SmsLogDO::getApiSerialNo, apiSerialNo);
  27 + }
  28 +
25 29 }
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/framework/sms/core/client/impl/TencentSmsClient.java
... ... @@ -119,6 +119,7 @@ public class TencentSmsClient extends AbstractSmsClient {
119 119 return new SmsReceiveRespDTO()
120 120 .setSuccess("SUCCESS".equals(statusObj.getStr("report_status"))) // 是否接收成功
121 121 .setErrorCode(statusObj.getStr("errmsg")) // 状态报告编码
  122 + .setErrorMsg(statusObj.getStr("description")) // 状态报告描述
122 123 .setMobile(statusObj.getStr("mobile")) // 手机号
123 124 .setReceiveTime(statusObj.getLocalDateTime("user_receive_time", null)) // 状态报告时间
124 125 .setSerialNo(statusObj.getStr("sid")); // 发送序列号
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogService.java
... ... @@ -12,7 +12,7 @@ import java.util.Map;
12 12 * 短信日志 Service 接口
13 13 *
14 14 * @author zzf
15   - * @date 13:48 2021/3/2
  15 + * @since 13:48 2021/3/2
16 16 */
17 17 public interface SmsLogService {
18 18  
... ... @@ -49,12 +49,13 @@ public interface SmsLogService {
49 49 * 更新日志的接收结果
50 50 *
51 51 * @param id 日志编号
  52 + * @param apiSerialNo 发送编号
52 53 * @param success 是否接收成功
53 54 * @param receiveTime 用户接收时间
54 55 * @param apiReceiveCode API 接收结果的编码
55 56 * @param apiReceiveMsg API 接收结果的说明
56 57 */
57   - void updateSmsReceiveResult(Long id, Boolean success,
  58 + void updateSmsReceiveResult(Long id, String apiSerialNo, Boolean success,
58 59 LocalDateTime receiveTime, String apiReceiveCode, String apiReceiveMsg);
59 60  
60 61 /**
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java
... ... @@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j;
11 11 import org.springframework.stereotype.Service;
12 12  
13 13 import jakarta.annotation.Resource;
  14 +
14 15 import java.time.LocalDateTime;
15 16 import java.util.Map;
16 17 import java.util.Objects;
... ... @@ -63,10 +64,17 @@ public class SmsLogServiceImpl implements SmsLogService {
63 64 }
64 65  
65 66 @Override
66   - public void updateSmsReceiveResult(Long id, Boolean success, LocalDateTime receiveTime,
  67 + public void updateSmsReceiveResult(Long id, String apiSerialNo, Boolean success, LocalDateTime receiveTime,
67 68 String apiReceiveCode, String apiReceiveMsg) {
68 69 SmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ?
69 70 SmsReceiveStatusEnum.SUCCESS : SmsReceiveStatusEnum.FAILURE;
  71 + if (id == null || id == 0) {
  72 + SmsLogDO log = smsLogMapper.selectByApiSerialNo(apiSerialNo);
  73 + if (log == null) {
  74 + return;
  75 + }
  76 + id = log.getId();
  77 + }
70 78 smsLogMapper.updateById(SmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus())
71 79 .receiveTime(receiveTime).apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build());
72 80 }
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java
... ... @@ -184,7 +184,7 @@ public class SmsSendServiceImpl implements SmsSendService {
184 184 return;
185 185 }
186 186 // 更新短信日志的接收结果. 因为量一般不大,所以先使用 for 循环更新
187   - receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(result.getLogId(),
  187 + receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(result.getLogId(), result.getSerialNo(),
188 188 result.getSuccess(), result.getReceiveTime(), result.getErrorCode(), result.getErrorMsg()));
189 189 }
190 190  
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImplTest.java
... ... @@ -41,47 +41,47 @@ public class SmsLogServiceImplTest extends BaseDbUnitTest {
41 41  
42 42 @Test
43 43 public void testGetSmsLogPage() {
44   - // mock 数据
45   - SmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到
46   - o.setChannelId(1L);
47   - o.setTemplateId(10L);
48   - o.setMobile("15601691300");
49   - o.setSendStatus(SmsSendStatusEnum.INIT.getStatus());
50   - o.setSendTime(buildTime(2020, 11, 11));
51   - o.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus());
52   - o.setReceiveTime(buildTime(2021, 11, 11));
53   - });
54   - smsLogMapper.insert(dbSmsLog);
55   - // 测试 channelId 不匹配
56   - smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setChannelId(2L)));
57   - // 测试 templateId 不匹配
58   - smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setTemplateId(20L)));
59   - // 测试 mobile 不匹配
60   - smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setMobile("18818260999")));
61   - // 测试 sendStatus 不匹配
62   - smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setSendStatus(SmsSendStatusEnum.IGNORE.getStatus())));
63   - // 测试 sendTime 不匹配
64   - smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setSendTime(buildTime(2020, 12, 12))));
65   - // 测试 receiveStatus 不匹配
66   - smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setReceiveStatus(SmsReceiveStatusEnum.SUCCESS.getStatus())));
67   - // 测试 receiveTime 不匹配
68   - smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12))));
69   - // 准备参数
70   - SmsLogPageReqVO reqVO = new SmsLogPageReqVO();
71   - reqVO.setChannelId(1L);
72   - reqVO.setTemplateId(10L);
73   - reqVO.setMobile("156");
74   - reqVO.setSendStatus(SmsSendStatusEnum.INIT.getStatus());
75   - reqVO.setSendTime(buildBetweenTime(2020, 11, 1, 2020, 11, 30));
76   - reqVO.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus());
77   - reqVO.setReceiveTime(buildBetweenTime(2021, 11, 1, 2021, 11, 30));
78   -
79   - // 调用
80   - PageResult<SmsLogDO> pageResult = smsLogService.getSmsLogPage(reqVO);
81   - // 断言
82   - assertEquals(1, pageResult.getTotal());
83   - assertEquals(1, pageResult.getList().size());
84   - assertPojoEquals(dbSmsLog, pageResult.getList().get(0));
  44 + // mock 数据
  45 + SmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到
  46 + o.setChannelId(1L);
  47 + o.setTemplateId(10L);
  48 + o.setMobile("15601691300");
  49 + o.setSendStatus(SmsSendStatusEnum.INIT.getStatus());
  50 + o.setSendTime(buildTime(2020, 11, 11));
  51 + o.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus());
  52 + o.setReceiveTime(buildTime(2021, 11, 11));
  53 + });
  54 + smsLogMapper.insert(dbSmsLog);
  55 + // 测试 channelId 不匹配
  56 + smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setChannelId(2L)));
  57 + // 测试 templateId 不匹配
  58 + smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setTemplateId(20L)));
  59 + // 测试 mobile 不匹配
  60 + smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setMobile("18818260999")));
  61 + // 测试 sendStatus 不匹配
  62 + smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setSendStatus(SmsSendStatusEnum.IGNORE.getStatus())));
  63 + // 测试 sendTime 不匹配
  64 + smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setSendTime(buildTime(2020, 12, 12))));
  65 + // 测试 receiveStatus 不匹配
  66 + smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setReceiveStatus(SmsReceiveStatusEnum.SUCCESS.getStatus())));
  67 + // 测试 receiveTime 不匹配
  68 + smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12))));
  69 + // 准备参数
  70 + SmsLogPageReqVO reqVO = new SmsLogPageReqVO();
  71 + reqVO.setChannelId(1L);
  72 + reqVO.setTemplateId(10L);
  73 + reqVO.setMobile("156");
  74 + reqVO.setSendStatus(SmsSendStatusEnum.INIT.getStatus());
  75 + reqVO.setSendTime(buildBetweenTime(2020, 11, 1, 2020, 11, 30));
  76 + reqVO.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus());
  77 + reqVO.setReceiveTime(buildBetweenTime(2021, 11, 1, 2021, 11, 30));
  78 +
  79 + // 调用
  80 + PageResult<SmsLogDO> pageResult = smsLogService.getSmsLogPage(reqVO);
  81 + // 断言
  82 + assertEquals(1, pageResult.getTotal());
  83 + assertEquals(1, pageResult.getList().size());
  84 + assertPojoEquals(dbSmsLog, pageResult.getList().get(0));
85 85 }
86 86  
87 87 @Test
... ... @@ -153,13 +153,14 @@ public class SmsLogServiceImplTest extends BaseDbUnitTest {
153 153 smsLogMapper.insert(dbSmsLog);
154 154 // 准备参数
155 155 Long id = dbSmsLog.getId();
  156 + String apiSerialNo = dbSmsLog.getApiSerialNo();
156 157 Boolean success = randomBoolean();
157 158 LocalDateTime receiveTime = randomLocalDateTime();
158 159 String apiReceiveCode = randomString();
159 160 String apiReceiveMsg = randomString();
160 161  
161 162 // 调用
162   - smsLogService.updateSmsReceiveResult(id, success, receiveTime, apiReceiveCode, apiReceiveMsg);
  163 + smsLogService.updateSmsReceiveResult(id, apiSerialNo, success, receiveTime, apiReceiveCode, apiReceiveMsg);
163 164 // 断言
164 165 dbSmsLog = smsLogMapper.selectById(id);
165 166 assertEquals(success ? SmsReceiveStatusEnum.SUCCESS.getStatus()
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImplTest.java
... ... @@ -291,7 +291,7 @@ public class SmsSendServiceImplTest extends BaseMockitoUnitTest {
291 291 // 调用
292 292 smsSendService.receiveSmsStatus(channelCode, text);
293 293 // 断言
294   - receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(eq(result.getLogId()), eq(result.getSuccess()),
  294 + receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(eq(result.getLogId()), eq(result.getSerialNo()), eq(result.getSuccess()),
295 295 eq(result.getReceiveTime()), eq(result.getErrorCode()), eq(result.getErrorCode())));
296 296 }
297 297  
... ...