腾讯云短信回调没有logId 需要serialNo来更新本地记录

https://gitee.com/zhijiantianya/yudao-cloud/issues/ICNG6O
pull/203/head
yubaolin 2025-08-07 17:29:51 +08:00
parent 2382c3d844
commit 2de710190e
6 changed files with 17 additions and 7 deletions

View File

@ -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")); // 发送序列号

View File

@ -49,12 +49,13 @@ public interface SmsLogService {
*
*
* @param id
* @param serialNo
* @param success
* @param receiveTime
* @param apiReceiveCode API
* @param apiReceiveMsg API
*/
void updateSmsReceiveResult(Long id, Boolean success,
void updateSmsReceiveResult(Long id, String serialNo, Boolean success,
LocalDateTime receiveTime, String apiReceiveCode, String apiReceiveMsg);
/**

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.system.service.sms;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsLogDO;
@ -7,6 +8,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO;
import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsLogMapper;
import cn.iocoder.yudao.module.system.enums.sms.SmsReceiveStatusEnum;
import cn.iocoder.yudao.module.system.enums.sms.SmsSendStatusEnum;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -63,12 +65,17 @@ public class SmsLogServiceImpl implements SmsLogService {
}
@Override
public void updateSmsReceiveResult(Long id, Boolean success, LocalDateTime receiveTime,
public void updateSmsReceiveResult(Long id, String serialNo, Boolean success, LocalDateTime receiveTime,
String apiReceiveCode, String apiReceiveMsg) {
SmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ?
SmsReceiveStatusEnum.SUCCESS : SmsReceiveStatusEnum.FAILURE;
smsLogMapper.updateById(SmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus())
.receiveTime(receiveTime).apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build());
smsLogMapper.update(new LambdaUpdateWrapper<SmsLogDO>()
.set(SmsLogDO::getReceiveStatus, receiveStatus.getStatus())
.set(SmsLogDO::getReceiveTime, receiveTime)
.set(SmsLogDO::getApiReceiveCode, apiReceiveCode)
.set(SmsLogDO::getApiReceiveMsg, apiReceiveMsg)
.eq(id != null && id > 0, SmsLogDO::getId, id)
.eq(!StrUtil.isEmptyIfStr(serialNo), SmsLogDO::getApiSerialNo, serialNo));
}
@Override

View File

@ -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()));
}

View File

@ -153,13 +153,14 @@ public class SmsLogServiceImplTest extends BaseDbUnitTest {
smsLogMapper.insert(dbSmsLog);
// 准备参数
Long id = dbSmsLog.getId();
String serialNo = dbSmsLog.getApiSerialNo();
Boolean success = randomBoolean();
LocalDateTime receiveTime = randomLocalDateTime();
String apiReceiveCode = randomString();
String apiReceiveMsg = randomString();
// 调用
smsLogService.updateSmsReceiveResult(id, success, receiveTime, apiReceiveCode, apiReceiveMsg);
smsLogService.updateSmsReceiveResult(id, serialNo, success, receiveTime, apiReceiveCode, apiReceiveMsg);
// 断言
dbSmsLog = smsLogMapper.selectById(id);
assertEquals(success ? SmsReceiveStatusEnum.SUCCESS.getStatus()

View File

@ -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())));
}