腾讯云实现短信验证码登录

腾讯云实现短信验证码登录

腾讯云配置

首先在腾讯云搜索短信
在这里插入图片描述

然后按要求创建短信签名,短信模板。短信模板很容易审核,但是签名比较复杂,需要按要求填写和上传相关信息。如果驳回可以查看哪里出问题,然后继续提交审核。
在这里插入图片描述
成功以后可以查看,要记住签名内容,下面会用到。
在这里插入图片描述
都创建成功以后就可以编写后端代码了

后端逻辑实现

在pom.xml中导入依赖

 <!--腾讯云短信-->
        <dependency>
            <groupId>com.tencentcloudapi</groupId>
            <artifactId>tencentcloud-sdk-java</artifactId>
            <version>3.1.284</version>
        </dependency>
        <dependency>
            <groupId>com.github.qcloudsms</groupId>
            <artifactId>qcloudsms</artifactId>
            <version>1.0.6</version>
        </dependency>

在yml中配置信息

tencent:
  msm:
    id: 填入自己的访问秘钥,位置在右上角点击个人头像->选择访问管理->新建秘钥
    secret: 上面查到的第二个信息, 这个是secretkey
    appId: 短信控制台页面->左侧应用管理->应用列表的 SDKAppId
    signName: 短信控制台页面->左侧国内短信->签名管理 签名内容
    templateId: 短信控制台页面->左侧国内短信->正文模板管理 Id

如图

在这里插入图片描述
编写自动生成验证码的工具类,可自行修改

public class ValidateCodeUtils {
    /**
     * 随机生成验证码
     * @param length 长度为4位或者6位
     * @return
     */
    public static Integer generateValidateCode(int length){
        Integer code =null;
        if(length == 4){
            code = new Random().nextInt(9999);//生成随机数,最大为9999
            if(code < 1000){
                code = code + 1000;//保证随机数为4位数字
            }
        }else if(length == 6){
            code = new Random().nextInt(999999);//生成随机数,最大为999999
            if(code < 100000){
                code = code + 100000;//保证随机数为6位数字
            }
        }else{
            throw new RuntimeException("只能生成4位或6位数字验证码");
        }
        return code;
    }

    /**
     * 随机生成指定长度字符串验证码
     * @param length 长度
     * @return
     */
    public static String generateValidateCode4String(int length){
        Random rdm = new Random();
        String hash1 = Integer.toHexString(rdm.nextInt());
        String capstr = hash1.substring(0, length);
        return capstr;
    }
}

然后编写调用yml中配置的参数的工具类

@Component
public class MsmConstantUtils implements InitializingBean {
        @Value("${tencent.msm.id}")
        private String secretID ;

        @Value("${tencent.msm.secret}")
        private String secretKey ;

        @Value("${tencent.msm.appId}")
        private String appId;

        @Value("${tencent.msm.signName}")
        private String signName;

        @Value("${tencent.msm.templateId}")
        private String templateId;
        //六个相关的参数
        public static String SECRET_ID;
        public static String SECRET_KEY;
        public static String APP_ID;
        public static String SIGN_NAME;
        public static String TEMPLATE_ID;

        @Override
        public void afterPropertiesSet() throws Exception {
            SECRET_ID = secretID;
            SECRET_KEY = secretKey;
            APP_ID = appId;
            SIGN_NAME = signName;
            TEMPLATE_ID = templateId;
        }
    }

然后编写短信发送的工具类

public class SMSUtils {
	public static boolean send(String phone, String code) {
		//判断手机是否为null
		if (StringUtils.isEmpty(phone)){
			return false;
		}
		try {
			/* 必要步骤:
			 * 实例化一个认证对象,入参需要传入腾讯云账户密钥对 secretId 和 secretKey
			 * 本示例采用从环境变量读取的方式,需要预先在环境变量中设置这两个值
			 * 您也可以直接在代码中写入密钥对,但需谨防泄露,不要将代码复制、上传或者分享给他人
			 * CAM 密钥查询:https://console.cloud.tencent.com/cam/capi
			 */
			Credential cred = new Credential(MsmConstantUtils.SECRET_ID, MsmConstantUtils.SECRET_KEY);


			// 实例化一个http选项,可选的,没有特殊需求可以跳过
			HttpProfile httpProfile = new HttpProfile();
			httpProfile.setEndpoint("sms.tencentcloudapi.com");
			// 实例化一个client选项,可选的,没有特殊需求可以跳过
			ClientProfile clientProfile = new ClientProfile();
			clientProfile.setHttpProfile(httpProfile);
			// 实例化要请求产品的client对象,clientProfile是可选的
			SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile);
			// 实例化一个请求对象,每个接口都会对应一个request对象
			SendSmsRequest req = new SendSmsRequest();
			String[] phoneNumberSet1 = {"+86"+phone};
			req.setPhoneNumberSet(phoneNumberSet1);

			req.setSmsSdkAppid(MsmConstantUtils.APP_ID);
			req.setSign(MsmConstantUtils.SIGN_NAME);
			req.setTemplateID(MsmConstantUtils.TEMPLATE_ID);

			String[] templateParamSet1 = {code};
			req.setTemplateParamSet(templateParamSet1);
			// 返回的resp是一个SendSmsResponse的实例,与请求对象对应
			SendSmsResponse resp = client.SendSms(req);
			// 输出 JSON 格式的字符串回包
			System.out.println(SendSmsResponse.toJsonString(resp));
			return true;
		} catch (TencentCloudSDKException e) {
			e.printStackTrace();
		}
		return false;
	}
}

然后只需要使用SMSUtils.send(phone,code);方法即可发送短信。具体实现如下:

    @PostMapping("/sendMsg")
    public Result<String> sendMsg(@RequestBody User user){
        //获取手机号
        String phone = user.getPhone();
        if(StringUtils.isNotEmpty(phone)){
            //生成随机的四位验证码
            String code = ValidateCodeUtils.generateValidateCode(4).toString();
            log.info("code={}",code);
            //发送短信
            boolean flag = SMSUtils.send(phone,code);
            if (flag){
                //将生成的验证码缓存到redis中,设置有效期五分钟
                redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
                return Result.success("手机验证码发送成功");
            }
        }
        return Result.error("发送失败");
    }

然后就可以运行测试了
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

String_name_null

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值