一.实现思路
1.前端发请求接收短信验证码,为防止程序恶意请求,先做图形验证码校验。
参数:手机号,redis中图片验证码key,用户输入的图片验证码的值
2.拿出图片验证码,校验图片验证码
3.获取上一次的短信验证码发送记录,区分存在存在与否,沿用或者生成新的手机验证码
4.保存手机验证码到redis
key:业务键+phone
value(时间 , 验证码 -> DTO)
5.调用短信网关发送
6.为方便管理,存储发送记录到数据库
获取IP:RequestContextHolder
二.具体实现
1.生成dtol类保存前端用于短信验证的请求参数
@Data
public class SendSMSParm {
@NotNull(message = "不能为空")
private String mobile;
@NotNull(message = "不能为空")
private String imageCode;
@NotNull(message = "系统异常,请稍后重试")
private String imageCodeKey;
}
2.实现调用接口
/**
* 手机验证码
*/
@PostMapping(value="/sendSmsCode")
public JSONResult sendSmsCode(@RequestBody @Validated SendSMSParm parm){
verifycodeService.sendSmsCode(parm);
return JSONResult.success();
}
3.具体实现
为防止网络延迟带来的短信接收问题,短信验证码在过期时间类沿用之前的验证码,并更新过期时间