前言 最近由于毕业设计需要,打算使用短信验证注册和登录,所以特地查了一下一些常用的短信验证接口:阿里云、腾讯云。由于阿里云审核过于麻烦,所以使用了腾讯云,注册个公众号就可以啦!
第一步:注册公众号
1、进入微信公众平台官网:微信公众平台
2、进入注册
文章图片
3、选择订阅号
【springboot|springboot中实现短信验证(从零开始、腾讯云)】
文章图片
4、按照流程填写信息即可申请成功
5、申请成功后在登录页上登录微信公众号后台(后面要用)
第二步:登录腾讯云
1、进入腾讯云
腾讯云
2、登录
3、申请短信服务
文章图片
4、申请白嫖(仅有100条短信)
文章图片
5、申请完毕后进入短信服务页面(发送国内短信)
需要完成签名申请和模板申请
文章图片
6、签名申请
文章图片
公众号截图
文章图片
7、模板申请
文章图片
8、等待审核通过后即可使用
第三步:代入项目中实战
1、创建一个springboot项目(本人使用的是2.4.5版本)
2、导入腾讯云短信依赖
com.github.qcloudsms
qcloudsms
1.0.6
org.springframework.boot
spring-boot-starter-data-redis
3、代码测试
1) 腾讯云参数类
/**
* @Description: 腾讯云参数
* @Author: 会飞的种花家
* @date: 2022/01/03
*/
public final class SmsConstant {
//SDK APP_ID
public static final int APP_ID = ;
//SDK APP_KEY
public static final String APP_KEY="";
//模板ID,如果需要多个模板可更改为可变参数
public static final int TEMPLATE_ID = ;
//签名
public static final String SIGN = "";
//验证码存储在redis的时间
public static final int EFFECTIVE_Time = 300;
}
前两个参数的获取方式:
文章图片
第三个参数:
文章图片
第四个参数:
文章图片
2)redis工具类(如果未安装可以选择用其他数据库暂时代替,记得设置延时删除,常用的是redis) 配置类
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
public RedisConfig() {
} @Bean
@ConditionalOnMissingBean(
name = {"redisTemplate"}
)
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
@SuppressWarnings("all")
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
//objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator());
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
//String 的序列化
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//key采用String的序列化
template.setKeySerializer(stringRedisSerializer);
//hash的key采用String的序列化
template.setHashKeySerializer(stringRedisSerializer);
//value序列化方式采用json
template.setValueSerializer(jackson2JsonRedisSerializer);
//hash的value序列化方式采用json
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
} @Bean
@ConditionalOnMissingBean
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
工具类(在这里就贴一个这里用的)
@Component
public final class RedisUtil {/**
* 普通缓存放入并设置时间
* @param key键
* @param value 值
* @param time时间(秒) time要大于0 如果time小于等于0 将设置无限期
* @return true成功 false 失败
*/public boolean set(String key, Object value, long time) {
try {
if (time > 0) {
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
} else {
set(key, value);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}/**
* 普通缓存获取
* @param key 键
* @return 值
*/
public Object get(String key) {
return key == null ? null : redisTemplate.opsForValue().get(key);
}}
3)发送短信工具类
import com.github.qcloudsms.SmsSingleSender;
import com.github.qcloudsms.SmsSingleSenderResult;
import com.github.qcloudsms.httpclient.HTTPException;
import edu.cn.definite.SmsConstant;
import org.json.JSONException;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.Random;
/**
* @Description: 发送短信的工具类
* @Author: 会飞的种花家
* @date: 2022/01/03
*/
@Component
public class SendSmsUtil {
@Resource
RedisUtil redisUtil;
/**
* 腾讯云发送短信
* @param phone
* @return
*/
public String sendSms(String phone){
// 生成随机数
String code=createRandom();
SmsSingleSenderResult result =null;
try {
// 模板需要的参数
String[] params = {code,"3"};
SmsSingleSender ssender = new SmsSingleSender(SmsConstant.APP_ID, SmsConstant.APP_KEY);
// 单发短信
result = ssender.sendWithParam("86", phone, SmsConstant.TEMPLATE_ID, params, SmsConstant.SIGN, "", "");
} catch (JSONException e) {
// json解析错误
e.printStackTrace();
} catch (IOException e) {
// 网络IO错误
e.printStackTrace();
} catch (HTTPException e) {
e.printStackTrace();
}
// 保存验证码到redis
redisUtil.set(phone,code, SmsConstant.EFFECTIVE_Time);
if(!"OK".equals(result.errMsg)){
return "验证码发送失败";
}
return result.errMsg;
}/**
* 验证码长度(通过更改i的最大值)
* 获取6位随机数
* @return
*/
public String createRandom(){
Random random = new Random();
String result="";
for (int i=0;
i<6;
i++)
{
result+=random.nextInt(10);
}
return result;
}
}
4)最终测试
@SpringBootTest
class SmsApplicationTests { @Test
void contextLoads() {
} @Resource
private SendSmsUtil sendSmsUtil;
@Resource
private RedisUtil redisUtil;
@Test
void smsTest(){
String phone="手机号码";
//发送验证码并存储到redis中
sendSmsUtil.sendSms(phone);
//如有其它业务,例如注册,验证redis中的验证码与用户输入的验证码是否一致即可判断//模拟前台传来的数据
User user=new User("手机号码","382324");
//例子:User实体有:phone(手机号码)和code(验证码)从前台传到后台进行验证正确与否
if(user.getCode().equals(redisUtil.get("手机号码"))){//判断验证码是否正确}else{//验证码错误} }}
5)收到的短信
文章图片
最后谢谢各位朋友的阅读,请动动小手点点赞、评论一下吧!
推荐阅读
- Java项目|学习【瑞吉外卖⑥】SpringBoot单体项目_手机验证码登录业务开发
- 网络|万字长文详解Istio
- Redis|Redis缓存手机验证码实战(包含SpringBoot的灵魂)
- javaweb|计算机毕业设计之java+ssm的图书借阅系统
- java|[转载]为什么我认为每个程序员都应该用Mac OS X()
- 05-小程序(优购商城项目介绍,HBuilder和HBuilderX,uni-app介绍)
- Java|10年阿里开发架构师经验分享,2022最新Java面试真题解析
- Jackson 解析 JSON 详细教程
- Java通过反射注解赋值