0
点赞
收藏
分享

微信扫一扫

springboot中实现短信验证(从零开始)

zhaoxj0217 2022-01-10 阅读 87

前言

最近由于毕业设计需要,打算使用短信验证注册和登录,所以特地查了一下一些常用的短信验证接口:阿里云、腾讯云。由于阿里云审核过于麻烦,所以使用了腾讯云,注册个公众号就可以啦!

第一步:注册公众号

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中的验证码与用户输入的验证码是否一致即可判断
	}
举报

相关推荐

0 条评论