Browse Source

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

YunaiV 10 months ago
parent
commit
4c5134ae1c

+ 4 - 0
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> {
                 .orderByDesc(SmsLogDO::getId));
     }
 
+    default SmsLogDO selectByApiSerialNo(String apiSerialNo) {
+        return selectOne(SmsLogDO::getApiSerialNo, apiSerialNo);
+    }
+
 }

+ 1 - 0
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 {
             return new SmsReceiveRespDTO()
                     .setSuccess("SUCCESS".equals(statusObj.getStr("report_status"))) // 是否接收成功
                     .setErrorCode(statusObj.getStr("errmsg")) // 状态报告编码
+                    .setErrorMsg(statusObj.getStr("description")) // 状态报告描述
                     .setMobile(statusObj.getStr("mobile")) // 手机号
                     .setReceiveTime(statusObj.getLocalDateTime("user_receive_time", null)) // 状态报告时间
                     .setSerialNo(statusObj.getStr("sid")); // 发送序列号

+ 3 - 2
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogService.java

@@ -12,7 +12,7 @@ import java.util.Map;
  * 短信日志 Service 接口
  *
  * @author zzf
- * @date 13:48 2021/3/2
+ * @since 13:48 2021/3/2
  */
 public interface SmsLogService {
 
@@ -49,12 +49,13 @@ public interface SmsLogService {
      * 更新日志的接收结果
      *
      * @param id 日志编号
+     * @param apiSerialNo 发送编号
      * @param success 是否接收成功
      * @param receiveTime 用户接收时间
      * @param apiReceiveCode API 接收结果的编码
      * @param apiReceiveMsg API 接收结果的说明
      */
-    void updateSmsReceiveResult(Long id, Boolean success,
+    void updateSmsReceiveResult(Long id, String apiSerialNo, Boolean success,
                                 LocalDateTime receiveTime, String apiReceiveCode, String apiReceiveMsg);
 
     /**

+ 9 - 1
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java

@@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import jakarta.annotation.Resource;
+
 import java.time.LocalDateTime;
 import java.util.Map;
 import java.util.Objects;
@@ -63,10 +64,17 @@ public class SmsLogServiceImpl implements SmsLogService {
     }
 
     @Override
-    public void updateSmsReceiveResult(Long id, Boolean success, LocalDateTime receiveTime,
+    public void updateSmsReceiveResult(Long id, String apiSerialNo, Boolean success, LocalDateTime receiveTime,
                                        String apiReceiveCode, String apiReceiveMsg) {
         SmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ?
                 SmsReceiveStatusEnum.SUCCESS : SmsReceiveStatusEnum.FAILURE;
+        if (id == null || id == 0) {
+            SmsLogDO log = smsLogMapper.selectByApiSerialNo(apiSerialNo);
+            if (log == null) {
+                return;
+            }
+            id = log.getId();
+        }
         smsLogMapper.updateById(SmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus())
                 .receiveTime(receiveTime).apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build());
     }

+ 1 - 1
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java

@@ -184,7 +184,7 @@ public class SmsSendServiceImpl implements SmsSendService {
             return;
         }
         // 更新短信日志的接收结果. 因为量一般不大,所以先使用 for 循环更新
-        receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(result.getLogId(),
+        receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(result.getLogId(), result.getSerialNo(),
                 result.getSuccess(), result.getReceiveTime(), result.getErrorCode(), result.getErrorMsg()));
     }
 

+ 43 - 42
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImplTest.java

@@ -41,47 +41,47 @@ public class SmsLogServiceImplTest extends BaseDbUnitTest {
 
     @Test
     public void testGetSmsLogPage() {
-       // mock 数据
-       SmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到
-           o.setChannelId(1L);
-           o.setTemplateId(10L);
-           o.setMobile("15601691300");
-           o.setSendStatus(SmsSendStatusEnum.INIT.getStatus());
-           o.setSendTime(buildTime(2020, 11, 11));
-           o.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus());
-           o.setReceiveTime(buildTime(2021, 11, 11));
-       });
-       smsLogMapper.insert(dbSmsLog);
-       // 测试 channelId 不匹配
-       smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setChannelId(2L)));
-       // 测试 templateId 不匹配
-       smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setTemplateId(20L)));
-       // 测试 mobile 不匹配
-       smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setMobile("18818260999")));
-       // 测试 sendStatus 不匹配
-       smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setSendStatus(SmsSendStatusEnum.IGNORE.getStatus())));
-       // 测试 sendTime 不匹配
-       smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setSendTime(buildTime(2020, 12, 12))));
-       // 测试 receiveStatus 不匹配
-       smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setReceiveStatus(SmsReceiveStatusEnum.SUCCESS.getStatus())));
-       // 测试 receiveTime 不匹配
-       smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12))));
-       // 准备参数
-       SmsLogPageReqVO reqVO = new SmsLogPageReqVO();
-       reqVO.setChannelId(1L);
-       reqVO.setTemplateId(10L);
-       reqVO.setMobile("156");
-       reqVO.setSendStatus(SmsSendStatusEnum.INIT.getStatus());
-       reqVO.setSendTime(buildBetweenTime(2020, 11, 1, 2020, 11, 30));
-       reqVO.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus());
-       reqVO.setReceiveTime(buildBetweenTime(2021, 11, 1, 2021, 11, 30));
-
-       // 调用
-       PageResult<SmsLogDO> pageResult = smsLogService.getSmsLogPage(reqVO);
-       // 断言
-       assertEquals(1, pageResult.getTotal());
-       assertEquals(1, pageResult.getList().size());
-       assertPojoEquals(dbSmsLog, pageResult.getList().get(0));
+        // mock 数据
+        SmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到
+            o.setChannelId(1L);
+            o.setTemplateId(10L);
+            o.setMobile("15601691300");
+            o.setSendStatus(SmsSendStatusEnum.INIT.getStatus());
+            o.setSendTime(buildTime(2020, 11, 11));
+            o.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus());
+            o.setReceiveTime(buildTime(2021, 11, 11));
+        });
+        smsLogMapper.insert(dbSmsLog);
+        // 测试 channelId 不匹配
+        smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setChannelId(2L)));
+        // 测试 templateId 不匹配
+        smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setTemplateId(20L)));
+        // 测试 mobile 不匹配
+        smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setMobile("18818260999")));
+        // 测试 sendStatus 不匹配
+        smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setSendStatus(SmsSendStatusEnum.IGNORE.getStatus())));
+        // 测试 sendTime 不匹配
+        smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setSendTime(buildTime(2020, 12, 12))));
+        // 测试 receiveStatus 不匹配
+        smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setReceiveStatus(SmsReceiveStatusEnum.SUCCESS.getStatus())));
+        // 测试 receiveTime 不匹配
+        smsLogMapper.insert(cloneIgnoreId(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12))));
+        // 准备参数
+        SmsLogPageReqVO reqVO = new SmsLogPageReqVO();
+        reqVO.setChannelId(1L);
+        reqVO.setTemplateId(10L);
+        reqVO.setMobile("156");
+        reqVO.setSendStatus(SmsSendStatusEnum.INIT.getStatus());
+        reqVO.setSendTime(buildBetweenTime(2020, 11, 1, 2020, 11, 30));
+        reqVO.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus());
+        reqVO.setReceiveTime(buildBetweenTime(2021, 11, 1, 2021, 11, 30));
+
+        // 调用
+        PageResult<SmsLogDO> pageResult = smsLogService.getSmsLogPage(reqVO);
+        // 断言
+        assertEquals(1, pageResult.getTotal());
+        assertEquals(1, pageResult.getList().size());
+        assertPojoEquals(dbSmsLog, pageResult.getList().get(0));
     }
 
     @Test
@@ -153,13 +153,14 @@ public class SmsLogServiceImplTest extends BaseDbUnitTest {
         smsLogMapper.insert(dbSmsLog);
         // 准备参数
         Long id = dbSmsLog.getId();
+        String apiSerialNo = dbSmsLog.getApiSerialNo();
         Boolean success = randomBoolean();
         LocalDateTime receiveTime = randomLocalDateTime();
         String apiReceiveCode = randomString();
         String apiReceiveMsg = randomString();
 
         // 调用
-        smsLogService.updateSmsReceiveResult(id, success, receiveTime, apiReceiveCode, apiReceiveMsg);
+        smsLogService.updateSmsReceiveResult(id, apiSerialNo, success, receiveTime, apiReceiveCode, apiReceiveMsg);
         // 断言
         dbSmsLog = smsLogMapper.selectById(id);
         assertEquals(success ? SmsReceiveStatusEnum.SUCCESS.getStatus()

+ 1 - 1
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImplTest.java

@@ -291,7 +291,7 @@ public class SmsSendServiceImplTest extends BaseMockitoUnitTest {
         // 调用
         smsSendService.receiveSmsStatus(channelCode, text);
         // 断言
-        receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(eq(result.getLogId()), eq(result.getSuccess()),
+        receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(eq(result.getLogId()), eq(result.getSerialNo()), eq(result.getSuccess()),
                 eq(result.getReceiveTime()), eq(result.getErrorCode()), eq(result.getErrorCode())));
     }