【Springboot】| 阿里云发送短信验证码,你会了吗?

news2024/12/28 18:48:01

目录

  • 🦁 题外话
  • 🦁 需要准备的东西
  • 🦁 进入主题
    • 1. 添加依赖
    • 2. 配置yaml文件
    • 3. 创建阿里云客户端
    • 4. 编写发送短信方法
    • 5. 完整代码展示
    • 6. 测试
  • 🦁 场景实操
    • 1. 编写生成验证码工具类
    • 2. 保存到redis操作
    • 3. 编写发送验证码短信
    • 4. 发送登录短信
  • 🦁 最后

🦁 题外话

狮子之前发了一篇《邮箱发送验证码,你会了吗?》,很快上了热度榜单,但是那篇文章只是简单介绍了如何接收验证码的流程以及安利了一个接收验证码的工具类,并没有详细介绍在项目中如何具体操作,不少人来咨询具体操作的流程,今天给大家介绍一下如何使用阿里云短信接收验证码功能。

🦁 需要准备的东西

我们先进入阿里云官网:https://next.api.aliyun.com/,点击如下:
在这里插入图片描述
在这里插入图片描述
点击快速学习和测试,进入使用界面:
在这里插入图片描述

阿里云tips:
若您的应用未上线,或网站域名未备案,或学习并体验使用阿里云通信短信服务,可以在下方「发送测试」模块,使用自定义测试签名/模板新功能
要完成发送体验,首先需完成自定义测试签名/模板的申请并审核通过,其次绑定测试手机号码。

意思就是咱们这种自己写的小项目只能使用它自带的模板!!!
点击如下图所示顺序:

在这里插入图片描述
到了下面这一步,就完成了所需要准备的东西。开始敲代码叭!
在这里插入图片描述


🦁 进入主题

1. 添加依赖

回到项目,添加阿里云依赖,这个依赖就在SDK示例那里!

        <!-- 阿里短信平台 -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>dysmsapi20170525</artifactId>
            <version>2.0.23</version>
        </dependency>

2. 配置yaml文件

这里没有想配置邮箱验证码那么复杂,这里只需要自定义两个变量来存储accessKeyId和accessKeySecret就行!!!

message:
  accessKeyId: LTAI5tQJFQHEnxxxxxxEMSogoC
  accessKeySecret: LZa3EGVR0XjS3KvvqxxxxxW5TNtbl

3. 创建阿里云客户端

这里是阿里云sdk实例自带的代码,咱们将其cv过来封装一下:

    /**
     * 使用AK&SK初始化账号Client
     * @param accessKeyId
     * @param accessKeySecret
     * @return Client
     * @throws Exception
     */
    @SneakyThrows
    public Client createClient(String accessKeyId, String accessKeySecret){
        Config config = new Config()
                // 必填,您的 AccessKey ID
                .setAccessKeyId(accessKeyId)
                // 必填,您的 AccessKey Secret
                .setAccessKeySecret(accessKeySecret);
        // 访问的域名
        config.endpoint = "dysmsapi.aliyuncs.com";
        return new Client(config);
    }

4. 编写发送短信方法

这里也是通过cvSDK实例代码封装:

  /**
     * 发送短信
     *
     * @param phoneNumber 手机号
     * @param code        验证码
     * @return 返回结果
     */
    @Override
    @SneakyThrows
    public BaseResult sendMessage(String phoneNumber, String code) {
        // 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
            Client client = createClient(accessKeyId, accessKeySecret);
            SendSmsRequest sendSmsRequest = new SendSmsRequest()
                    .setSignName("阿里云短信测试")
                    .setTemplateCode("SMS_154xxxx09")
                    .setPhoneNumbers("1392xxxx410")
                    .setTemplateParam("{\"code\":\""+code+"\"}");
            RuntimeOptions runtime = new RuntimeOptions();
            // 复制代码运行请自行打印 API 的返回值
        SendSmsResponse response = client.sendSmsWithOptions(sendSmsRequest, runtime);
        SendSmsResponseBody body = response.getBody();
        String code1 = body.getCode();
        if ("OK".equals(code1)){
            return BaseResult.ok();
        }
        return new BaseResult(500,body.getMessage(),null);
    }

5. 完整代码展示

import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.dysmsapi20170525.models.SendSmsResponseBody;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.lion.result.BaseResult;
import lombok.SneakyThrows;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
public class MessageServiceImpl implements MessageService {
    @Value("${message.accessKeyId}")
    private String accessKeyId;
    @Value("${message.accessKeySecret}")
    private String accessKeySecret;

    /**
     * 使用AK&SK初始化账号Client
     * @param accessKeyId
     * @param accessKeySecret
     * @return Client
     * @throws Exception
     */
    @SneakyThrows
    public Client createClient(String accessKeyId, String accessKeySecret){
        Config config = new Config()
                // 必填,您的 AccessKey ID
                .setAccessKeyId(accessKeyId)
                // 必填,您的 AccessKey Secret
                .setAccessKeySecret(accessKeySecret);
        // 访问的域名
        config.endpoint = "dysmsapi.aliyuncs.com";
        return new Client(config);
    }


    /**
     * 发送短信
     *
     * @param phoneNumber 手机号
     * @param code        验证码
     * @return 返回结果
     */
    @Override
    @SneakyThrows
    public BaseResult sendMessage(String phoneNumber, String code) {
        // 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
            Client client = createClient(accessKeyId, accessKeySecret);
            SendSmsRequest sendSmsRequest = new SendSmsRequest()
                    .setSignName("阿里云短信测试")
                    .setTemplateCode("SMS_15xxx909")
                    .setPhoneNumbers("1392xxxx410")
                    .setTemplateParam("{\"code\":\""+code+"\"}");
            RuntimeOptions runtime = new RuntimeOptions();
            // 复制代码运行请自行打印 API 的返回值
        SendSmsResponse response = client.sendSmsWithOptions(sendSmsRequest, runtime);
        SendSmsResponseBody body = response.getBody();
        String code1 = body.getCode();
        if ("OK".equals(code1)){
            return BaseResult.ok();
        }
        return new BaseResult(500,body.getMessage(),null);
    }
}

6. 测试

我们先来测试一下短信发送,在测试类里面编写:

   @Autowired
    MessageService messageService;
    @Test
    void contextLoads(){
        BaseResult result = messageService.sendMessage("139xxxxxx410", "8888");
    }

测试结果
在这里插入图片描述

运行一次1s374ms,不得不说,确实是免费的东西好用(懂的都懂!)


🦁 场景实操

场景:接收短信验证码登录系统

  • 接收短信验证码并将其保存到redis数据库里,设置过期时间为5分钟,等待验证!

1. 编写生成验证码工具类

public class RandomUtil {
    /**
     * 生成验证码
     * @param digit 位数
     * @return
     */
    public static String buildCheckCode(int digit){
        String str = "0123456789";
        StringBuilder sb = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < digit; i++) {
            char ch = str.charAt(random.nextInt(str.length()));
            sb.append(ch);
        }
        return sb.toString();
    }
}

2. 保存到redis操作

   // 保存登录验证码到redis
    @Override
    public void saveLoginCheckCode(String phone, String checkCode) {
        ValueOperations valueOperations = redisTemplate.opsForValue();
        // redis键为手机号,值为验证码,过期时间5分钟
        valueOperations.set("loginCode:" + phone, checkCode, 300, TimeUnit.SECONDS);
    }

3. 编写发送验证码短信

这个就是第三点的第5小点,不重复赘述。

4. 发送登录短信

@RestController
@RequestMapping("/user")
public class ShoppingUserController {
    @Service
    private UserService userService;
    @Service
    private MessageService messageService;
        /**
     * 发送登录短信验证码
     * @param phone 手机号
     * @return 操作结果
     */
    @GetMapping("/sendLoginCheckCode")
    public BaseResult sendLoginCheckCode(String phone) {
        // 1.生成随机四位数
        String checkCode = RandomUtil.buildCheckCode(4);
        // 2.发送短信
        BaseResult result = messageService.sendMessage(phone, checkCode);
        // 3.发送成功,将验证码保存到redis中,发送失败,返回发送结果
        if (200 == result.getCode()) {
            userService.saveLoginCheckCode(phone, checkCode);
            return BaseResult.ok();
        } else {
            return result;
        }
    }
    /**
     * 手机号验证码登录
     * @param phone 手机号
     * @param checkCode 验证码
     * @return 登录结果
     */
    @PostMapping("/loginCheckCode")
    public BaseResult loginCheckCode(String phone, String checkCode){
        String sign = userService.loginCheckCode(phone, checkCode);
        return BaseResult.ok(sign);
    }
}

🦁 最后

到这,一个完整的阿里云发送验证码就结束啦,咱们下期再见!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/611443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据:spark共享广播变量,累加器

大数据&#xff1a;共享变量 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sql要学…

三面阿里被挂,竟获内推名额,历经 5 面拿下口碑 offer...

每一个互联网人心中都有一个大厂梦&#xff0c;百度、阿里巴巴、腾讯是很多互联网人梦寐以求的地方&#xff0c;而我也不例外。但是&#xff0c;BAT 等一线互联网大厂并不是想进就能够进的&#xff0c;它对人才的技术能力和学历都是有一定要求的&#xff0c;所以除了学历以外&a…

STM32单片机WIFI物联网厨房燃气安全系统超声波人员检测MQ4燃气报警

实践制作DIY- GC0140-WIFI物联网厨房燃气安全系统 基于STM32单片机设计---WIFI物联网厨房燃气安全系统 二、功能介绍&#xff1a; 硬件组成&#xff1a;STM32F103C系列最小系统继电器模拟阀门MQ-4然气传感器HSR04超声波测距LCD1602显示器ESP8266-WIFI模块蜂鸣器多个按键 1.有…

MySQL命令行速查手册(持续更新ing...)

诸神缄默不语-个人CSDN博文目录 最近更新时间&#xff1a;2023.6.5 最早更新时间&#xff1a;2023.6.5 每个命令都以;作为结尾&#xff08;以下localhost都可以替换成实际IP地址&#xff09;&#xff08;和’的区别应该不大&#xff09;用户管理 修改密码&#xff1a;ALTER U…

如何使用Facebook Business Suite来管理你的FB和Ins商业账户

Facebook Business Suite是Facebook推出的一种强大的数字营销工具&#xff0c;可帮助企业轻松管理其在Facebook和Instagram上的商业账户。该工具集成了多种功能&#xff0c;提供了一种简单、直观的方式来管理你的社交媒体营销活动。 在本文中&#xff0c;我们将详细介绍如何优化…

深眸科技基于技术与人才优势,创新研发机器视觉系统赋能工业生产

随着人工智能技术加速进入生产生活&#xff0c;机器视觉系统作为工业发展的刚需&#xff0c;凭借着能够为机器提供视觉&#xff0c;并在众多场景实现柔性化生产应用的能力&#xff0c;逐步被接受和普及&#xff0c;并在工业生产领域发挥巨大作用。 深眸科技作为国家高新技术企…

物流货运车货匹配平台源码

网络货运平台具有较强的信息数据交互和处理能力&#xff0c;能够对托运人&#xff0c;平台运营人&#xff0c;实际承运人&#xff0c;驾驶员的相关方的交易&#xff0c;运输&#xff0c;结算等全过程进行透明&#xff0c;动态的管理&#xff0c;该平台由托运人、实际承运人、司…

ControlNet: Adding Conditional Control to Text-to-Image Diffusion Models

Adding Conditional Control to Text-to-Image Diffusion Models (Paper reading) Lvmin Zhang and Maneesh Agrawala, Stanford University, arXiv, Cited:113, Code, Paper 1. 前言 我们提出了一种名为ControlNet的神经网络结构&#xff0c;用于控制预训练的大规模扩散模型…

element中table的列标题自定义

一、需求 工作中要求表格table中的某一列标题为红色如图 二、方案一 使用el-table-column自带的:render-header"renderHeader"函数 render-header列标题 Label 区域渲染使用的 FunctionFunction(h, { column, $index })—— 使用有点像v-html插入代码片段&#xf…

PubChem介绍及API及PubChempy

PubChem 【官网 https://pubchem.ncbi.nlm.nih.gov/】 简介 PubChem is the world’s largest collection of freely accessible chemical information. Search chemicals by name, molecular formula, structure, and other identifiers. Find chemical and physical proper…

casbin基于RBAC的权限管理案例

在RBAC模型中新定义了角色和继承关系&#xff0c;用户可以通过角色区分不同的权限&#xff0c;继承不同的角色时用户有多个权限。 [role_definition] g _, _ g2 _, _g 是一个 RBAC系统, g2 是另一个 RBAC 系统。 _, _表示角色继承关系的前项和后项&#xff0c;即前项继承后项…

局部探索测试的要素

局部探索测试的要素 局部探索测试是软件测试过程中的一种方法&#xff0c;旨在发现一个系统、软件或应用程序的局部缺陷和问题。局部探索测试不是全面测试&#xff0c;而是通过对特定功能、模块或环节进行测试来检查其中潜在的缺陷&#xff0c;从而提高软件的质量和可靠性。 局…

【白话机器学习系列】白话Broadcasting

白话 Broadcasting 文章目录 什么是 BroadcastingBroadcasting 的规则逐元素操作向量与标量运算矩阵与向量运算行向量列向量 张量与向量运算张量与矩阵运算 矩阵与张量的点积总结 什么是 Broadcasting 在 《白话张量》 中我们讲过&#xff0c;张量之间进行运算需要满足一定的…

Hadoop之MapReduce概述

MapReduce概述 MapReduce定义MapReduce优缺点MapReduce核心思想MapReduce进程MapReduce编程规范MapTask并行度决定机制ReduceTask并行度决定机制mapreduce中job的提交流程MapReduce工作流程shuffle机制分区partition数据清洗&#xff08;ETL&#xff09;进一步分析MapTask和Red…

Jenkins+RF持续集成测试(二) 定时更新SVN完成构建

在上一篇中讲了Jenkins的安装&#xff0c;这篇将介绍 定时从SVN库中&#xff08;git库与之类似&#xff0c;这里就不具体介绍了&#xff0c;有需要自己折腾&#xff09;拉取最新的测试脚本&#xff0c;完成jenkins的定时构建。这是我们做自动化测试最基本的环节&#xff0c;每天…

【Linux】还在用top命令?可以试试atop工具,信息一目了然,运维工程师的新选择

atop使用 Linux以其稳定性&#xff0c;越来越多地被用作服务器的操作系统(当然&#xff0c;有人会较真地说一句&#xff1a;Linux只是操作系统内核:)。但使用了Linux作为底层的操作系统&#xff0c;是否我们就能保证我们的服务做到7*24地稳定呢&#xff1f;非也&#xff0c;要…

06.05

1.二进制求和 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 考虑一个最朴素的方法&#xff1a;先将 aaa 和 bbb 转化成十进制数&#xff0c;求和后再转化为二进制数。利用 Python 和 Java 自带的高精度运算&#xff0c;我们可以很简单地写出这…

发现问题更全面,减少测试成本:WEB自动化测试的价值分析!

目录 前言&#xff1a; 一、WEB自动化测试的价值 1. 提高测试效率 2. 提高软件的质量 3. 减少测试成本 二、WEB自动化测试的瓶颈 1. 可维护性差 2. 兼容性问题 3. 比手工测试慢 三、代码示例 四、总结 前言&#xff1a; 自动化测试是软件开发中必不可少的一环&…

shell简单命令

命令入门&#xff1a; [rootlocalhost ~]# #/root [jinxflocalhost ~]$ #/home/jinxf 用户名主机名 当前目录 #系统权限 $普通权限 命令格式 命令 选项 参数&#xff08;三者之间要有空格&#xff0c;区分大小写&#xff09; command [-options] [args]…

004-从零搭建微服务-认证中心(四)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff1a;https://gitee.com/csps/mingyue 文档地址&#xff1a;https://gitee.com/csps/mingyue/wikis 搭建前端框架 感谢开源项目【vue-next-adm…