Springboot集成腾讯云短信实现系统短信登录注册

  快应用备案     |      2023-08-27
Springboot集成腾讯云短信实现系统短信登录注册

博客:https://www.mintimate.cnMintimate的博客,仅供分享给大家

短信登录

登录模块只不过是一种身份验证。现代社会,每个人都离不开手机。使用手机进行身份验证以及后续的单点登录,无疑是一个好方法。

本次使用Springboot配合腾讯云的短信服务完成后台短信登录逻辑。

准备工作

首先我们看一下准备工作:

腾讯云短信:腾讯云提供了短信分发接口,我们称之为。 Redis:我们生成的验证码由Redis持久化。当然,如果要开通腾讯云的短信服务,前提条件是:

已注册域名:https://cloud.tencent.com/document/product/243否则无法使用腾讯云的短信功能(_;

短信开通

首先我们需要进入短信控制台并激活短信功能:

创建短信签名

其次,我们开通短信服务功能后,我们需要创建短信签名,创建短信签名

比如我注册了一个域名(flyinbug.cn),那么我创建的短信签名:

短信正文模板

现在,我们可以创建正文模板:

可以看到,这里我创建了一个短信登录的模板,其中的{1}类似于Nginx的$1,用于后续使用Springboot时的参数传递。

创建提交后,您可以等待它被审核:

等待审核的同时,可以先完善一下后台逻辑。

考试通过:

此时,您将得到:

signName:短信签名名称; templateId:短信正文模板id;

Maven依赖

我们使用腾讯云的SDK进行打包业务,所以需要引用:

依赖groupId com.tencentcloudapi/groupId artifactIdtencentcloud-sdk-java/artifactId version4.0.11/version/dependency 复制最新版本号参考:https://search.maven.org/artifact/com.tencentcloudapi/tencentcloud-sdk-java-sms

或者,还有Redis:

依赖groupIdorg.springframework.boot/groupId artifactId spring-boot-starter-data-redis/artifactId/dependency复制到这里,前期准备就完成了。我们已准备好进行Java 逻辑部署。

Springboot操作

在Springboot中,我们肯定需要写一个工具包,它有很多实现方法;例如:IOC注入、static静态方法等。

为了方便,我这里使用static静态方法。

官方文档

首先查看官方文档:https://cloud.tencent.com/document/product/382/43194

观察可以看到我们需要参数:

SecretId:腾讯云账号秘密ID; SecretKey:腾讯云账户秘钥; signName:前文中的短信签名名称; templateId:短信正文模板id;其中:signName和templateId是上面已经获取到的;而secretId和secretKey,我们可以在腾讯云控制台中访问:https://console.cloud.tencent.com/cam/capi

为此单独配置。

创建常量类

我们对官方文档中看到的常量参数进行封装,定义一个常量常量类进行存储:

/** * 描述腾讯云短信服务常量* * @author Minimate */public class tencentSmsConst { public static Final String SecretId='';公共静态最终字符串secretKey=''; /* 短信应用ID:【短信控制台】中的SMS SdkAppId 添加应用后实际生成的SdkAppId,如1400006666 */public static final String sdkAppId=''; public static Final String SignName='';} 复制我本来想用IOC注入的东西,我的Springboot就更新了。有些问题……还没有解决;只需使用常量类即可实现。

创建枚举类

想一想,我们还需要传递templateId,即短信的模板ID。如果短信模板只有一个,可以直接写成最终静态类型作为常量属性。但是如果您有多个模板怎么办?

所以,这里我定义了一个枚举类型,方便多模板切换:

/** * Desc 腾讯云短信模板枚举类型* @author Minimate */@Getter@AllArgsConstructorpublic enum SmsTemplateEnum { /** * 短信登录*/LOGIN('1******4','短信登录模板' ), private Final String TemplateID; private Final String TemplateDesc;} 复制一下,用TemplateDesc,方便我用log4j2打印日志.

静态工具包

最后,我们可以编写这个静态工具包:

/** * 腾讯云短信Sendsms * 短信控制台:https://console.cloud.tencent.com/smsv2 */public class tencentSmsUtil { /** * 使用腾讯云短信生成验证码* @param TelephoneNumber 发送对象* @param TemplateID短信模板ID(使用枚举类型) * @param templateParamSet 短信模板参数(这里一般是验证码) * @return 是否成功*/public static boolean sendMessage(String TelephoneNumber, String TemplateID, String. templateParamSet ) { /* 必要步骤: * 实例化认证对象,输入参数需要传入腾讯云账号密钥对secretId和secretKey。 * 这里采用的是从环境变量中读取的方法,需要先在环境变量中设置这两个值。 * 您也可以直接将密钥对写入代码中,但注意不要复制、上传或与他人共享代码, * 以免泄露密钥对,危及您的财产安全。 * CAM密钥查询:https://console.cloud.tencent.com/cam/capi*/Credential cred=new Credential(secretId, SecretKey); SendSmsRequest req=new SendSmsRequest(); SmsClient client=new SmsClient(cred, 'ap-广州'); /* 填写请求参数,其中请求对象的成员变量就是对应接口的输入参数* 可以通过官网接口文档查看请求参数的定义或者跳转到请求的定义object* 基本类型设置: * 帮助链接: * 短信助手:https://cloud.tencent.com/document/product/382/3773 */req.setSmsSdkAppId(sdkAppId); /* 短信签名内容:使用UTF-8编码,必须填写认可的签名,签名信息可以登录【短信控制台】查看*/req.setSignName(SignName); /* 用户的会话内容:可以携带用户端ID等上下文信息,服务器会原样返回*/String sessionContext='xxx'; req.setSessionContext(sessionContext); req.setTemplateId(TemplateID); req.setPhoneNumberSet(new String[]{'+86' + 电话号码}); /* 模板参数:如果没有模板参数,则设置为空*/req.setTemplateParamSet(templateParamSet) ; /* 调用SendSms方法通过客户端对象发起请求。注意,请求方法名对应请求对象* 返回的res是SendSmsResponse类的实例,对应请求对象*/SendSmsResponse res=null;尝试{ res=client.SendSms(req); } catch (TencentCloudSDKException ex) { ex.printStackTrace();返回假; } //将json格式的字符串输出回包中System.out.println(SendSmsResponse.toJsonString(res)); //也可以取出单个值,可以通过官网接口文档或者跳转到响应对象的定义中查看返回字段的定义System.out.println(res.getRequestId()) ;返回真; }} 照搬其实就是对官方模板的简单封装和简化。

演示使用

这里是一个简单的测试使用,简单的设计逻辑是:

Service层逻辑

首先写了一段Service层的调用代码来测试:

@Overridepublic boolean sendSMS(String teleNumber,SmsTemplateEnum smsTemplateEnum) { //随机六个数字String flag=verifyCodeUntil.getVerifyCodes(6); //存储到Redis中,设置有效期为5分钟if (redisUtil.set(teleNumber + '_verifyCodesTest ', flag, 300)) { return tencentSmsUtil.sendMessage(teleNumber, smsTemplateEnum.getTemplateID(), flag); } return false;} 将VerifyCodeUntil复制到我自己的工具包中,生成6位验证码:

公共类VerifyCodeUntil { 私有最终静态字符串源='5678012349'; //验证码中可能出现的字符public static String getVerifyCodes(int longSize){ Random rand=new Random(); StringBuffer 标志=new StringBuffer(); for (int j=0; j 6; j++) { flag.append(sources.charAt(rand.nextInt(9)) + '');返回String.valueOf(flag); }} 复制这个方法,就可以将业务层代码中的测试发送上去。不过我的Redis还不太完善,所以暂时采用这种形式。

在:

Controller层

之后,编写一段Controller测试代码:

/** * 短信登录获取验证码* @param Phone 用户电话号码* @return 结果状态*/@GetMapping('/getVerifyCodesByTelephone') public Result getVerifyCodesByTelephone( @RequestParam(value='telephone') String Phone) {//判断电话号码是否有绑定用户User user=userService.getOne(new LambdaQueryWrapperUser() .eq(User:getUserTele,telephone)); if (Objects.isNull(user)) { return Result.fail(); } } if (userService.sendSMS(电话,SmsTemplateEnum.LOGIN)){ return Result.ok(); } return Result.fail();}/** * 使用短信登录* @param Phone 用户电话号码* @param verifyCodes 验证码* @ return UserDTO */@PostMapping('/VerifyCodesByTelephone') public Result verifyCodesByTelephone( @ RequestParam(value='telephone') String Phone, @RequestParam(value='verifyCodes') String verifyCodes) { //查询验证码Redis 中的对象redisCodes=redisUtil.get(telephone + '_verifyCodesTest'); if (redisCodes==null) { return Result.fail(); } } if (redisCodes.equals(verifyCodes)) { //登录成功,返回UserDTO,封装成自定义Result结果集return Result.ok(userService.loginByTelephone(telephone)); } else { return Result.fail();复制它:

Result:我自定义的返回结果,你可以理解为ResponseEntity。

API测试

之后,使用PAW或Postman测试:

测试成功:

之后就是前端的编写了。比如我的前端:

有点丑,以后会改进的。

END

至此,我们Springboot集成短信登录的总体框架就完成了。大家可以满足更多的需求,完善业务架构。

另外,我没有使用Spring Security。使用Spring Security来集成SMS是合理的。有机会我给大家介绍一下。