Commit 4c5134ae1cc17815ace13f86fece03f91174d695
1 parent
5107322e
fix:【system 系统功能】腾讯云短信回调没有 logId 需要 serialNo 来更新本地记录
Showing
7 changed files
with
62 additions
and
47 deletions
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,4 +22,8 @@ public interface SmsLogMapper extends BaseMapperX<SmsLogDO> { | ||
| 22 | .orderByDesc(SmsLogDO::getId)); | 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,6 +119,7 @@ public class TencentSmsClient extends AbstractSmsClient { | ||
| 119 | return new SmsReceiveRespDTO() | 119 | return new SmsReceiveRespDTO() |
| 120 | .setSuccess("SUCCESS".equals(statusObj.getStr("report_status"))) // 是否接收成功 | 120 | .setSuccess("SUCCESS".equals(statusObj.getStr("report_status"))) // 是否接收成功 |
| 121 | .setErrorCode(statusObj.getStr("errmsg")) // 状态报告编码 | 121 | .setErrorCode(statusObj.getStr("errmsg")) // 状态报告编码 |
| 122 | + .setErrorMsg(statusObj.getStr("description")) // 状态报告描述 | ||
| 122 | .setMobile(statusObj.getStr("mobile")) // 手机号 | 123 | .setMobile(statusObj.getStr("mobile")) // 手机号 |
| 123 | .setReceiveTime(statusObj.getLocalDateTime("user_receive_time", null)) // 状态报告时间 | 124 | .setReceiveTime(statusObj.getLocalDateTime("user_receive_time", null)) // 状态报告时间 |
| 124 | .setSerialNo(statusObj.getStr("sid")); // 发送序列号 | 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,7 +12,7 @@ import java.util.Map; | ||
| 12 | * 短信日志 Service 接口 | 12 | * 短信日志 Service 接口 |
| 13 | * | 13 | * |
| 14 | * @author zzf | 14 | * @author zzf |
| 15 | - * @date 13:48 2021/3/2 | 15 | + * @since 13:48 2021/3/2 |
| 16 | */ | 16 | */ |
| 17 | public interface SmsLogService { | 17 | public interface SmsLogService { |
| 18 | 18 | ||
| @@ -49,12 +49,13 @@ public interface SmsLogService { | @@ -49,12 +49,13 @@ public interface SmsLogService { | ||
| 49 | * 更新日志的接收结果 | 49 | * 更新日志的接收结果 |
| 50 | * | 50 | * |
| 51 | * @param id 日志编号 | 51 | * @param id 日志编号 |
| 52 | + * @param apiSerialNo 发送编号 | ||
| 52 | * @param success 是否接收成功 | 53 | * @param success 是否接收成功 |
| 53 | * @param receiveTime 用户接收时间 | 54 | * @param receiveTime 用户接收时间 |
| 54 | * @param apiReceiveCode API 接收结果的编码 | 55 | * @param apiReceiveCode API 接收结果的编码 |
| 55 | * @param apiReceiveMsg API 接收结果的说明 | 56 | * @param apiReceiveMsg API 接收结果的说明 |
| 56 | */ | 57 | */ |
| 57 | - void updateSmsReceiveResult(Long id, Boolean success, | 58 | + void updateSmsReceiveResult(Long id, String apiSerialNo, Boolean success, |
| 58 | LocalDateTime receiveTime, String apiReceiveCode, String apiReceiveMsg); | 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,6 +11,7 @@ import lombok.extern.slf4j.Slf4j; | ||
| 11 | import org.springframework.stereotype.Service; | 11 | import org.springframework.stereotype.Service; |
| 12 | 12 | ||
| 13 | import jakarta.annotation.Resource; | 13 | import jakarta.annotation.Resource; |
| 14 | + | ||
| 14 | import java.time.LocalDateTime; | 15 | import java.time.LocalDateTime; |
| 15 | import java.util.Map; | 16 | import java.util.Map; |
| 16 | import java.util.Objects; | 17 | import java.util.Objects; |
| @@ -63,10 +64,17 @@ public class SmsLogServiceImpl implements SmsLogService { | @@ -63,10 +64,17 @@ public class SmsLogServiceImpl implements SmsLogService { | ||
| 63 | } | 64 | } |
| 64 | 65 | ||
| 65 | @Override | 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 | String apiReceiveCode, String apiReceiveMsg) { | 68 | String apiReceiveCode, String apiReceiveMsg) { |
| 68 | SmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ? | 69 | SmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ? |
| 69 | SmsReceiveStatusEnum.SUCCESS : SmsReceiveStatusEnum.FAILURE; | 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 | smsLogMapper.updateById(SmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus()) | 78 | smsLogMapper.updateById(SmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus()) |
| 71 | .receiveTime(receiveTime).apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build()); | 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,7 +184,7 @@ public class SmsSendServiceImpl implements SmsSendService { | ||
| 184 | return; | 184 | return; |
| 185 | } | 185 | } |
| 186 | // 更新短信日志的接收结果. 因为量一般不大,所以先使用 for 循环更新 | 186 | // 更新短信日志的接收结果. 因为量一般不大,所以先使用 for 循环更新 |
| 187 | - receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(result.getLogId(), | 187 | + receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(result.getLogId(), result.getSerialNo(), |
| 188 | result.getSuccess(), result.getReceiveTime(), result.getErrorCode(), result.getErrorMsg())); | 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,47 +41,47 @@ public class SmsLogServiceImplTest extends BaseDbUnitTest { | ||
| 41 | 41 | ||
| 42 | @Test | 42 | @Test |
| 43 | public void testGetSmsLogPage() { | 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 | @Test | 87 | @Test |
| @@ -153,13 +153,14 @@ public class SmsLogServiceImplTest extends BaseDbUnitTest { | @@ -153,13 +153,14 @@ public class SmsLogServiceImplTest extends BaseDbUnitTest { | ||
| 153 | smsLogMapper.insert(dbSmsLog); | 153 | smsLogMapper.insert(dbSmsLog); |
| 154 | // 准备参数 | 154 | // 准备参数 |
| 155 | Long id = dbSmsLog.getId(); | 155 | Long id = dbSmsLog.getId(); |
| 156 | + String apiSerialNo = dbSmsLog.getApiSerialNo(); | ||
| 156 | Boolean success = randomBoolean(); | 157 | Boolean success = randomBoolean(); |
| 157 | LocalDateTime receiveTime = randomLocalDateTime(); | 158 | LocalDateTime receiveTime = randomLocalDateTime(); |
| 158 | String apiReceiveCode = randomString(); | 159 | String apiReceiveCode = randomString(); |
| 159 | String apiReceiveMsg = randomString(); | 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 | dbSmsLog = smsLogMapper.selectById(id); | 165 | dbSmsLog = smsLogMapper.selectById(id); |
| 165 | assertEquals(success ? SmsReceiveStatusEnum.SUCCESS.getStatus() | 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,7 +291,7 @@ public class SmsSendServiceImplTest extends BaseMockitoUnitTest { | ||
| 291 | // 调用 | 291 | // 调用 |
| 292 | smsSendService.receiveSmsStatus(channelCode, text); | 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 | eq(result.getReceiveTime()), eq(result.getErrorCode()), eq(result.getErrorCode()))); | 295 | eq(result.getReceiveTime()), eq(result.getErrorCode()), eq(result.getErrorCode()))); |
| 296 | } | 296 | } |
| 297 | 297 |