利用手机验证码进行注册或进行下一步操作已经是非常普遍的,这篇文章就教你如何是用腾讯云短信服务发送手机验证码。
文章目录
一、前提条件
腾讯云官网账号,已开通短信服务
需要用到的参数 1.短信签名id,(需要审核)
2.短信正文签名模板,(需要创建审核)
3.应用id,(创建)
4.有剩余短信包(新用户开通后有免费200条,可购买)
上面是需要具备的前提条件,腾讯云还可以设置条数限制。代码开发需要用到上面的参数,不懂得如何获得参数的可以去看这个视频 https://www.bilibili.com/video/BV1KE411K7Sd
二、代码实现
1.引入依赖
<!--腾讯云手机验证码-->
<dependency>
<groupId>com.github.qcloudsms</groupId>
<artifactId>qcloudsms</artifactId>
<version>1.0.6</version>
</dependency>
2.Java代码实现
package com.liyingjie.lyjalipay.controller;
import cn.hutool.core.util.RandomUtil;
import com.github.qcloudsms.SmsSingleSender;
import com.github.qcloudsms.SmsSingleSenderResult;
import com.github.qcloudsms.httpclient.HTTPException;
import com.liyingjie.lyjalipay.domain.Sms;
import org.json.JSONException;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
@SpringBootTest
class SmsControllerTest {
@Test
public void sms(){
//腾讯云固定参数
int appid = 1400655460; //腾讯云应用id
String appkey="133213"; //腾讯云应用Key
int templateId= 1354718; //模板id
String smsSign="杰杰不会hellowor"; //签名内容
//可变参数
String phoneNumber ="123456";//手机号码
String code="131";//手机验证码
String min="5";//有效时长
try {
String[] params = {code,min}; //param1,手机验证码;param2,有效时长,配合正文模板参数
SmsSingleSender smsSingleSender = new SmsSingleSender(appid, appkey);
SmsSingleSenderResult smsSingleSenderResult = smsSingleSender.sendWithParam("86", phoneNumber, templateId, params, smsSign, "", "");
System.out.println(smsSingleSenderResult);
} catch (IOException e) {
e.printStackTrace();
} catch (HTTPException | JSONException e) {
e.printStackTrace();
}
}
}
3.代码改进
package com.liyingjie.lyjalipay.controller;
import cn.hutool.core.util.RandomUtil;
import com.github.qcloudsms.SmsSingleSender;
import com.github.qcloudsms.SmsSingleSenderResult;
import com.github.qcloudsms.httpclient.HTTPException;
import com.liyingjie.lyjalipay.domain.Sms;
import org.json.JSONException;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
@SpringBootTest
class SmsControllerTest {
@Test
public void sms(){
//腾讯云固定参数
int appid = 1400655460; //应用id
String appkey="76bcf5ddb58******"; //应用Key
int templateId= 222222;//模板id
String smsSign="杰杰不会hellowor";
//用户参数
Sms sms =new Sms();
sms.setPhoneNumber("132");
sms.setCode(RandomUtil.randomNumbers(6));//验证码6位随机
sms.setMin(5); //验证码有效时长
try {
String[] params = {sms.getCode(),Integer.toString(sms.getMin())};
SmsSingleSender smsSingleSender = new SmsSingleSender(appid, appkey);
SmsSingleSenderResult smsSingleSenderResult = smsSingleSender.sendWithParam("86", sms.getPhoneNumber(), templateId, params, smsSign, "", "");
System.out.println(smsSingleSenderResult);
} catch (IOException e) {
e.printStackTrace();
} catch (HTTPException | JSONException e) {
e.printStackTrace();
}
}
}
4.实现效果
三,关于项目中验证码验证逻辑分享
以上只有验证码发送,在前后端项目中要实现验证码验证,可以用redis缓存数据库实现
1.发送手机验证码并进行Redis存储
将上面的发送手机验证码封装成一个工具类SmsUtil里的一个方法。返回随机六位的验证码
将返回的验证码存储在redis中,以手机号码为key,验证码为值,有效时间统一一下。
@ApiOperation("发送手机验证码")
@GetMapping("/send/{phoneNumber}")
public AjaxResult sendCode(@PathVariable("phoneNumber") String phoneNumber){
String phoneCode = SmsUtil.send(phoneNumber);
redisCache.setCacheObject(phoneNumber,phoneCode,5, TimeUnit.MINUTES);
return AjaxResult.success(phoneCode);
}
2.验证逻辑
在上一步发送完成之后,提交表单参数时携带者手机号与验证码参数,
String redisCode = redisCache.getCacheObject(phoneNumber);
Boolean flag = redisCode.equals(phoneCode)
验证成功后再进行下一步操作,否则不执行