我相信大家的手机短信里面,有两类短信占据了绝大多数,一个是快递的取件码,另一个就是各种短信验证码。就像下面这样:
用大腿想一想都知道,这种短信验证码肯定是由第三方提供的服务。那么我们作为开发者和使用者,如何将短信验证码整合到我们项目中呢?
本期文章,将会整合腾讯云的短信服务,以手机号注册为例,手把手带你研究一下短信验证码。
首先第一步,我们需要前往腾讯云,进行注册短信服务、创建应用、创建签名、创建模块等程序。
https://cloud.tencent.com/
首先需要前往腾讯云的官网,注册账户并且完成实名认证。之后访问下面链接跳转到短信服务控制台。
短信服务控制台:https://console.cloud.tencent.com/smsv2
创建应用可用于个性化管理短信发送任务,例如设置不同的发送频率和发送超量提醒等。
国内短信由签名+正文组成,签名符号为【】(注:全角),发送短信内容时必须带签名。也就是我们经常在短信中看到的【】里面的内容就是签名,下图这些【】都是签名。
签名主要用来明显的标识应用信息。签名不能瞎写,还需要审核。
**签名类型可以选择自用,然后可以创建几种类型的签名,签名为本账号实名认证的网站、APP、公众号、小程序等。也就是说你必须要有签名这几种类型的应用,而且必须要你是实名作者。**如果你一项也没有的话,那么你现在还不能申请使用短信服务。
选择指定类型后,还需要上传一些证明材料,比如后台截图这些,所以是没法随意填写的。之后点击提交会进入审核状态,大概两个小时可以审核完成。
上面说到【】里面的内容是签名,那么除开【】之外的内容,就属于短信的模版了,所有使用同一个模版发出去的短信,除了验证码这串数字,长得是一模一样,就像下面这样。
【腾讯科技】123667,微信小程序手机号授权功能验证码,十分钟内有效。
【腾讯科技】738933,微信小程序手机号授权功能验证码,十分钟内有效。
【腾讯科技】937005,微信小程序手机号授权功能验证码,十分钟内有效。
这里还提供了很多标准的模版供我们使用。{1}、{2},我们就可以理解成占位符。在发送的时候会自动将占位符替换为我们指定的内容,比如验证码、有效时间等等。模版同样需要审核才能使用。
旁边还有详细的短信模版的介绍:
当我们的应用、签名、模版全都审核通过,那么恭喜你可以真正进行后续的开发了。
创建SpringBoot应用,在配置文件中,填写如下内容:
sms:
app-id: 你的应用ID,在应用的详情页面
app-key: 应用密钥,在应用的详情页面
template-id: 模版ID
sign: 签名内容,注意不是ID,比如:薛伟编程学习小站
interval-min: 5
valid-min: 100
引入短信相关依赖
<dependency>
<groupId>com.github.qcloudsmsgroupId>
<artifactId>qcloudsmsartifactId>
<version>1.0.2version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.47version>
dependency>
<dependency>
<groupId>cn.hutoolgroupId>
<artifactId>hutool-allartifactId>
<version>5.7.17version>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-lang3artifactId>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-collections4artifactId>
<version>4.1version>
dependency>
<dependency>
<groupId>commons-iogroupId>
<artifactId>commons-ioartifactId>
<version>2.7version>
dependency>
封装短信服务SmsService
package world.xuewei.service;
import com.github.qcloudsms.SmsSingleSender;
import com.github.qcloudsms.SmsSingleSenderResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
/**
* @author XUEW
* @apiNote 短信服务
*/
@Slf4j
@Service
public class SmsService {
@Value("${sms.app-id}")
private Integer smsAppId;
@Value("${sms.app-key}")
private String smsAppKey;
@Value("${sms.template-id}")
private Integer smsTemplateId;
@Value("${sms.sign: 454442}")
private String smsSign;
@Value("${sms.interval-min}")
private String smsIntervalMin;
@Value("${sms.valid-min}")
private Integer smsValidMin;
public Boolean sendCode(String phone, String code) {
SmsSingleSender sender = new SmsSingleSender(smsAppId, smsAppKey);
ArrayList<String> params = new ArrayList<>();
// 添加模板参数
params.add(code);
params.add(String.valueOf(smsValidMin));
try {
SmsSingleSenderResult result = sender.sendWithParam("86", phone, smsTemplateId, params, smsSign, "", "");
if (result.result == 0) {
log.info("验证码发送成功,手机号:{}", phone);
return true;
} else {
log.error("验证码发送失败,手机号:{},错误信息:{}", phone, result.errMsg);
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
之后我们就可以在需要调用发送的地方,调用SmsService的sendCode方法即可。
@Autowired
private SmsService smsService;
/**
* 发送短信验证码
*/
@PostMapping("/sendSmsCode")
@ResponseBody
public ResponseResult sendSmsCode(String phone, Map<String,Object> map, HttpSession session) {
if (StrUtil.isEmpty(phone)) {
return ResponseResult.failure(500, "手机号不能为空");
}
// 生成随机验证码
String verifyCode = RandomUtil.randomNumbers(6);
if (smsService.sendCode(phone, verifyCode)) {
map.put("phone", phone);
map.put("code", verifyCode);
map.put("time", System.currentTimeMillis());
session.setAttribute("PHONE_CODE" + phone, map);
} else {
log.error("验证码发送失败,手机号:{}", phone);
return ResponseResult.failure(500, "验证码发送失败");
}
return ResponseResult.success();
}
然后安装业务的需要,进行验证,那么这里就可能会使用到session、redis等缓存技术。
至此,关于短信验证码的内容就初步讲解完成了。推荐大家看一下官网文档,没准有特殊的收获!
项目开源:https://github.com/373675032/login-system
觉得文章不错的话,点赞、在看,支持一下!