diff --git a/docs/02-技术方案/H5会员接口需求与技术方案.md b/docs/02-技术方案/H5会员接口需求与技术方案.md index cf8fa3a..15990c4 100644 --- a/docs/02-技术方案/H5会员接口需求与技术方案.md +++ b/docs/02-技术方案/H5会员接口需求与技术方案.md @@ -2,7 +2,7 @@ > 作者:湖北新华业务中台研发团队 > 创建时间:2026-02-02 -> 版本:v1.0 +> 版本:v1.1 --- @@ -189,6 +189,8 @@ ``` backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/ ├── h5/ # H5接口模块 +│ ├── config/ +│ │ └── H5SmsProperties.java # 短信防刷配置类 │ ├── controller/ │ │ ├── H5AuthController.java # 认证接口 │ │ ├── H5MemberController.java # 会员信息接口 @@ -265,12 +267,75 @@ sms: template-id: SMS_XXXXXX ``` -短信验证码逻辑: +#### 短信防刷配置(application.yml) + +```yaml +h5: + sms: + # 是否启用短信发送(false时仅打印日志,用于测试) + enabled: false + # 验证码长度 + code-length: 6 + # 验证码有效期(分钟) + code-expire-minutes: 5 + # 同一手机号发送间隔(秒) + send-interval-seconds: 60 + # 同一手机号每日发送上限 + daily-limit-per-phone: 10 + # 同一IP每分钟发送上限 + minute-limit-per-ip: 5 + # 同一IP每日发送上限 + daily-limit-per-ip: 50 + # 黑名单封禁时长(分钟) + blacklist-minutes: 30 + # 触发黑名单的验证失败次数 + blacklist-trigger-count: 5 + # 阿里云短信配置名称(对应sms.blends下的配置) + sms-config-name: alibaba + # 短信模板ID - 登录 + login-template-id: '' + # 短信模板ID - 注册 + register-template-id: '' +``` + +#### 防刷策略 + +| 层级 | 策略 | 配置项 | 默认值 | +|------|------|--------|--------| +| 前置 | 图形验证码校验 | - | 必须 | +| 手机号 | 黑名单检查 | `blacklist-minutes` | 30分钟 | +| 手机号 | 发送间隔限制 | `send-interval-seconds` | 60秒 | +| 手机号 | 每日发送上限 | `daily-limit-per-phone` | 10条 | +| IP | 黑名单检查 | `blacklist-minutes` | 30分钟 | +| IP | 每分钟发送上限 | `minute-limit-per-ip` | 5条 | +| IP | 每日发送上限 | `daily-limit-per-ip` | 50条 | +| 验证 | 连续失败自动封禁 | `blacklist-trigger-count` | 5次 | + +#### 验证码发送流程 + 1. 校验图形验证码 -2. 频率限制(60秒内不可重发) -3. 生成6位数字验证码,5分钟有效 -4. 存入Redis:`h5:sms:{phone}:{type}` -5. 调用阿里云API发送 +2. 检查手机号是否在黑名单 +3. 检查IP是否在黑名单 +4. 检查发送间隔(60秒) +5. 检查手机号每日上限 +6. 检查IP每分钟上限 +7. 检查IP每日上限 +8. 业务校验(注册:手机号未注册;登录:手机号已注册) +9. 生成验证码并存入Redis +10. 更新各项计数器 +11. 调用阿里云API发送(测试模式仅打印日志) + +#### Redis Key 设计 + +| Key | 说明 | TTL | +|-----|------|-----| +| `h5:sms:code:{type}:{phone}` | 验证码 | 5分钟 | +| `h5:sms:daily:phone:{date}:{phone}` | 手机号每日计数 | 1天 | +| `h5:sms:minute:ip:{ip}` | IP每分钟计数 | 1分钟 | +| `h5:sms:daily:ip:{date}:{ip}` | IP每日计数 | 1天 | +| `h5:sms:blacklist:phone:{phone}` | 手机号黑名单 | 30分钟 | +| `h5:sms:blacklist:ip:{ip}` | IP黑名单 | 30分钟 | +| `h5:sms:fail:{phone}` | 验证失败计数 | 5分钟 | ### 3.5 数据库设计