接入腾讯云短信服务 实现手机验证注册
上回说到 ,完成了security的接入和登录功能,但是在准备登录尝试security的强大时发现,还没有完成注册功能,根本没有账号提供登录,那么这回,就实现手机号注册功能。
手机号注册逻辑很简单,说白了就是证明手机号是你自己的就行了,具体流程就是,用户请求服务,服务生成验证码,通过短信形式发送到指定手机号上,然后请求注册接口,携带注册信息、手机号和手机收到的验证码,服务收到注册请求,校验验证码是不是之前自己发出的,校验通过后保存注册用户信息即完成注册。逻辑流程都很简单,这里主要是记录一下,对接云短信服务的过程。
云短信服务商
既然要发短信,那肯定是直接接入云短信服务,支持短信服务的云服务商一抓一大把,价格基本合理,但是基本上所有短信服务商为了防止不良用途,都需要校验我们的营业执照之类的资料,总之想接入还是蛮麻烦,然而我这里以学习为目的,搞这些资料不容易,所以这里选择了腾讯云的短信服务,首先腾讯的地位和名头毋庸置疑,其次也是最重要的一点,腾讯云可以通过公众号来申请短信服务,而公众号的开通就很方便了。
这里短信服务的开通就不介绍了,反正按照平台提示一步步来就行了,基本所有平台都一样。
创建短信发送服务
考虑到可能还有别的业务需要用到短信服务,所以稍微对短信服务封装一下
在项目路径下创建一个包起名叫send,叫send是打算将发送邮件相关的服务也放在这个包,所以不适合叫sms,就干脆叫send好了,逻辑没啥好说的,下面直接上代码好了。
创建SendController
,用于对外提供发送短信或邮件的接口,目前只需要一个接口
/**
* @author: ZhangZhao
* @date: 2022/2/10 11:59
* @description: 对外提供发送短信或邮件服务
*/
@RestController
@RequiredArgsConstructor
@RequestMapping(SysApi.SEND)
public class SendController {
private final SmsSendService smsSendService;
/**
* 发送短信验证码
* @param req 手机号和短信类型
* @return 发送结果
*/
@PostMapping("/verificationCode")
public Result<Void> sendVerificationCode(@Valid @RequestBody SendVerificationCodeReq req){
SmsTypeEnum smsType = SmsTypeEnum.getEnumByCode(req.getTypeCode());
smsSendService.sendVerificationCode(smsType.getSmsTemplateId(),req.getPhoneNum());
return Result.success();
}
}
SendVerificationCodeReq类
/**
* @author: ZhangZhao
* @date: 2022/2/10 14:45
* @description: 发送验证码接口入参
*/
@Setter
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class SendVerificationCodeReq {
/**
* 这个字段对应`SmsTypeEnum`枚举类中的标识码
*/
@NotNull(message = "验证码类型必须填写!")
private Integer typeCode;
@NotNull(message = "手机号不能为空!")
@Pattern(regexp = Constants.Regexp.PHONE_NUM,message = "请填写正确的手机号!")
private String phoneNum;
}
这个接口专门用于发送验证码短信,通过SmsTypeEnum
来标识不同的业务验证码和对应的短信模板
/**
* @author: ZhangZhao
* @date: 2022/2/10 14:55
* @description: 短信类型枚举:用于描述短信用途和对应短信模板
*/
@Getter
@AllArgsConstructor
public enum SmsTypeEnum {
/**
* 注册验证码
*/
SMS_PIN_REGISTER(10001,"1299215","注册验证码"),
/**
* 登录验证码 TODO 登录短信模版还未创建
*/
SMS_PIN_LOGIN(10002,"","登录验证码"),;
/**
* 标识码
*/
private final Integer code;
/**
* 短信模板ID
*/
private final String smsTemplateId;
/**
* 描述
*/
private final String message;
private static final Set<SmsTypeEnum> ALL = EnumSet.allOf(SmsTypeEnum.class);
public static SmsTypeEnum g