短信验证码实现

一、设置AccessKey

创建用户并配置使用权限,使我们拥有调用 aliyunAPI 的权限,之后会生成 AccessKeyID 和 AccessKey密码,后面我们会使用到。需要注意的是 AccessKeyID 和 AccessKey密码生成后我们需要将他保存起来,否则后期无法查询到。

二、开启阿里云短信服务

在阿里云官网搜索短信服务,进入短信服务控制台。

1、资质管理

在这里我们申请个人资质即可,就不用上传企业的证明材料。注意个人的证件照片要清除,不能有遮挡,备注信息写上申请说明,不能随便写,审核一般在两个小时内。

2、签名管理

申请签名。

3、模板管理

这里的模板,就是我们发送短信的模板,需要注意的是,要注意选择纯数字,或者则是英文数字混合使用的模板。模板CODE后面我们需要使用。

三、SpringBoot整合阿里云SMS

1、整体流程

1、前端发送短信验证码的请求;

2、后端收到请求后,生成验证码的code,调用阿里云API 接口发送短信;

3、判断 SMS API 的返回信息,"OK"则为成功发布;

4、发布成功将code存入redis,供后期校验使用;

5、将存入redis时的key值返回给前端。

2、引入依赖

java 复制代码
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.6.0</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>dysmsapi20170525</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
            <version>1.1.0</version>
        </dependency>

3、配置SMS Client

java 复制代码
@Configuration
public class AliyunCheckCodeConfig {
    @Bean
    public Client aliyunClient() throws Exception {
        Config config = new Config()
                .setAccessKeyId("你的AccessKeyID")
                .setAccessKeySecret("你的AccessKey密码");
        config.endpoint = "dysmsapi.aliyuncs.com";
        return new Client(config);
    }
}

在配置类中将阿里云SMS 的客户端注册进ioc 容器,交给SpringBoot管理,这里需要将自己生成的AccessKeyID 和 AccessKey 密码替换上

4、业务代码

java 复制代码
    @Autowired
    private Client aliyunClient;    
 
    /**
     * 发送短信验证码
     *
     * @param phone
     * @return
     */
    @Override
    public String sendPhoneCheckCode(String phone) {
        //避免重复提交
        String jsonString = redisTemplate.opsForValue().get("phone:" + phone);
        if(jsonString != null){
            return null;
        }
        //生成验证码
        Integer numCode = new Random().nextInt(1000,9999);
        String code = String.valueOf(numCode);

        SendSmsRequest sendSmsRequest = new SendSmsRequest();
        sendSmsRequest.setSignName("发送短信的主题")
                .setTemplateCode("你的模板CODE")
                .setPhoneNumbers("发送到的手机号")
                .setTemplateParam("{\"code\":" + code + "}");

        try {
            RuntimeOptions runtimeOptions = new RuntimeOptions();
            SendSmsResponse sendSmsResponse = aliyunClient.sendSmsWithOptions(sendSmsRequest, runtimeOptions);
            SendSmsResponseBody body = sendSmsResponse.getBody();
            if (body.getMessage().equals("OK")) {
                //存入redis
                String key = "phone:" + phone;
                //存入redis
                redisTemplate.opsForValue().set(key,code,3,TimeUnit.MINUTES);
                //返回key
                return key;
            } else {
                return null;
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

这里我们需要将之前申请的模板CODE替换上,code即为替换模板中占位符的信息,我们引入了redis缓存,将生成的验证码存入缓存中,供后面的校验提供支持。

相关推荐
Swift社区1 小时前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht1 小时前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht1 小时前
Swift闭包的本质
开发语言·ios·swift
wjs20241 小时前
Swift 数组
开发语言
吾日三省吾码2 小时前
JVM 性能调优
java
stm 学习ing2 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc3 小时前
《Python基础》之字符串格式化输出
开发语言·python
弗拉唐3 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi773 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器