阿里云短信验证码实战
一、创建阿里云短信权限用户
1、登陆阿里云之后我们点击头像,接着点击AccessKey:

2、选择开始使用子用户 :

3、我们先要创建一个用户组:

4、依次点击新建的用户组——授权管理,给用户组授权,开通短信验证码服务:

5、接着我们新建一个用户(具体用来操作的账号),一定要勾选OpenAPI调用访问,这样我们才能通过代码访问:

记得把AccessKey保存下来,以为后面会看不到:

6、接着将这个用户添加到刚刚的用户组即可:

二、开通阿里云短信服务
1、在搜索框搜索短信服务,点击加载之后,选择免费开通,即可开通短信服务。
2、我们开通短信服务之后,还要设置签名和模板:

签名就相当于公司名称,模板就是短信的模板,验证码短信分为几部分:

默认会给我们设置一个模板,我们可以直接用这个模板(注意:模板一定要和某个签名绑定,否则发送不了验证码):

但是没有默认的签名,我们需要自己添加,申请里有一定要有理有据,比较正当,等待审核通过即可:

可以在快速学习和测试模块,体验一下短信验证码的使用:

这一块也会有实现短信验证码功能的代码:

三、编写测试代码
我们可以在帮助文档中查看具体的使用步骤:帮助文档
1、首先在项目中导入Java SDK的依赖:
<!--阿里云短信验证码sdk--><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.5.16</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency><!--springboot集成redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
然后编写一个测试类来测试是否能正常发送验证码:
//连接阿里云DefaultProfile profile = DefaultProfile.getProfile("cn-beijing", "Your AccessKey ID", "Your AccessKey Secret");IAcsClient client = new DefaultAcsClient(profile);//构建请求,一般这里不用动CommonRequest request = new CommonRequest();request.setSysMethod(MethodType.POST);request.setSysDomain("dysmsapi.aliyuncs.com");request.setSysVersion("2017-05-25");request.setSysAction("SendSms");//设置发送相关的参数request.putQueryParameter("PhoneNumbers","xxxx"); //手机号request.putQueryParameter("SignName","xxxx"); //申请阿里云 签名名称request.putQueryParameter("TemplateCode","xxxxx"); //申请阿里云 模板codeHashMap<String, Object> map = new HashMap<>();map.put("code", 123456);request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));//验证码数据,转换json数据传递try{CommonResponse response = client.getCommonResponse(request);System.out.println(response.getData());} catch (ClientException e){e.printStackTrace();}
测试代码写完之后我们就可以执行这段代码进行测试了,结果成功!
四、封装发送短信接口
1、编写Service接口:
public interface SendSms {//手机号、模板代码、验证码public boolean send(String phoneNum, String templateCode, Map<String, Object> code);
}
2、编写接口实现类:
@Service
public class SendSmsImpl implements SendSms {@Overridepublic boolean send(String phoneNum, String templateCode, Map<String, Object> code) {//连接阿里云DefaultProfile profile = DefaultProfile.getProfile("cn-beijing", "LTAI5tMk6A312KwNVnxNuTno", "1MyEwE0uqfHYTFyFAcydutAFBZgGBj");IAcsClient client = new DefaultAcsClient(profile);//构建请求,一般这里不用动CommonRequest request = new CommonRequest();request.setSysMethod(MethodType.POST);request.setSysDomain("dysmsapi.aliyuncs.com");request.setSysVersion("2017-05-25");request.setSysAction("SendSms");//设置发送相关的参数request.putQueryParameter("PhoneNumbers",phoneNum); //手机号request.putQueryParameter("SignName","唐世华个人签名"); //申请阿里云 签名名称request.putQueryParameter("TemplateCode",templateCode); //申请阿里云 模板coderequest.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));//验证码数据,转换json数据传递,这里要用maptry{CommonResponse response = client.getCommonResponse(request);System.out.println(response.getData());return response.getHttpResponse().isSuccess(); //判断发送是否成功} catch (ClientException e){e.printStackTrace();}return false;}
}
3、编写Controller测试类:
@RestController
@CrossOrigin //跨域支持
public class SendSmsController {@Autowiredprivate SendSms sendSms;@Autowiredprivate RedisTemplate<String, String> redisTemplate;@GetMapping("/send/{phone}")public String code(@PathVariable("phone") String phone){//调用方法模拟真实业务//如果redis缓存中存在手机号的验证码,说明验证码还未过期,可继续使用String code = redisTemplate.opsForValue().get(phone);System.out.println(code);if(!StringUtils.isEmpty(code)){return phone + ":" + code + "已存在,还没有过期,可继续使用!";}//生成验证码并存储到redis中//生成验证码(包含数字和字母)//code = UUID.randomUUID().toString().substring(0, 4);//生成纯数字int uuid = UUID.randomUUID().toString().replaceAll("-","").hashCode();uuid = uuid < 0 ? -uuid : uuid;//String.hashCode() 值会为空code = String.valueOf(uuid).substring(0, 4);HashMap<String, Object> param = new HashMap<>();param.put("code", code);boolean isSend = sendSms.send(phone, "SMS_274310067", param); //发送验证码if(isSend){ //发送成功redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.SECONDS); //将验证码存到redis,设置5分钟过期return phone + ":" + code + "发送成功!";}else {return "发送失败";}}}
完结撒花!!
相关文章:
阿里云短信验证码实战
一、创建阿里云短信权限用户 1、登陆阿里云之后我们点击头像,接着点击AccessKey: 2、选择开始使用子用户 : 3、我们先要创建一个用户组: 4、依次点击新建的用户组——授权管理,给用户组授权,开通短信验证码服务…...
Android APP隐私合规检测工具Camille使用
目录一、简介二、环境准备常用使用方法一、简介 现如今APP隐私合规十分重要,各监管部门不断开展APP专项治理工作及核查通报,不合规的APP通知整改或直接下架。camille可以hook住Android敏感接口,检测是否第三方SDK调用。根据隐私合规的场景&a…...
手把手学会DFS (递归入门)
目录 算法介绍 递归实现指数型枚举 递归实现排列型枚举 递归实现组合型枚举 算法介绍 🧩DFS 即 Depth First Search ,中文又叫深度优先搜索,是一种沿着树的深度对其进行遍历,直到尽头之后再进行回溯,再走其他路线的…...
由《三体》太阳文明末日场景想到的……
《三体》电视剧正在热播,热度持续不退,豆瓣评分8.6,基本已经预定年度口碑最高的科幻题材剧;除了在国内多个平台播出外,还走出国门,成功“出海”,《人民日报》两会特刊都予以了高度赞扬。 上图红…...
es6的Proxy与Reflect
Proxy是在对目标对象的读取时,架设一层拦截,可以在读取对象中的任意一个属性时做一些额外的操作 Proxy与Object.defineProperty方式设置setter、getter方法不同的是,Proxy是对目标对象的整体拦截,而Object.defineProperty注重对对…...
Linux环境部署vue项目 + nginx访问(包含nginx配置简介)
1、本地打包、上传 # 打包命令不同项目有略微差别,核心命令 npm run build# 我们项目前端给配了测试、生产环境,测试环境打包命令是 npm run build:stage# 建议先看一下项目的README文件打包之后,得到一个文件夹,一般叫dist、也有…...
到底什么是跨域,如何解决跨域(常见的几种跨域解决方案)?
文章目录1、什么是跨域2、解决跨域的几种方案2.1、JSONP 方式解决跨域2.2、CORS 方式解决跨域(常见,通常仅需服务端修改即可)2.3、Nginx 反向代理解决跨域(推荐使用,配置简单)2.4、WebSocket 解决跨域2.5、…...
pm3包1.4版本发布----一个用于3组倾向性评分的R包
目前,本人写的第二个R包pm3包的1.4版本已经正式在CRAN上线,用于3组倾向评分匹配,只能3组不能多也不能少。 可以使用以下代码安装 install.packages("pm3")什么是倾向性评分匹配?倾向评分匹配(Propensity Sc…...
没有关系的话,那就去建立关系吧
今天给大家分享一道链表的好题--链表的深度拷贝,学会这道题,你的链表就可以达到优秀的水平了。力扣 先来理解一下题目意思,即建立一个新的单向链表,里面每个结点的值与对应的原链表相同,并且random指针也要指向新链表中…...
Vue项目
package.json : 描述这个NPM包的所有相关信息,包括作者、简介、包依赖、构建等信息,格式是严格的JSON格式。和java的maven的pom文件作用一样。 node_modules: 依赖需要下载后才能使用,存在依赖包的地方。使用npm install 安装依赖 babel.co…...
【webrtc】ICE 到VCMPacket的视频内存分配
ice的数据会在DataPacket 构造是进行内存分配和拷贝而后DataPacket 会传递给rtc模块处理rtc模块使用DataPacket 构造rtp包最终会给到OnReceivedPayloadData 进行rtp组帧。吊炸天的是DataPacket 竟然没有声明析构方法。RtpVideoStreamReceiver::OnReceivedPayloadData 的内存是外…...
进阶C语言——指针(二)【题目练习】
文章目录1.指针和数组概念的理解2.指针和数组笔试题解析一维数组字符数组二维数组1.指针和数组概念的理解 指针和数组 数组:能够存放一组相同类型的元素,数组的大小取决于数组的元素个数和元素类型指针:也是地址或指针变量,大小是…...
Ajax简介
Ajax简介和使用 1.简介 AJAX Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。 Ajax 不是一种新的编程语言,而是一种用于创建更好更快以及…...
ChatGPT 4 测试 两数比较大小问题。
按: 上次用3.5 测试了ChatGPT的两数比较大小问题,结果失败了。我要求不能用if语句,它避免不了。这次终于成功了,看来是进步很大。对话记录如下(英文) MaraSun Compare two 2 numbers in C# , but IF is no…...
SSM-CRUD整合视频教程:Spring、SpringMVC、MyBatis、bootstrap、pagehelper、JSR303后端校验
1、项目说明 1.1、业务说明 SSM:SpringMVCSpringMyBatisCRUD: Create(创建)Retrieve(查询)Update(更新)Delete(删除) 总结:通过SSM框架来完成一个CRUD的操作。 1.2、功…...
Linux常用命令——基于Ubuntu22.04
本文介绍了一些Linux的常用命令。为了便于快速检索命令位置,文章二级标题都以“命令:命令的作用”展示,有些命令会先介绍命令的几个常用参数,然后结合具体的操作展示命令的使用。为了便于记忆,也会提到命令是由哪些短语…...
Sentinel
SentinelSentinel介绍什么是Sentinel?为什么需要流量控制?为什么需要熔断降级?一些普遍的使用场景本文介绍参考:Sentinel官网《Spring Cloud Alibaba 从入门到实战.pdf》Sentinel下载/安装项目演示构建项目控制台概览演示之前需先明确&#…...
再也不想去字节跳动面试了,6年测开面试遭到这样打击.....
前几天我朋友跟我吐苦水,这波面试又把他打击到了,做了快6年软件测试员。。。为了进大厂,也花了很多时间和精力在面试准备上,也刷了很多题。但题刷多了之后有点怀疑人生,不知道刷的这些题在之后的工作中能不能用到&…...
【深度解刨C语言】符号篇(全)
文章目录一.注释二.续行符与转义符1.续行符2.转义符三.回车与换行四.逻辑操作符五.位操作符和移位操作符六.前置与后置七.字符与字符串八./和%1.四种取整方式2.取模与取余的区别和联系3./两边异号的情况1.左正右负2.左负右正九.运算符的优先级一.注释 注释的两种符号ÿ…...
VS Code 将推出更多 AI 功能给 Java 开发者
大家好,欢迎来到我们的二月更新!我们将为您带来与 JUnit 5 并行测试相关的新功能以及用于 Spring Boot Dashboard 的过滤功能。另外,OpenAI 和 ChatGPT 是最近的热点,所以在 GitHub Copilot 方面也有一些令人激动的消息࿰…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
Django RBAC项目后端实战 - 03 DRF权限控制实现
项目背景 在上一篇文章中,我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统,为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...
