springboot|springboot中实现短信验证(从零开始、腾讯云)

前言 最近由于毕业设计需要,打算使用短信验证注册和登录,所以特地查了一下一些常用的短信验证接口:阿里云、腾讯云。由于阿里云审核过于麻烦,所以使用了腾讯云,注册个公众号就可以啦!
第一步:注册公众号 1、进入微信公众平台官网:微信公众平台
2、进入注册springboot|springboot中实现短信验证(从零开始、腾讯云)
文章图片

3、选择订阅号
【springboot|springboot中实现短信验证(从零开始、腾讯云)】springboot|springboot中实现短信验证(从零开始、腾讯云)
文章图片

4、按照流程填写信息即可申请成功
5、申请成功后在登录页上登录微信公众号后台(后面要用)
第二步:登录腾讯云 1、进入腾讯云
腾讯云
2、登录
3、申请短信服务
springboot|springboot中实现短信验证(从零开始、腾讯云)
文章图片

4、申请白嫖(仅有100条短信)
springboot|springboot中实现短信验证(从零开始、腾讯云)
文章图片

5、申请完毕后进入短信服务页面(发送国内短信)
需要完成签名申请和模板申请
springboot|springboot中实现短信验证(从零开始、腾讯云)
文章图片

6、签名申请
springboot|springboot中实现短信验证(从零开始、腾讯云)
文章图片

公众号截图
springboot|springboot中实现短信验证(从零开始、腾讯云)
文章图片

7、模板申请
springboot|springboot中实现短信验证(从零开始、腾讯云)
文章图片

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; }

前两个参数的获取方式:
springboot|springboot中实现短信验证(从零开始、腾讯云)
文章图片

第三个参数:
springboot|springboot中实现短信验证(从零开始、腾讯云)
文章图片

第四个参数:
springboot|springboot中实现短信验证(从零开始、腾讯云)
文章图片

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)收到的短信 springboot|springboot中实现短信验证(从零开始、腾讯云)
文章图片

最后谢谢各位朋友的阅读,请动动小手点点赞、评论一下吧!

    推荐阅读