阿里云短信验证笔记

1.了解阿里云的权限操作

进入AccessKey管理

选择子用户

创建用户组和用户

先创建用户组,建好再进行权限分配

添加短信管理权限

创建用户

创建好后的id和密码在此处下载可以得到

2.开通阿里云短信服务

进行申请,配置短信模板

阿里云短信API文档

短信服务API概览及参考_短信服务(SMS)-阿里云帮助中心

3.测试编码

3.1创建springboot项目导入依赖

        <!--阿里云sdk--><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.1.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>

dome测试代码

package com.yang.sms_dome;import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.util.HashMap;@SpringBootTest
class SmsDomeApplicationTests {@Testvoid contextLoads() {// 连接阿里云DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou","自己的keyid", "自己的密钥");IAcsClient client = new DefaultAcsClient(profile);// 构建请求CommonRequest request = new CommonRequest();request.setMethod(MethodType.POST);// 这些内容不要动,是人家阿里巴巴弄出来的,咱不用管request.setDomain("dysmsapi.aliyuncs.com");//不要动request.setVersion("2017-05-25");//不要动// 自己的内容,此处 SendSms 为发送验证码request.setAction("SendSms");//自定义的参数(手机号,验证码,签名,模板! )//这是我的内容,请结合你的情况修改为你的东西!!!request.putQueryParameter("PhoneNumbers", "手机号");request.putQueryParameter("SignName", "阿里云短信测试");//阿里云专用短信测试签名request.putQueryParameter("TemplateCode", "SMS_154950909");//阿里云专用短信测试模板//构建短信验证码HashMap<String,Object> map=new HashMap<>();map.put("code",1877);request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));try {CommonResponse response = client.getCommonResponse(request);// 在控制台上打印出返回信息System.out.println(response.getData());} catch (ClientException e) {e.printStackTrace();}}}

controller类

package com.yang.sms_dome.controller;import com.aliyuncs.utils.StringUtils;
import com.yang.sms_dome.service.SendSmsService;
import io.netty.util.internal.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.TimeUnit;@RestController
@CrossOrigin    //跨域
public class SendSmsController {@Autowiredprivate SendSmsService sendSmsService;@Autowiredprivate RedisTemplate<String,String> redisTemplate;@GetMapping("/send/{phone}")public String code(@PathVariable("phone") String phone){String code = redisTemplate.opsForValue().get(phone);if (StringUtils.isNotEmpty(code)){return phone+code+"已存在,未过期";}//生成验证码并且存储到redis中code = generateVerificationCode(4);HashMap<String, Object> map = new HashMap<>();map.put("code",code);boolean flag = sendSmsService.sendSms(phone, "SMS_154950909", map);if (flag){redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);return phone+":"+code+"发送成功!";}return "发送失败";}public static String generateVerificationCode(int length) {Random random = new Random();StringBuilder sb = new StringBuilder();for (int i = 0; i < length; i++) {int digit = random.nextInt(10); // 生成 0 到 9 之间的随机数字sb.append(digit);}return sb.toString();}
}

service层

package com.yang.sms_dome.service;import java.util.Map;public interface SendSmsService {boolean sendSms(String phoneNum, String templateCode, Map<String,Object> code);
}

serviceImpl层

package com.yang.sms_dome.serviceImpl;import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.yang.sms_dome.service.SendSmsService;
import org.springframework.stereotype.Service;import java.util.Map;
@Service
public class SendSmsServiceImpl implements SendSmsService {@Overridepublic boolean sendSms(String phoneNum, String templateCode, Map<String, Object> code) {// 连接阿里云DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou","自己的keyid", "自己的密钥");IAcsClient client = new DefaultAcsClient(profile);// 构建请求CommonRequest request = new CommonRequest();request.setMethod(MethodType.POST);// 这些内容不要动,是人家阿里巴巴弄出来的,咱不用管request.setDomain("dysmsapi.aliyuncs.com");//不要动request.setVersion("2017-05-25");//不要动// 自己的内容,此处 SendSms 为发送验证码request.setAction("SendSms");//自定义的参数(手机号,验证码,签名,模板! )//这是我的内容,请结合你的情况修改为你的东西!!!request.putQueryParameter("PhoneNumbers", phoneNum);request.putQueryParameter("SignName", "阿里云短信测试");//阿里云专用短信测试签名request.putQueryParameter("TemplateCode", templateCode);//阿里云专用短信测试模板request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));try {CommonResponse response = client.getCommonResponse(request);// 在控制台上打印出返回信息System.out.println(response.getData());return response.getHttpResponse().isSuccess();} catch (ClientException e) {e.printStackTrace();}return false;}
}

yaml配置文件

server:port: 8080spring:redis:host: 127.0.0.1port: 6379

参考视频:【狂神说】通俗易懂的阿里云短信业务实战教程_哔哩哔哩_bilibili

代码仓库(私有):https://gitee.com/yzh-ch/sms_test

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 逗号分隔查询--find_in_set()函数

业务场景&#xff1a; 在使用MySQL的时候&#xff0c;可能的某个字段存储的是一个英文逗号分割的字符串&#xff08;这里我们不讨论表设计的合理性&#xff09;&#xff0c;如图所示&#xff1a; 我们在查询的时候需要匹配逗号分割中的某个字符串&#xff0c;该怎么查询呢&am…

地图可视化绘制 | R-ggplot2 NC地图文件可视化

在推出两期数据分享之后&#xff0c;获取数据的小伙伴们也知道&#xff0c;数据格式都是NetCDF(nc) 格式网格数据&#xff0c;虽然我在推文分享中说明使用Python、R或者GIS类软件都是可以进行 处理和可视化绘制的&#xff0c;但是&#xff0c;还是有小伙伴咨询使用编程软件Pyth…

浅谈mysql mvcc

目录 前言 mvcc 是如何工作的&#xff1f; 数据的更新 前言 mvcc 与一个事物的隔离级别有关&#xff0c;未提交读永远读的是当前值&#xff0c;串行化是通过加锁实现&#xff0c;这两种隔离级别都与mvcc 没有任何关系。只要一提到mvcc应该想到的是读提交以及可重复读&#…

Spring八股 常见面试题

什么是Spring Bean 简单来说&#xff0c;Bean 代指的就是那些被 IoC 容器所管理的对象。我们需要告诉 IoC 容器帮助我们管理哪些对象&#xff0c;这个是通过配置元数据来定义的。配置元数据可以是 XML 文件、注解或者 Java 配置类。 将一个类声明为 Bean 的注解有哪些? Com…

【buuctf-gakki】

binwalk 查看图片&#xff0c;发现有 rar 文件&#xff0c;提取后如上图所示&#xff08;flag.txt为已经解压后出来的&#xff09;其中这个 rar 需要用 archpr爆破一下 打开后一个 flag.txt 一堆杂乱无章的字符&#xff0c;需要用到 python 脚本进行词频统计&#xff0c;我们…

Vue3 在SCSS中使用v-bind

template 先创建一个通用的页面结构 <template><div class"v-bubble-bg"></div> </template>js 在JS中先对需要用的数据进行定义&#xff1a; 可以是参数&#xff0c;也可以是data <script setup>const props defineProps({bgCol…

设计模式系列文章-7个创建型模式更新已完结

其实从2019年开始就有些一套关于设计模式的系列文章&#xff0c;但是因为种种原因一直搁置到现在。直到2024年才又恢复更新。 24年1月份上旬一直在弄博客站&#xff1a;https://jaune162.blog 的搭建 24年1月份下旬弄专题站&#xff1a;https://books.jaune162.blog 的搭建。…

本地写的Bash脚本,Linux端运行报错:/bin/bash^M: bad interpreter: No such file or directory

背景 在本地写了个Bash Shell脚本&#xff0c;但上传到Linux端后加完权限执行时报错&#xff1a; &#xff08;脚本名&#xff1a;script.sh&#xff09; -bash: ./script.sh: /bin/bash^M: bad interpreter: No such file or directory 分析 这个错误通常是由于脚本文件的行…

beets,一个有趣的 Python 音乐信息管理工具!

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站AI学习网站。 目录 前言 什么是Beet库&#xff1f; 安装Beet库 使用Beet库 Beet库的功能特性 1. 多种音乐格式支持 2. 自动标签识…

LNMP架构介绍及配置--部署Discuz社区论坛与wordpress博客

一、LNMP架构定义 1、LNMP定义 LNMP&#xff08;Linux Nginx Mysql Php&#xff09;是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写&#xff1b;Linux系统下NginxMySQLPHP这种网站服务器架构。 Linux是一类Unix计算机操作系统的统称&#xff0c;是目…

力扣2月最后三天的每日一题

力扣2月最后三天的每日一题 前言2867.统计树中的合法路径数目思路确定1e5中的质数统计每个点的连接情况开始对质数点进行处理完整代码 2673.使二叉树所有路径值相等的最小代价思路完整代码 2581.统计可能的树根数目思路建立连通关系将猜测数组变为哈希表&#xff0c;方便查询利…

利用 Python 抓取数据探索汽车市场趋势

一、引言 随着全球对环境保护意识的增强和技术的进步&#xff0c;新能源汽车作为一种环保、高效的交通工具&#xff0c;正逐渐受到人们的关注和青睐。在这个背景下&#xff0c;对汽车市场的数据进行分析和研究显得尤为重要。 本文将介绍如何利用 Python 编程语言&#xff0c;结…

STM32标准库——(14)I2C通信协议、MPU6050简介

1.I2C通信 I2C 通讯协议(Inter&#xff0d;Integrated Circuit)是由Phiilps公司开发的&#xff0c;由于它引脚少&#xff0c;硬件实现简单&#xff0c;可扩展性强&#xff0c; 不需要USART、CAN等通讯协议的外部收发设备&#xff0c;现在被广泛地使用在系统内多个集成电路(IC)间…

BCN-活性酯,BCN-活性酯,可用于合成双环壬酮功能化聚乙二醇聚合物涂层

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;1516551-46-4&#xff0c;BCN-NHS&#xff0c; BCN-NHS 酯&#xff0c;BCN-活性酯&#xff0c;BCN-succinimidylester&#xff0c;丙烷环辛炔-活性酯&#xff0c;BCN-琥珀酰亚胺酯 一、基本信息 【产品简介】&#…

JetPack 5.1编译mish_cuda

1.查看jetpack版本:sudo jtop 自带的就有cuda11.4和cudnn8.X以及python3.8,我的cudnn就没有是后期自己安装的 2.安装torch PyTorch for Jetson - Announcements - NVIDIA Developer Forums 选择对应的cuda版本和torch版本,我下载的是:torch-2.1.0a0+41361538.nv23.06-cp…

初学HTMLCSS——盒子模型

盒子模型 盒子&#xff1a;页面中所有的元素&#xff08;标签&#xff09;&#xff0c;都可以看做是一个 盒子&#xff0c;由盒子将页面中的元素包含在一个矩形区域内&#xff0c;通过盒子的视角更方便的进行页面布局盒子模型组成&#xff1a;内容区域&#xff08;content&…

深度学习-神经网络原理

文章目录 神经网络原理1.单层神经网络1.1 回归单层神经网络&#xff1a;线性回归1.2 二分类单层神经网络&#xff1a;sigmoid与阶跃函数 1.3 多分类单层神经网络&#xff1a;softmax回归 神经网络原理 人工神经网络&#xff08;Artificial Neural Network&#xff0c;ANN&…

MYSQL02高级_目录结构、默认数据库、表文件、系统独立表空间

文章目录 ①. MySQL目录结构②. 查看默认数据库③. MYSQL5.7和8表文件③. 系统、独立表空间 ①. MySQL目录结构 ①. 如何查看关联mysql目录 [rootmysql8 ~]# find / -name mysql /var/lib/mysql /var/lib/mysql/mysql /etc/selinux/targeted/tmp/modules/100/mysql /etc/seli…

【Golang】Golang使用embed加载、打包静态资源文件

【Golang】Golang使用embed加载、打包静态资源文件 大家好 我是寸铁&#x1f44a; 总结了一篇Golang使用embed加载静态资源文件的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 事情是这样的&#xff1a;前不久&#xff0c;有同学问我,golang怎么把静态资源文件打包成一…

centos7升级openssl_3

1、查看当前openssl版本 openssl version #一般都是1.几的版本2、下载openssl_3的包 wget --no-check-certificate https://www.openssl.org/source/old/3.0/openssl-3.0.3.tar.gz#解压 tar zxf openssl-3.0.3.tar.gz#进入指定的目录 cd openssl-3.0.33、编译安装遇到问题缺…