文章目录

  • 一、阿里云短信环境搭建
    • 1、开启使用子用户,创建用户组和用户
    • 2、开通阿里云短信服务
  • 二、环境测试
    • 1、新建Spring Boot(web)项目,导入依赖
    • 2、在测试类中进行测试
  • 三、真实业务场景实现
    • 1、添加redis的相关配置
    • 2、在templates下面添加页面
    • 3、新建SendSms接口并创建实现类SendSmsImpl
    • 4、编写controller层
    • 5、运行结果

一、阿里云短信环境搭建

1、开启使用子用户,创建用户组和用户

点击进入阿里云控制台
登录成功后,点击AccessKey管理,在弹窗中选择开始使用子用户AccessKey


创建用户组之后,点击进入权限管理,添加短信管理权限


注意:用户创建成功后,我们需要立刻复制AccessKey ID和AccessKey Secret的值,因为AccessKey Secre很快就会消失。
当我们点击进入用户时,我们可以看到AccessKey ID的值,但是AccessKey Secret已经看不到啦。

2、开通阿里云短信服务





这里的签名管理和模板管理都需要进行审核,在申请理由的那一栏中,填写的理由一定要正当,否则无法审核通过的哦!

上述工作完成之后,你还忘记一件事哦,既然开通短信服务,发送短信是要收费的,我们需要进行充值几块钱就可以的。

二、环境测试

1、新建Spring Boot(web)项目,导入依赖

<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.5.0</version>
</dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、在测试类中进行测试

 @Testvoid contextLoads() {// 连接阿里云DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "你的ID", "你的密码");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", "填写手机号码");request.putQueryParameter("SignName", "填写签名");request.putQueryParameter("TemplateCode", "填写模板");// 构建一个短信验证码HashMap<String, Object> map = new HashMap<>();map.put("code",6666);request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));try {CommonResponse response = client.getCommonResponse(request);System.out.println(response.getData());} catch (ServerException e) {e.printStackTrace();} catch (ClientException e) {e.printStackTrace();}}


运行程序,将会得到如下图所示的短信。

其中,【】里面的内容代表签名,数字6666代表验证码,除此之外的信息为模板。

三、真实业务场景实现

1、添加redis的相关配置

server.port=9090
# REDIS (RedisProperties)
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=5000

2、在templates下面添加页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div id="app"><form action="#" method="post">请输入号码:<input type="text" v-model="phone"><br><input type="text"><input type="button" value="获取验证码" @click="login"></form>
</div><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>var app = new Vue({el:"#app",data:{phone:""},methods:{login(){axios.post("http://localhost:9090/send?phone="+this.phone).then((res)=>{console.log(res.data);})}}})</script>
</body>
</html>

这里使用Vue来实现前后端的分离。

3、新建SendSms接口并创建实现类SendSmsImpl

public interface SendSms {public boolean send(String phoneNumbers, String templateCode, Map<String,Object> code);
}
@Service
public class SendSmsImpl implements SendSms {@Overridepublic boolean send(String phoneNumbers, String templateCode, Map<String, Object> code) {// 连接阿里云DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "你的ID", "你的密码");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", phoneNumbers);request.putQueryParameter("SignName", "你的签名");request.putQueryParameter("TemplateCode", templateCode);/*// 构建一个短信验证码HashMap<String, Object> map = new HashMap<>();map.put("code", 6666);*/request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));try {CommonResponse response = client.getCommonResponse(request);System.out.println(response.getData());return response.getHttpResponse().isSuccess();} catch (ServerException e) {e.printStackTrace();} catch (ClientException e) {e.printStackTrace();}return false;}}

4、编写controller层

@RestController
@CrossOrigin    // 跨域
public class SmsApiController {@Autowiredprivate SendSms sendSms;@Autowiredprivate RedisTemplate<String,String> redisTemplate;@PostMapping("/send")public String code(String phone) {// 调用发送方法String code = redisTemplate.opsForValue().get(phone);if (!StringUtils.isEmpty(code)) {return phone + ":" + code + "已存在,还没有过期";}// 生成验证码并存储到redis中code = UUID.randomUUID().toString().substring(0, 4);HashMap<String, Object> param = new HashMap<>();param.put("code",code);boolean isSend = sendSms.send(phone, "SMS_192195645", param);if (isSend) {redisTemplate.opsForValue().set(phone,code,5, TimeUnit.SECONDS);return phone + ":" + code + "发送成功";}else {return "发送失败";}}
}

5、运行结果


先输入手机号码,然后点击获取验证码即可获取验证码。

这里的验证码是一个随机的四位数,不再是一个固定的值。

手把手教你写一个获取短信验证码业务(基于Spring Boot+Redis+阿里云短信服务)相关推荐

  1. spring boot集成阿里云短信服务

    1.导入相关pom依赖 <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java ...

  2. Spring Boot 整合 阿里云短信(模板模式)

    参考项目: RuoYi-Vue-Plus 添加依赖 <dependency><groupId>com.aliyun</groupId><artifactId& ...

  3. 手把手教你写一个生成对抗网络

    成对抗网络代码全解析, 详细代码解析(TensorFlow, numpy, matplotlib, scipy) 那么,什么是 GANs? 用 Ian Goodfellow 自己的话来说: " ...

  4. python k线合成_手把手教你写一个Python版的K线合成函数

    手把手教你写一个Python版的K线合成函数 在编写.使用策略时,经常会使用一些不常用的K线周期数据.然而交易所.数据源又没有提供这些周期的数据.只能通过使用已有周期的数据进行合成.合成算法已经有一个 ...

  5. 手把手教你写一个spring IOC容器

    本文分享自华为云社区<手把手教你写一个spring IOC容器>,原文作者:技术火炬手. spring框架的基础核心和起点毫无疑问就是IOC,IOC作为spring容器提供的核心技术,成功 ...

  6. 后端思维篇:手把手教你写一个并行调用模板

    前言 36个设计接口的锦囊中,也提到一个知识点:就是使用并行调用优化接口.所以接下来呢,就快马加鞭写第二篇:手把手教你写一个并行调用模板~ 一个串行调用的例子(App首页信息查询) Completio ...

  7. 手把手教你写一个中文聊天机器人

    本文来自作者 赵英俊(Enjoy) 在 GitChat 上分享 「手把手教你写一个中文聊天机器人」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 一.前言 发布这篇 Chat 的初衷是想和 ...

  8. 手把手教你写一个Matlab App(一)

    对于传统工科的学生用的最多的编程软件应该就是matlab,其集成度高,计算能力强,容易上手,颇受大众青睐.今天挖的这个新坑,主要是分享用matlab app designer设计GUI界面的一些方法和 ...

  9. 从原理到实现丨手把手教你写一个线程池丨源码分析丨线程池内部组成及优化

    人人都能学会的线程池 手写完整版 1. 线程池的使用场景 2. 线程池的内部组成 3. 线程池优化 [项目实战]从原理到实现丨手把手教你写一个线程池丨源码分析丨线程池内部组成及优化 内容包括:C/C+ ...

最新文章

  1. 工具类静态方法注入dao
  2. [python学习笔记] pyinstaller打包pyqt5程序无法运行
  3. 最酷的windows后门 呵呵
  4. Linux内核自旋锁
  5. Android官方开发文档Training系列课程中文版:OpenGL绘图之响应触摸事件
  6. ThreadLocal工具类
  7. 97 Three.js 使用 specularMap 设置高光贴图
  8. 最新2018.1.1深度学习平台搭建 Win10+GPU+Tensorflow+keras+CUDA --2018.1.1
  9. oracle stdevp函数,ORACLE和SQL语法区别归纳整理.doc
  10. Latex 调整行距
  11. Jetson Orin 平台GMSL camera 96712调试手册重点
  12. Windows.h和windows.h的区别
  13. 数据可视化工具之--百度图说
  14. 深度优先搜索及python实现围棋“吃子”
  15. (转载)【笨木头Lua专栏】基础补充02:函数的几个特别之处
  16. Spark-Shell 及 Spark-Submit
  17. C语言:打印二元一次方程的根
  18. JavaScript框架有哪些?JS框架汇总
  19. axios 导出excel---提示文件损坏解决方案
  20. csharp进阶练习题:复杂的数字序列试验【难度:2级】--景越C#经典编程题库,不同难度C#练习题,适合自学C#的新手进阶训练

热门文章

  1. vcomp140.dll怎么安装?提示vcomp140.dll丢失怎样修复?
  2. Spring(十三)- Spring 配置类的注解
  3. 接口测试工具Apifox 基础篇:测试管理
  4. (最新+详细+Pycharm远程调试GUI程序)解决qt.qpa.xcb: could not connect to display问题
  5. Hihocoder 1077
  6. 什么样的技术文章吸引人?
  7. 【单元测试】Junit 4(二)--eclipse配置Junit+Junit基础注解
  8. 小人物的互联网创业心经 先要赚钱活下来
  9. windows10 使用 postgreSQL
  10. 共建、共享开源 EDA 共性技术框架 | 2023 开放原子全球开源峰会开源 EDA 分论坛即将启幕