前言
最近由于毕业设计需要,打算使用短信验证注册和登录,所以特地查了一下一些常用的短信验证接口:阿里云、腾讯云。由于阿里云审核过于麻烦,所以使用了腾讯云,注册个公众号就可以啦!
第一步:注册公众号
1、进入微信公众平台官网:微信公众平台
2、进入注册
3、选择订阅号
4、按照流程填写信息即可申请成功
5、申请成功后在登录页上登录微信公众号后台(后面要用)
第二步:登录腾讯云
1、进入腾讯云
腾讯云
2、登录
3、申请短信服务
4、申请白嫖(仅有100条短信)
5、申请完毕后进入短信服务页面(发送国内短信)
需要完成签名申请和模板申请
6、签名申请
公众号截图
7、模板申请
8、等待审核通过后即可使用
第三步:代入项目中实战
1、创建一个springboot项目(本人使用的是2.4.5版本)
2、导入腾讯云短信依赖
<!--腾讯云短信-->
<dependency>
<groupId>com.github.qcloudsms</groupId>
<artifactId>qcloudsms</artifactId>
<version>1.0.6</version>
</dependency>
<!-- springBoot整合redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
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<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> 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)最终测试
@Test
void smsTest(){
String phone="手机号码";
//发送验证码并存储到redis中
sendSmsUtil.sendSms(phone);
//如有其它业务,例如注册,验证redis中的验证码与用户输入的验证码是否一致即可判断
}