6.1 KiB
6.1 KiB
短信服务迁移说明 - 从阿里云SMS到腾讯云SMS
迁移概述
将短信服务从阿里云SMS迁移到腾讯云SMS,保持原有功能不变。
1. 代码变更
1.1 SmsServiceImpl.java
位置:src/main/java/com/xy/xyaicpzs/service/impl/SmsServiceImpl.java
主要变更:
- 移除阿里云SDK依赖(
com.aliyun.dysmsapi20170525) - 引入腾讯云SDK(
com.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 单元测试
- 测试验证码生成
- 测试发送次数限制
- 测试验证码验证
8.2 集成测试
- 发送验证码到真实手机号
- 验证短信内容格式
- 验证验证码有效期
- 验证每日发送次数限制
8.3 测试命令
curl -X POST http://localhost:8123/api/sms/sendCode \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "phoneNumber=13868246742"
9. 注意事项
-
配置敏感信息:
- 不要将
secret-id和secret-key提交到代码仓库 - 使用环境变量或配置中心管理
- 不要将
-
模板审核:
- 确保腾讯云控制台中模板ID
2598660已审核通过 - 确保签名"西安溢彩数智科技有限公司"已审核通过
- 确保腾讯云控制台中模板ID
-
地域选择:
- 默认使用
ap-guangzhou(广州) - 可根据实际情况修改为其他地域
- 默认使用
-
费用:
- 腾讯云SMS按条计费
- 建议在控制台设置费用告警
10. 回滚方案
如果需要回滚到阿里云SMS:
- 恢复
SmsServiceImpl.java的旧版本 - 恢复
application.yml中的阿里云配置 - 确保阿里云SDK依赖存在
- 重启应用
11. 完成状态
✅ 代码迁移完成 ✅ 配置文件更新 ✅ 编译检查通过 ✅ 功能保持不变
迁移已完成,可以部署使用!