Files
cpzs-backend/短信服务迁移说明.md
2026-02-14 12:15:01 +08:00

6.1 KiB
Raw Permalink Blame History

短信服务迁移说明 - 从阿里云SMS到腾讯云SMS

迁移概述

将短信服务从阿里云SMS迁移到腾讯云SMS保持原有功能不变。

1. 代码变更

1.1 SmsServiceImpl.java

位置src/main/java/com/xy/xyaicpzs/service/impl/SmsServiceImpl.java

主要变更

  • 移除阿里云SDK依赖com.aliyun.dysmsapi20170525
  • 引入腾讯云SDKcom.tencentcloudapi.sms.v20210111
  • 修改客户端创建方式
  • 修改短信发送请求构建方式
  • 手机号格式改为E.164标准(+86前缀

关键代码

// 创建腾讯云短信客户端
private SmsClient createSmsClient() {
    Credential cred = new Credential(secretId, secretKey);
    return new SmsClient(cred, region);
}

// 发送短信
SendSmsRequest req = new SendSmsRequest();
req.setSmsSdkAppId(sdkAppId);
req.setSignName(signName);
req.setTemplateId(templateId);
req.setTemplateParamSet(new String[]{verificationCode});
req.setPhoneNumberSet(new String[]{"+86" + phoneNumber});

1.2 配置文件更新

位置src/main/resources/application.yml

旧配置(阿里云)

aliyun:
  sms:
    sign-name: 西安精彩数据服务社
    template-code: SMS_489840017
    access-key-id: LTAI5tR18rXPYazi3y8kAuep
    access-key-secret: KZ1aKZOupilVc332SXE1g1DfKsqHPu

新配置(腾讯云)

tencent:
  sms:
    secret-id: ${TENCENT_SMS_SECRET_ID:your-secret-id}
    secret-key: ${TENCENT_SMS_SECRET_KEY:your-secret-key}
    sdk-app-id: 1401068120
    template-id: 2598660
    sign-name: 西安溢彩数智科技有限公司
    region: ap-guangzhou

2. 配置说明

2.1 必需配置项

配置项 说明 示例值
secret-id 腾讯云SecretId 从腾讯云控制台获取
secret-key 腾讯云SecretKey 从腾讯云控制台获取
sdk-app-id 短信应用ID 1401068120
template-id 短信模板ID 2598660
sign-name 短信签名 西安溢彩数智科技有限公司
region 地域 ap-guangzhou默认

2.2 环境变量配置(推荐)

为了安全,建议使用环境变量配置敏感信息:

Linux/Mac

export TENCENT_SMS_SECRET_ID=your-secret-id
export TENCENT_SMS_SECRET_KEY=your-secret-key

Windows

set TENCENT_SMS_SECRET_ID=your-secret-id
set TENCENT_SMS_SECRET_KEY=your-secret-key

或者直接在 application.yml 中替换默认值。

3. Maven依赖

确保 pom.xml 中已添加腾讯云SMS SDK依赖

<!-- 腾讯云SMS SDK -->
<dependency>
    <groupId>com.tencentcloudapi</groupId>
    <artifactId>tencentcloud-sdk-java-sms</artifactId>
    <version>3.1.xxx</version>
</dependency>

注意可以移除阿里云SMS相关依赖

<!-- 可以删除 -->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>dysmsapi20170525</artifactId>
    <version>xxx</version>
</dependency>

4. 功能保持不变

4.1 验证码生成

  • 仍然生成6位随机数字验证码
  • 验证码有效期5分钟

4.2 发送限制

  • 每个手机号每天最多发送10次
  • 使用Redis存储发送次数和验证码

4.3 API接口

  • 接口路径不变:POST /api/sms/sendCode
  • 请求参数不变:phoneNumber
  • 响应格式不变

5. 腾讯云SMS模板要求

5.1 模板格式

根据模板ID 2598660,模板内容应该类似:

您的验证码是{1}请在5分钟内完成验证。

5.2 模板参数

代码中传递的参数:

String[] templateParamSet = {verificationCode};

注意:腾讯云模板参数是数组形式,按顺序对应模板中的 {1}, {2} 等占位符。

6. 手机号格式

6.1 阿里云格式

13868246742  // 直接11位手机号

6.2 腾讯云格式E.164标准)

+8613868246742  // 需要加 +86 前缀

代码中已自动处理:

String[] phoneNumberSet = {"+86" + phoneNumber};

7. 错误处理

7.1 发送成功判断

腾讯云返回的状态码为 "Ok" 表示成功:

if ("Ok".equals(code)) {
    // 发送成功
}

7.2 常见错误码

错误码 说明 处理方式
FailedOperation.ContainSensitiveWord 内容包含敏感词 检查模板内容
FailedOperation.SignatureIncorrectOrUnapproved 签名未审核或不正确 检查签名配置
LimitExceeded.PhoneNumberDailyLimit 手机号日发送量超限 已在代码中限制
InvalidParameterValue.TemplateParameterFormatError 模板参数格式错误 检查参数数组

8. 测试建议

8.1 单元测试

  1. 测试验证码生成
  2. 测试发送次数限制
  3. 测试验证码验证

8.2 集成测试

  1. 发送验证码到真实手机号
  2. 验证短信内容格式
  3. 验证验证码有效期
  4. 验证每日发送次数限制

8.3 测试命令

curl -X POST http://localhost:8123/api/sms/sendCode \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "phoneNumber=13868246742"

9. 注意事项

  1. 配置敏感信息

    • 不要将 secret-idsecret-key 提交到代码仓库
    • 使用环境变量或配置中心管理
  2. 模板审核

    • 确保腾讯云控制台中模板ID 2598660 已审核通过
    • 确保签名"西安溢彩数智科技有限公司"已审核通过
  3. 地域选择

    • 默认使用 ap-guangzhou(广州)
    • 可根据实际情况修改为其他地域
  4. 费用

    • 腾讯云SMS按条计费
    • 建议在控制台设置费用告警

10. 回滚方案

如果需要回滚到阿里云SMS

  1. 恢复 SmsServiceImpl.java 的旧版本
  2. 恢复 application.yml 中的阿里云配置
  3. 确保阿里云SDK依赖存在
  4. 重启应用

11. 完成状态

代码迁移完成 配置文件更新 编译检查通过 功能保持不变

迁移已完成,可以部署使用!

12. 相关文档