| | |
| | | * 下发短信验证码 |
| | | * |
| | | * @param phone 手机号 |
| | | * @param scene 场景编码(register/reset/为空) |
| | | * @param scene 场景编码(register=注册 / login=登录 / reset=重置密码 / 其它=通用下发) |
| | | */ |
| | | public void sendCode(String phone, String scene) |
| | | { |
| | |
| | | |
| | | SmsSceneEnum sceneEnum = SmsSceneEnum.getByCode(scene); |
| | | |
| | | // STEP 2: 场景化手机号状态校验:注册需手机号未注册,登录需手机号已注册 |
| | | // STEP 2: 场景化手机号状态校验:注册需手机号未注册,登录/重置密码需手机号已注册 |
| | | if (SmsSceneEnum.REGISTER == sceneEnum) |
| | | { |
| | | checkPhoneNotRegistered(phone); |
| | | } |
| | | else if (SmsSceneEnum.LOGIN == sceneEnum) |
| | | else if (SmsSceneEnum.LOGIN == sceneEnum || SmsSceneEnum.RESET == sceneEnum) |
| | | { |
| | | checkPhoneRegistered(phone); |
| | | } |
| | |
| | | { |
| | | SmsSceneEnum sceneEnum = SmsSceneEnum.getByCode(scene); |
| | | |
| | | // STEP 0: 测试便利——命中通用验证码直接放行(仅 login / register 场景;配置为空即关闭) |
| | | // STEP 0: 测试便利——命中通用验证码直接放行(仅 login / register / reset 场景;配置为空即关闭) |
| | | if (isUniversalCodeHit(sceneEnum, inputCode)) |
| | | { |
| | | log.warn("[SMS_VERIFY] universal code hit, phone={}, scene={}", maskPhone(phone), sceneEnum.getCode()); |
| | |
| | | /** |
| | | * 判定是否命中通用验证码(测试便利) |
| | | * |
| | | * 仅 login / register 场景生效;命中即直接放行,不读缓存、不计数、不消费。 |
| | | * 仅 login / register / reset 场景生效;命中即直接放行,不读缓存、不计数、不消费。 |
| | | * |
| | | * @param sceneEnum 场景枚举 |
| | | * @param inputCode 用户输入的验证码 |
| | |
| | | { |
| | | return false; |
| | | } |
| | | // 仅登录 / 注册场景放行,避免重置密码等场景被通用码绕过 |
| | | if (SmsSceneEnum.LOGIN != sceneEnum && SmsSceneEnum.REGISTER != sceneEnum) |
| | | // 仅登录 / 注册 / 重置密码场景放行,避免其它场景被通用码绕过 |
| | | if (SmsSceneEnum.LOGIN != sceneEnum && SmsSceneEnum.REGISTER != sceneEnum && SmsSceneEnum.RESET != sceneEnum) |
| | | { |
| | | return false; |
| | | } |