# 阿里云短信服务配置完整指南

## 一、前期准备

### 1. 注册阿里云账号
访问 https://www.aliyun.com/ 注册账号并完成实名认证

### 2. 开通短信服务
1. 登录阿里云控制台
2. 搜索"短信服务"并开通
3. 进入短信服务控制台：https://dysms.console.aliyun.com/

## 二、创建短信签名

### 1. 申请签名
- 进入【国内消息】->【签名管理】
- 点击【添加签名】
- 填写签名信息：
  - **签名名称**：红色思政学习平台
  - **签名来源**：网站（需要提供网站备案信息）
  - **签名场景**：验证码
  - **签名说明**：用于用户注册和登录验证
  - **资质证明**：上传相关资质文件

### 2. 审核时间
通常1-2个工作日审核完成

## 三、创建短信模板

### 1. 申请模板
- 进入【国内消息】->【模板管理】
- 点击【添加模板】
- 填写模板信息：
  - **模板类型**：验证码
  - **模板名称**：注册验证码
  - **模板内容**：您的验证码为：${code}，该验证码10分钟内有效，请勿泄漏于他人！

### 2. 注意事项
- 模板必须包含变量：`${code}`
- 验证码模板必须说明有效期
- 必须包含防骗提示语

### 3. 审核时间
通常1-2个工作日审核完成

### 4. 获取模板CODE
审核通过后，会生成模板CODE，格式如：`SMS_123456789`

## 四、创建RAM用户（推荐）

### 1. 为什么使用RAM用户
- 主账号权限过大，不安全
- RAM用户可以精细化权限控制
- 方便管理多个应用的访问权限

### 2. 创建步骤

#### 步骤1：进入访问控制
访问：https://ram.console.aliyun.com/users

#### 步骤2：创建用户
1. 点击【创建用户】
2. 填写用户信息：
   - **登录名称**：school-news-sms
   - **显示名称**：红色思政短信服务
   - **访问方式**：勾选【OpenAPI调用访问】

#### 步骤3：保存AccessKey
创建成功后，**立即下载CSV文件保存AccessKey信息**（只显示一次！）
- AccessKey ID：LTAI5txxxxxxxxxxxxxxxxxx
- AccessKey Secret：xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

#### 步骤4：授权
1. 找到刚创建的用户
2. 点击【添加权限】
3. 搜索并添加权限：`AliyunDysmsFullAccess`（短信服务完全访问权限）

## 五、配置项目

### 1. 在 application.yml 中配置

```yaml
aliyun:
  sms:
    # 是否启用阿里云短信服务（true: 真实发送, false: 模拟模式）
    enabled: true
    # AccessKey ID（从RAM用户获取）
    access-key-id: LTAI5txxxxxxxxxxxxxxxxxx
    # AccessKey Secret（从RAM用户获取）
    access-key-secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    # 短信签名名称（审核通过后的签名名称）
    sign-name: 红色思政学习平台
    # 验证码模板CODE（审核通过后的模板CODE）
    template-code: SMS_123456789
    # 区域ID
    region-id: cn-hangzhou
```

### 2. 开发环境配置

开发环境建议使用模拟模式：

```yaml
aliyun:
  sms:
    enabled: false  # 关闭真实发送
    access-key-id: 
    access-key-secret: 
    sign-name: 红色思政学习平台
    template-code: 
    region-id: cn-hangzhou
```

**模拟模式特点**：
- 不会实际发送短信（节省费用）
- 验证码会在控制台日志中输出
- 适合开发和测试

### 3. 生产环境配置

生产环境使用真实发送：

```yaml
aliyun:
  sms:
    enabled: true  # 开启真实发送
    access-key-id: ${ALIYUN_SMS_ACCESS_KEY_ID}  # 从环境变量读取
    access-key-secret: ${ALIYUN_SMS_ACCESS_KEY_SECRET}  # 从环境变量读取
    sign-name: 红色思政学习平台
    template-code: SMS_123456789
    region-id: cn-hangzhou
```

## 六、测试验证

### 1. 启动项目

```bash
cd schoolNewsServ/admin
mvn spring-boot:run
```

### 2. 测试发送验证码

使用 Postman 或 curl 测试：

```bash
curl -X POST http://localhost:8081/schoolNewsServ/auth/send-sms-code \
  -H "Content-Type: application/json" \
  -d '{"phone":"13800138000"}'
```

### 3. 查看日志

**模拟模式**：
```
【模拟发送】短信验证码，手机号: 13800138000, 验证码: 123456
```

**真实发送**：
```
阿里云短信发送成功，手机号: 13800138000, BizId: 123456789^0
```

## 七、费用说明

### 1. 收费标准
- **验证码短信**：约 ¥0.045/条
- **通知短信**：约 ¥0.045/条
- **推广短信**：约 ¥0.055/条

### 2. 充值方式
1. 进入短信服务控制台
2. 点击【充值】
3. 选择充值金额（建议先充值100元测试）

### 3. 余额查询
控制台首页可查看账户余额和使用情况

## 八、常见问题

### 1. 签名审核不通过
- **原因**：资质不全、信息不符
- **解决**：按审核意见补充资料，重新提交

### 2. 模板审核不通过
- **原因**：内容不规范、缺少必要信息
- **解决**：修改模板内容，确保包含：
  - 验证码变量 `${code}`
  - 有效期说明
  - 防骗提示

### 3. 发送失败：isv.BUSINESS_LIMIT_CONTROL
- **原因**：短信发送频率过高
- **解决**：
  - 同一手机号1分钟内只能发送1条
  - 同一手机号1小时内最多发送5条
  - 同一手机号1天内最多发送10条

### 4. 发送失败：isv.AMOUNT_NOT_ENOUGH
- **原因**：账户余额不足
- **解决**：充值

### 5. 发送失败：isv.MOBILE_NUMBER_ILLEGAL
- **原因**：手机号格式错误
- **解决**：检查手机号是否正确

### 6. 代码中看不到验证码
- **原因**：enabled=true 时真实发送，不会在日志输出
- **解决**：
  - 开发环境设置 `enabled: false`
  - 或查看手机短信

## 九、安全建议

### 1. AccessKey 安全
- ❌ 不要将 AccessKey 直接写在代码中
- ❌ 不要将 AccessKey 提交到 Git 仓库
- ✅ 使用环境变量或配置中心
- ✅ 定期更换 AccessKey
- ✅ 使用 RAM 用户而非主账号

### 2. 防刷机制
系统已实现：
- ✅ 60秒发送频率限制
- ✅ 验证码10分钟有效期
- ✅ Redis存储验证码
- ✅ 手机号格式验证

建议增加：
- 图形验证码
- IP限流
- 黑名单机制

### 3. 监控告警
- 设置短信发送量告警
- 监控异常发送行为
- 定期查看短信发送报表

## 十、技术支持

- 阿里云短信服务文档：https://help.aliyun.com/product/44282.html
- 工单咨询：https://selfservice.console.aliyun.com/ticket/createIndex
- 电话客服：95187

---

**最后提醒**：
1. 开发环境务必使用 `enabled: false` 避免浪费
2. AccessKey 信息要妥善保管
3. 注意短信发送频率限制
4. 定期查看账户余额

