# 短信服务迁移说明 - 从阿里云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前缀）

**关键代码**：
```java
// 创建腾讯云短信客户端
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`

**旧配置（阿里云）**：
```yaml
aliyun:
  sms:
    sign-name: 西安精彩数据服务社
    template-code: SMS_489840017
    access-key-id: LTAI5tR18rXPYazi3y8kAuep
    access-key-secret: KZ1aKZOupilVc332SXE1g1DfKsqHPu
```

**新配置（腾讯云）**：
```yaml
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**：
```bash
export TENCENT_SMS_SECRET_ID=your-secret-id
export TENCENT_SMS_SECRET_KEY=your-secret-key
```

**Windows**：
```cmd
set TENCENT_SMS_SECRET_ID=your-secret-id
set TENCENT_SMS_SECRET_KEY=your-secret-key
```

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

## 3. Maven依赖

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

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

**注意**：可以移除阿里云SMS相关依赖：
```xml
<!-- 可以删除 -->
<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 模板参数
代码中传递的参数：
```java
String[] templateParamSet = {verificationCode};
```

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

## 6. 手机号格式

### 6.1 阿里云格式
```
13868246742  // 直接11位手机号
```

### 6.2 腾讯云格式（E.164标准）
```
+8613868246742  // 需要加 +86 前缀
```

代码中已自动处理：
```java
String[] phoneNumberSet = {"+86" + phoneNumber};
```

## 7. 错误处理

### 7.1 发送成功判断
腾讯云返回的状态码为 `"Ok"` 表示成功：
```java
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 测试命令
```bash
curl -X POST http://localhost:8123/api/sms/sendCode \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "phoneNumber=13868246742"
```

## 9. 注意事项

1. **配置敏感信息**：
   - 不要将 `secret-id` 和 `secret-key` 提交到代码仓库
   - 使用环境变量或配置中心管理

2. **模板审核**：
   - 确保腾讯云控制台中模板ID `2598660` 已审核通过
   - 确保签名"西安溢彩数智科技有限公司"已审核通过

3. **地域选择**：
   - 默认使用 `ap-guangzhou`（广州）
   - 可根据实际情况修改为其他地域

4. **费用**：
   - 腾讯云SMS按条计费
   - 建议在控制台设置费用告警

## 10. 回滚方案

如果需要回滚到阿里云SMS：

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

## 11. 完成状态

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

**迁移已完成，可以部署使用！**

## 12. 相关文档

- [腾讯云SMS SDK文档](https://cloud.tencent.com/document/product/382/43199)
- [腾讯云SMS API文档](https://cloud.tencent.com/document/api/382/52071)
- [腾讯云SMS控制台](https://console.cloud.tencent.com/smsv2)
