个人旅游网(2.1)——使用阿里云在springboot项目中发送短信

news2024/11/14 17:29:16

文章目录

  • 一、背景介绍
  • 二、详细步骤
    • 2.1、申请资质
    • 2.2、申请签名
    • 2.3、申请模板
    • 2.4、申请accessKey秘钥对
    • 2.5、SDK的使用[!]
      • 2.5.1、项目中导入依赖
      • 2.5.2、发短信的工具类

一、背景介绍

在这里插入图片描述
验证码发送背后的功能原理图:
在这里插入图片描述
想要在项目中实现上述发送验证码的功能,就需要了解以下步骤。

二、详细步骤

阿里云短信服务
在这里插入图片描述
一个短信一般分成成两部分:签名、模板(就是短信的内容)
在这里插入图片描述

2.1、申请资质

在这里插入图片描述
在这里插入图片描述

2.2、申请签名

在这里插入图片描述

在这里插入图片描述

2.3、申请模板

我们发送的短信内容就是模板,可以自定义模板,所以申请完签名需要申请模板。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4、申请accessKey秘钥对

申请完资质、签名、模板,我们就具备了发短信的基本条件,但是如果需要通过程序来调用阿里云发短信的接口,我们还需要准备一个发短信的账号:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

用户创建成功之后,一定要点击
用户创建成功之后,需要给其添加权限:
在这里插入图片描述
在这里插入图片描述

2.5、SDK的使用[!]

通过阿里云提供的SDK来发送短信。

2.5.1、项目中导入依赖

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>dysmsapi20170525</artifactId>
    <version>2.0.4</version>
</dependency>

2.5.2、发短信的工具类

package com.hzz.travel.utils;

import cn.hutool.core.util.RandomUtil;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.teaopenapi.models.Config;

import java.util.Map;

/**
 * 发短信的工具类2.0
 * @author NewBoy
 * @since 2024-7-14
 */
public class SmsUtils {

    /**
     * accessKeyId和accessKeySecret 从CVS文件中获取
     */
    private static String accessKeyId = "你的accessKeyId";
    private static String accessKeySecret = "你的accessKeySecret";
    

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

    /**
     * 发送短信
     * @param telephone 电话号码
     * @param signName 签名
     * @param templateCode 模板编号
     * @param code 验证码
     * @return 返回的状态码为OK,则发送成功
     */
    public static String send(String telephone, String signName, String templateCode, String code) {
        try {
            Client client = SmsUtils.createClient(accessKeyId, accessKeySecret);
            SendSmsRequest sendSmsRequest = new SendSmsRequest()
                    .setPhoneNumbers(telephone)
                    .setSignName(signName)  //短信签名
                    .setTemplateCode(templateCode)  //模板编号
                    .setTemplateParam("{\"code\":\"" + code + "\"}");
            //发送短信,获取发送结果
            SendSmsResponse sendSmsResponse = client.sendSms(sendSmsRequest);
            //将结果转成Map对象
            Map<String, Object> map = sendSmsResponse.toMap();
            System.out.println("[SmsUtils]"+map);
            //获取主体部分
            Map<String, String> body = (Map<String, String>) map.get("body");
            System.out.println("[SmsUtils]"+body);
            System.out.println("[SmsUtils]"+body.get("Code"));
            return body.get("Code");
        } catch (Exception e) {
            e.printStackTrace();
        }
        //失败返回空
        return null;
    }

    /**
     * 调用方式
     * @param args
     */
    public static void main(String[] args) {
        String numberCode = RandomUtil.randomNumbers(6);
        String code = SmsUtils.send("手机号", "短信签名", "短信模板", "验证码");
        System.out.println(code);
    }
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

操作系统面试真题总结(三)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 什么是进程&#xff1f; 在操作系统中&#xff0c;进程是指正在执…

8月31复盘日记

8月31复盘日记 前言今日感恩今日记录今日感悟今日名言 前言 昨天因为回到宿舍比较晚&#xff0c;所以来不及进行记录。   昨天早上五点多就醒了&#xff0c;可能是睡眠质量特别好&#xff0c;基本一倒头就是深度睡眠。所以我直接就起床去健身房运动&#xff0c;练了臀和核心&…

FastAPI+Vue3零基础开发ERP系统项目实战课 20240831上课笔记 路径参数

遗留的问题 3、FastAPI4、MySQL85、SQLModel&#xff0c;和FastAPI框架是同一个作者&#xff0c;两者结合比较好用&#xff0c;但是学习成本较高&#xff0c;使用难度稍大6、Vue37、Tailwindcss8、Ant Design Vue&#xff0c;UI组件库9、数据同步&#xff1a;有一个API&#x…

基于卷积神经网络的磨削平板类零件擦伤检测

基于卷积神经网络的磨削平板类零件擦伤检测 前言正文 前言 还记得读研那会儿刚学习完了卷积神经网络&#xff0c;初步学会了最基础的分类问题&#xff0c;当时也有点python基础&#xff0c;同时对TensorFlow也有点入门了。正好我的课题中有一类缺陷比较难以用传统方法识别判断&…

Vue60 插槽

插槽 作用&#xff1a;让父组件可以向子组件指定位置插入html结构&#xff0c;也是一种组件间通信的方式&#xff0c;适用于 父组件 > 子组件 。 分类&#xff1a;默认插槽、具名插槽、作用域插槽 使用方式&#xff1a; 默认插槽&#xff1a; 父组件中&#xff1a;<Cat…

聊聊 OceanBase 资源管理

OceanBase 是分布式多租户架构数据库&#xff0c;其分布式集群从资源角度看可以分成集群、Zone、OB Server、资源池和租户等几个层次。 今天我们从集群和资源两个层次梳理 OceanBase 资源管理相关的概念。 OceanBase 集群管理 OceanBase 集群包含若干个Zone&#xff0c;一个Z…

CRE6511KL 原边SOP7电源芯片

CRE6511KL 是一款内置高压 BJT 功率开关管,5W多模式原边控制的开关电源芯片。CRE6511KL较少的外围元器件、较低的系统成本设计出高性能的交直流转换开关电源。CRE6511KL 提供了极为全面和性能优异的智能化保护功能&#xff0c;包括逐周期过流保护、软启动、芯片过温保护、输出过…

Hot Chips 2024:博通(Broadcom)展示AI计算ASIC的光学连接

引言 在2024年的Hot Chips会议上&#xff0c;博通展示了其最新的AI计算专用集成电路&#xff08;ASIC&#xff09;&#xff0c;这款ASIC集成了光学连接技术。这一展示不仅体现了博通在定制AI加速器领域的领先地位&#xff0c;也预示着未来数据中心网络技术的一个重要发展方向。…

Ubuntu上qt使用SSH样式表

SSH样式表 如果学习过web的同学都知道&#xff0c;我们在学习HTML的时候会用到样式表&#xff0c;我们使用它来更改我们的颜色、大小、背景等等。上到后面&#xff0c;老师会说&#xff1a;我们如果在HTML文件中编辑太多的样式&#xff0c;就会让代码看起来非常的繁琐&#xf…

Obsidian个人知识库搭建流程

Obsidian的安装 Obsidian官网 个人博客搭建 xlog【使用xlog搭建个人博客Step by Step】 知乎【使用xlog搭建个人博客Step by Step】

实习的一点回顾Gradle

1 项目目录下执行 ./gradlew build&#xff0c;用.gradlew自动构建 首先有一个gradlew&#xff08;linux&#xff09;或者gradlew.bat&#xff08;win&#xff09;是用来检查java配置&#xff0c;环境配置之类的东西 然后去启动gradle/wrapper/gradle-wrapper.jar去检测本地gra…

【Google Play版】bilibili 3.19.2最新国际版(如何鉴别是否官方?)

相信玩 B 站的小伙伴也不少&#xff0c;国内版确实太臃肿了&#xff0c;已经“变质”了。 这是主界面&#xff0c;我没有做任何设置&#xff0c;刚装好就是这样&#xff1a; 摘自 Play 最新的评论&#xff1a; “3.19非常好&#xff0c;解决了我之前两个痛点。一是首页的自动…

基于PCA-SVM的人脸识别系统(MATLAB GUI)

matlab人脸识别系统(GUI),PCASVM方法 源码详细注释以及适配于本系统的5k字的理论资料&#xff08;方便学习&#xff09; GUI里的人脸识别算法&#xff1a;PCA-SVM 功能&#xff1a;利用ORL数据库&#xff0c;进行训练&#xff0c;测试&#xff0c;并可对单张图片进行识别 两个界…

ArrayList的详细使用教程

ArrayList实现了List接口&#xff0c;是顺序容器&#xff0c;即元素存放的数据与放进去的顺序相同&#xff0c;允许放入null元素&#xff0c;底层通过数组实现。除该类未实现同步外&#xff0c;其余跟Vector大致相同。每个ArrayList都有一个容量(capacity)&#xff0c;表示底层…

vscode写markdown(引入html及css语法)

vscode写markdown 下载插件插入代码markdown中引入html和css语法导出pdf 下载插件 Markdown All in OneMarkdown Preview EnhancedPaste Image 插入代码 afdfafamarkdown中引入html和css语法 呵呵 用ctrlshiftp 搜索"Markdown Preview Enhanced:Customize CSS"在…

个人旅游网(2)——功能详解——用户登录注册

文章目录 一、用户登录1.1、接口详解1.1.1、isLogged (判断用户是否登录)1.1.2、find-by-telephone&#xff08;输入手机号时校验手机号是否注册&#xff09;1.1.3、send-message&#xff08;发送验证码&#xff09;1.1.4、login-by-telephone&#xff08;登录按钮&#xff09;…

Guarded Suspension 保护性暂定模式 以及嵌套死锁问题

多线程交互时&#xff0c;满足条件才去执行&#xff0c;否则阻塞一直到满足条件。当然可以用wait/notify实现。 本文用JUC包下的reentrantlock和其条件变量来完成。 文章目录 首先定义Predicate 和GuardAction&#xff1b;然后定义Blocker如何使用完整代码如下嵌套死锁问题 首…

PWMI模式测频率占空比

开启时钟 GPIO 时基单元 输入捕获初始化部分 配置两个IC通道同时捕获同一个引脚的模式 //快捷将电路配置成PWMI标准的标准结构&#xff0c;只支持通道1、2不支持3、4 //只需要传入一个通道的函数&#xff0c;此函数同时会把另一个通道配置为相反的配置&#xff0c;实现PWMI…

python读取txt文本文件-批量更改mysql数据库中一批用户的用户名的python脚本保存及转存关于OSI的七层模型和TCP/IP四层模型

一、python读取txt文本文件-批量更改mysql数据库中一批用户的用户名的python脚本保存 做一个简单的事&#xff1a;使用python读取一个txt文件&#xff0c;里面存储着N行用户id&#xff0c;需要一行行读取后再读取另一个存储用户昵称的txt文件&#xff0c;判断昵称是否有重复&am…

已知一个有序表为(13,18,24,35,47,50,62,83,90,115,134),当二分检索值为90的元素时,检索成功需比较的次数是( )。A.1

已知一个有序表为&#xff08;13&#xff0c;18&#xff0c;24&#xff0c;35&#xff0c;47&#xff0c;50&#xff0c;62&#xff0c;83&#xff0c;90&#xff0c;115&#xff0c;134&#xff09;&#xff0c;当二分检索值为90的元素时&#xff0c;检索成功需比较的次数是&a…