java对接阿里云短信服务详解(验证码,推广短信,通知短信)

news2025/1/15 19:43:18

前言

小前提:
- java:springboot框架,maven版本管理。
- 阿里云:有账号,已经进行实名认证。


java对接阿里云短信服务详解(验证码,推广短信,通知短信)

  • 前言
  • 1. 登录阿里云进入控制台
  • 2. 创建用户和用户组
  • 3. 开通阿里云短信服务
  • 4. 代码整合阿里云SMS短信服务
    • 4.1 pom.xml 中引入SDK依赖
    • 4.2 测试官方提供的实例Demo
    • 4.3 继承到springboot项目当中
      • 4.3.1 配置文件
      • 4.3.2 controller
      • 4.3.3 service
  • 4 启动项目测试发送

1. 登录阿里云进入控制台

阿里云登录地址:https://account.aliyun.com/login/login.htm
![在这里插入图片描述](https://img-blog.csdnimg.cn/b159a3cdeb1c4d458acd041d712adf1e.png
没账号的登录注册我就不写了铁子们。
登录之后:

在个人头像位置点击进入AccessKey管理
在这里插入图片描述

在这里插入图片描述

2. 创建用户和用户组

创建用户组

在这里插入图片描述
添加完成后进入用户组,并为其添加权限:
在这里插入图片描述
创建用户
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 开通阿里云短信服务

阿里云短信服务地址:https://dysms.console.aliyun.com/dysms.htm
在这里插入图片描述
在概览中直接点击立即开通短信服务!接下来点击快速学习:
在这里插入图片描述
点击添加签名,添加模板,去向阿里云申请自己定义的签名和短信模板!
打个时间戳 2023-1-13 ,我在写这篇文章的时候正在申请,现在的要求已经相当严格了,我被驳回好几次,所以填写相关信息的时候还是要认真一些哦
在这里插入图片描述
在这里插入图片描述
模板和签名申请提交后等待申请结果通过即可!
(可能是快过年了,审核超级慢,一般三个小时还没好,好了又驳回,
一次是官网没有体现出哪里需要用短信验证,
一次是应用商店没有搜索到app
祝大家申请的时候最好写好一遍过吧)


呃 写这边文章的时候又失败一次。
在这里插入图片描述
我签名是选的测试或学习,
在这里插入图片描述

在这里插入图片描述
点击 短信服务 控制台
在这里插入图片描述
点击 国内消息 我们需要添加一个签名和模板
签名和模板需要审核,一般两小时内审核。
在这里插入图片描述
ok 这里先审核。小编审核的时候特别慢,而且被打回好几次,所以大家填写资料的时候尽量详细吧。

这里审核这 我们去配置一下项目。

4. 代码整合阿里云SMS短信服务

4.1 pom.xml 中引入SDK依赖

Spring Boot版本我使用的是2.3.x:

<!-- aliyun sms SDK -->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.5.3</version>
</dependency>
<!-- fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.68</version>
</dependency>
<!-- redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

4.2 测试官方提供的实例Demo

@SpringBootTest
class AliyunSmsDemoApplicationTests {

    @Test
    void contextLoads() {

        /**
         * 连接阿里云:
         *
         * 三个参数:
         * regionId 不要动,默认使用官方的
         * accessKeyId 自己的用户accessKeyId
         * accessSecret 自己的用户accessSecret
         */
        DefaultProfile profile = DefaultProfile.getProfile(
                "cn-hu", "LTAI4GKDZfBV8V9B", "1bc8phOIbSWFt2AlLctBMMCI");
        IAcsClient client = new DefaultAcsClient(profile);

        // 构建请求:
        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("dysmsapi.aliyuncs.com");
        request.setSysVersion("2019-05-25");
        request.setSysAction("SendSms");

        // 自定义参数:
        request.putQueryParameter("PhoneNumbers", "xxxxx0441");// 接收短信的手机号
        request.putQueryParameter("SignName", "C上商城");// 短信签名
        request.putQueryParameter("TemplateCode", "SMS_20xxxxx74");// 短信模版CODE

        // 构建短信验证码
        Map<String,Object> map = new HashMap<>();
        map.put("code",1234);// 这里仅用于测试,所以验证码写死
        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();
        }
    }
}

4.3 继承到springboot项目当中

4.3.1 配置文件

application.yml和application.properties是同一个作用的文件,有些小白可能不太理解,这里看一下项目里使用的是那个后缀的配置文件,将内容复制进去即可。

application.yml

server:
  port: 8080

# spring相关配置
spring:
  redis:
    # Redis数据库索引(默认为0)
    database: 0
    # Redis服务器地址
    host: 8.xxx.xx.xx6
    # Redis服务器连接端口
    port: 6379
    # Redis服务器连接密码(默认为空)
    password: cspxxxxxxx
    jedis:
      pool:
        # 连接池最大连接数(使用负值表示没有限制)
        max-active: 8
        # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1
        # 连接池中的最大空闲连接
        max-idle: 8
        # 连接池中的最小空闲连接
        min-idle: 0
    # 连接超时时间(毫秒)
    timeout: 8000

application.properties

# accessKeyId
aliyun.sms.accessKeyId=LTAI4xxxxxxxxxxV9B
# accessKeySecret
aliyun.sms.accessKeySecret=LTAI4xxxxxxxxxxV8V9B
# 短信模板Code
aliyun.sms.templateCode=SMS_xxxxx74

4.3.2 controller

@RestController
public class AliyunSmsApiController {

    @Autowired
    private AliyunSendSmsService aliyunSendSmsService;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Value("${aliyun.sms.templateCode}")
    private String templateCode;

    /**
     * 短信发送
     *
     * @param phone
     * @return
     */
    @GetMapping("/send/{phone}")
    public String sendCode(@PathVariable("phone") String phone) {

        // 根据手机号从redis中拿验证码
        String code = redisTemplate.opsForValue().get(phone);
        if (!StringUtils.isEmpty(code)) {
            return phone + " : " + code + "已经存在,还没有过期!";
        }

        // 如果redis 中根据手机号拿不到验证码,则生成4位随机验证码
        code = UUID.randomUUID().toString().substring(0, 4);

        // 验证码存入codeMap
        Map<String, Object> codeMap = new HashMap<>();
        codeMap.put("code", code);

        // 调用aliyunSendSmsService发送短信
        Boolean bool = aliyunSendSmsService.sendMessage(phone, templateCode, codeMap);

        if (bool) {
            // 如果发送成功,则将生成的4位随机验证码存入redis缓存,5分钟后过期
            redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.MINUTES);
            return phone + " : " + code + "发送成功!";
        } else {
            return phone + " : " + code + "发送失败!";
        }
    }
}

4.3.3 service

@Service
public class AliyunSendSmsService {

    @Value("${aliyun.sms.accessKeyId}")
    private String accessKeyId;

    @Value("${aliyun.sms.accessKeySecret}")
    private String accessKeySecret;

    /**
     * 发送短信验证码
     *
     * @param phone        接收短信的手机号
     * @param templateCode 短信模板CODE
     * @param codeMap      验证码map 集合
     * @return
     */
    public Boolean sendMessage(String phone, String templateCode, Map<String, Object> codeMap) {

        /**
         * 连接阿里云:
         *
         * 三个参数:
         * regionId 不要动,默认使用官方的
         * accessKeyId 自己的用户accessKeyId
         * accessSecret 自己的用户accessSecret
         */
        DefaultProfile profile = DefaultProfile.getProfile(
                "cn-hangzhou", accessKeyId, accessKeySecret);
        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", phone);// 手机号
        request.putQueryParameter("SignName", "CSP网上商城");// 短信签名
        request.putQueryParameter("TemplateCode", templateCode);// 短信模版CODE

        // 构建短信验证码
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(codeMap));

        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 启动项目测试发送

在这里插入图片描述
手机收到短信验证码!

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

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

相关文章

基于servlet+mysql+jsp实现体育用品商城

基于servletmysqljsp实现体育用品商城一、系统介绍1、系统主要功能&#xff1a;2、环境配置二、功能展示1.主页(客户)2.登陆&#xff08;管理员&#xff09;3.主页&#xff08;管理员&#xff09;4.订单管理&#xff08;管理员&#xff09;5.客户管理&#xff08;管理员&#x…

linux系统结构

目录 0.前言 1.系统结构图 1.1.操作系统工作方式 1.2.高版本和低版本内核区别 0.前言 本专栏&#xff0c;是记录内核学习的&#xff0c;参考b站linux内核源码分析&#xff0c;以及linux内核艺术图解。后面的文章将记录个人的学习&#xff0c;源码注释&#xff0c;源码理解…

ANSYS Products 2020 R1 Linux64版本安装

fluent系列 占位 fluent2020R1版本安装fluent系列前言一、基础环境二、安装准备1.图形化环境准备2.路径准备3.挂载安装用iso4.拷贝安装文件三、开始安装1.进入图形化界面2.开始安装3.试运行fluent四、替换破解版的license总结前言 在centos7环境下安装使用fluent的部署记录。…

不用if else if 如何 解决文末尾问题

根据条件判断发送axios所携带的参数&#xff0c;这是搜索的2个条件&#xff0c;如果为空就按照空这个条件来搜索&#xff0c;所以为空携带参数就不能有他&#xff0c;导致if else if 的连续判断 开始来没有思路&#xff0c;随便尝试尝试&#xff0c;来打开自己的思路 期间尝…

【学习经验分享NO.20】代码报错(可帮助远程调试代码)

本博客会整理分享一些报错问题以及解决办法&#xff0c;本文会不断进行更新。有需求的朋友可以关注私信我&#x1f618;进行远程调试。&#x1f349;1.报错1问题nn.functional.sigmoid is deprecated. Use torch.sigmoid instead.解决办法将项目中的F.sigmoid修改为torch.sigmo…

【docker16】Docker-Compose容器编排

1.是什么 Docker-Compose是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Compose是Docker公司推出的一个工具软件&#xff0c;可以管理多个Docker容器组成一个应用&#xff0c;你需要定义一个YAML格式的配置文件docker-compose.yml&#xff0c;写好…

JAVA导出Excel通用工具——第二篇:使用EasyExcel导出excel的多种情况的例子介绍

JAVA导出Excel通用工具——第二篇&#xff1a;使用EasyExcel导出excel的多种情况的例子介绍1. 前言2. 依赖3. 导出简单例子3.1 ① 基础入门例子3.1.1 核心代码3.1.2 效果展示3.2 ② 注解的简单使用3.2.1 ExcelIgnore3.2.2 ExcelProperty3.2.2.1 一般效果&#xff08;表头合并等…

MySQL高级【InnoDB引擎】

1&#xff1a;InnoDB引擎1.1&#xff1a;逻辑存储引擎 InnoDB的逻辑存储结构如下图所示: 1). 表空间 表空间是InnoDB存储引擎逻辑结构的最高层&#xff0c; 如果用户启用了参数 innodb_file_per_table(在 8.0版本中默认开启) &#xff0c;则每张表都会有一个表空间&#xff08…

【iOS】—— 初识block

block 文章目录block什么是block&#xff1f;block语法Block变量截获自动变量值__block说明符截获的自动变量block的三种存储类型NSGlobalBlockNSStackBlockNSMallocBlockblock的父类block循环引用未完待续什么是block&#xff1f; Blocks是带有自动变量&#xff08;局部变量&…

React--》初识React框架及其基本使用

目录 React React的安装与使用 JSX语法及使用 模块与组件 React开发者工具的安装 面向组件编程 React React是一个用于构建用户界面的JavaScript库。用户界面:HTML页面(前端)。React主要用来写HTML页面&#xff0c;或构建Web应用。 如果从 MVC的角度来看&#xff0c;…

第一天总结之后端登录功能的实现

第一天总结之后端登录功能的实现 一、 前端页面 从图片 很明显知道 两个intput输入框 一个输入username 一个输入password 从前端的页面代码 可以找到form表单 根据form表单的action属性了解到 点击登录跳转到 controller 层的 LoginServlet 二、controller 层 创建一个 Log…

2023年跨境电商新趋势,新手小白还有出路吗?

跨境电商一直位于我国对外开放的最前沿&#xff0c;当下已经成为我国进出口贸易的关键组成部分之一&#xff0c;是外贸企业顺利开展进出口业务的重要保障&#xff0c;更是拥有庞大发展潜力以及活力的贸易新业态。在经济全球化趋势下&#xff0c;充分发挥出跨境电商的战略新通道…

Java 包的使用详解

文章目录1. 概念2. 导入包中的类2.1 使用类的全路径2.2 导入包2.3 静态导入包3. 自定义包4. 包的访问权限控制5. 常用的包Java编程基础教程系列1. 概念 在开发过程中&#xff0c;会定义很多的类&#xff0c;随着类的定义越来越多&#xff0c;难免会出现类名重复的情况&#xf…

mac 安装redis

文章目录mac 安装redis使用Homebrew安装Redis1.搜索redis版本2.使用Homebrew安装命令3.查看是否安装完成4.启动redis服务5.查看redis服务进程6.redis-cli连接redis服务7.检测 redis 服务是否启动8.修改密码mac 安装redis 使用Homebrew安装Redis 首先这里需要安装homebrew 1.搜…

【Kubernetes 企业项目实战】03、基于 Alertmanager 发送报警到多个接收方(上)

目录 一、配置 Alertmanager 发送报警到 qq 邮箱 1.1 设置 163 邮箱 1.2 创建 alertmanager 配置文件 1.3 创建 prometheus 告警规则配置文件 1.4 安装 prometheus 和 alertmanager 1.5 部署 alertmanager 的 service 1.6 浏览器访问 Prometheus 和 alertmanager 二、配…

ELK日志(2)

elasticsearch群集状态颜色&#xff1a;灰色&#xff1a;未连接绿色&#xff1a;数据完整态黄色&#xff1a;副本不完整红色&#xff1a;数据分片不完整紫色&#xff1a;数据分片复制过程群集主机角色&#xff1a;主节点master&#xff1a;负责管理调度工作节点&#xff1a; 负…

从IPv6的普及看中国未来网络的发展

最近看了一篇《邬贺铨&#xff1a;IPv6或是未来主流网络》的文章,谈到了未来网络的发展问题。IPv6也许是未来主流网络的发展方向。那么什么是IPv6呢,不妨来看下关于他的另一篇文章《邬贺铨&#xff1a;IPv6是IPv6规模部署第三阶段重要抓手》。 他谈到&#xff0c;IPv6是下一代互…

单绞机张力开环控制(绞臂行星差速机构算法)

PLC的开环和闭环张力控制算法,可以参看下面的文章链接: PLC张力控制(开环闭环算法分析)_plc张力控制程序_RXXW_Dor的博客-CSDN博客里工业控制张力控制无处不在,也衍生出很多张力控制专用控制器,磁粉制动器等,本篇博客主要讨论PLC的张力控制相关应用和算法,关于绕线机的…

动态内存管理(1)

TIPS 1. 2. malloc, free, calloc, realloc 这些的基本前提都是在内存堆区 内存堆区不能与内存栈区两者混淆乱套 动态内存管理存在的原因 1. 为什么要有动态内存管理&#xff1f;其实我们之前学过比如说对内存的管理&#xff0c;比方说我申请一块内存空间&#xff1a; 1.…

任意方向边界框——day64 读论文:基于自适应目标定位特征卷积神经网络的高分辨率遥感影像多面向目标检测

Multi-Oriented Object Detection in High-Resolution Remote Sensing Imagery Based on Convolutional Neural Networks with Adaptive Object Orientation Features 基于自适应目标定位特征卷积神经网络的高分辨率遥感影像多面向目标检测1. Introduction2. Materials and Met…