短信验证码实现

一、设置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缓存,将生成的验证码存入缓存中,供后面的校验提供支持。

相关推荐
Clockwiseee4 分钟前
PHP之伪协议
android·开发语言·php
编程阿布7 分钟前
Python基础——多线程编程
java·数据库·python
小林爱10 分钟前
【Compose multiplatform教程08】【组件】Text组件
android·java·前端·ui·前端框架·kotlin·android studio
Anlner10 分钟前
Java课程设计:基于tomcat+jsp+sqlserver的javaweb计算机配件报价系统
java·sqlserver·eclipse·tomcat·课程设计
开心工作室_kaic15 分钟前
springboot498基于javaweb的宠物猫认养系统(论文+源码)_kaic
java·开发语言·数据库·美食
segwyang24 分钟前
Maven 项目模板
java·python·maven
秋雨凉人心25 分钟前
上传npm包加强
开发语言·前端·javascript·webpack·npm·node.js
凡人的AI工具箱29 分钟前
每天40分玩转Django:Django文件上传
开发语言·数据库·后端·python·django
xiaoshiguang329 分钟前
LeetCode:404.左叶子之和
java·算法·leetcode
cloud___fly30 分钟前
Java线程池面试题
java·开发语言