短信验证码实现

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

相关推荐
weixin_307779131 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
一水鉴天4 小时前
映射、哈希表与哈斯图:计算机科学的三种基线 20261003(元宝)
开发语言·人工智能
Frank_refuel4 小时前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
Wang's Blog5 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
2601_962071576 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
\光辉岁月/7 小时前
5.java-数组
java·开发语言
Java后端的Ai之路7 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数
谢亮_vipxieliang7 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
时间的拾荒人7 小时前
Qt 多线程详解:从 QThread 到实战
开发语言·qt·面试
郑州光合科技余经理7 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程