短信验证码实现

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

相关推荐
张晓~1833994812118 分钟前
碰一碰发视频 系统源码 /PHP 语言开发方案
开发语言·线性代数·矩阵·aigc·php·音视频·文心一言
代码不停20 分钟前
Java前缀和算法题目练习
java·开发语言·算法
豆沙沙包?20 分钟前
2025年--Lc200- 414. 第三大的数(大根堆)--Java版
java·开发语言
一念&27 分钟前
每日一个C语言知识:C 指针
c语言·开发语言
在下木子生27 分钟前
SpringBoot基于工厂模式的多类型缓存设计
java·spring boot·缓存
涤生z29 分钟前
list.
开发语言·数据结构·c++·学习·算法·list
xxxxxxllllllshi32 分钟前
Java中Elasticsearch完全指南:从零基础到实战应用
java·开发语言·elasticsearch·面试·职场和发展·jenkins
无毁的湖光Al42 分钟前
日常问题排查-Younggc突然变长
java·jvm·后端
wu_jing_sheng01 小时前
Python中使用HTTP 206状态码实现大文件下载的完整指南
开发语言·前端·python
_星辰大海乀1 小时前
网络原理 -- HTTP
java·服务器·http·get方法·post方法