新版阿里云发送短信验证码详解

article/2025/8/19 16:31:05

一、申请短信服务步骤

在这里插入图片描述

首先进入阿里云控制台,点击左侧产品与服务,找到短信服务。

第一次进入会有新手引导,这里主要介绍一下大致步骤和易错点

  1. 申请短信签名和模板

短信签名一般是企业或者组织名的简写,主要是告知收信人自己是谁。一般体现在短信的开头,用括号括住。

【Dresults】您的验证码:139267,您正进行身份验证,打死不告诉别人!

模板就是我要发送内容的模板,每条短信共有的部分,将变化的部分抽出作为变量,体现在代码中。注意,短信模板具有类型,且不同类型收费标准不同,这里就先介绍短信验证码

在这里插入图片描述

至于模板具体选择,可以自定义也可以使用常用模板库(完全免费的),切记模板要遵守一定的规范。

  • 验证码模板只支持验证码作为变量;变量替换值<=6位数字或字母
  • 不能发送营销/贷款/借款/中奖/抽奖类短信,不支持金融理财&房产通知类短信(验证码除外)
  • 签名/模版申请规范 https://help.aliyun.com/document_detail/55324.html

最后是申请说明,这里大家简要介绍一下此模板的应用场景或者介绍一下自己或公司,一般没什么用。提交申请后2小时左右就会收到审批通知

  1. 订购短信套餐包

这步一般不需要什么操作,因为阿里云短信收费是预先缴费,按量付费。只要阿里云账号有钱就可以,不需要订购。

  1. 系统设置

这步还是要仔细看一下,主要是安全设置,有防盗刷机制,这里不详细展开,阿里云的文档还是很详细的。

  1. 发送短信

有两种方式,分别是API发送和群发助手进行短信群发。这里介绍API发送
在这里插入图片描述

查看开发者指南—不同编程语言的短信服务SDK(Software Development Kit 软件开发工具包)—JAVA SDK DEMO

在这里插入图片描述

按照图示箭头一次选择,这里取消只看必填参数,后面如果需要扩展再自行选择(必填参数中没有验证码参数)

这里的三个参数介绍一下,一开始是默认不填参数的,右侧的代码中也没有对于的参数,我们手动填写后,代码中才会出现参数。还有代码中的内容除了我们自己填写的,其他都不要修改,下面这个不是时间,是版本号,修改了就会出错,其他也一样。

request.setSysVersion("2017-05-25");
  1. AccessKey ID和AccessKey Secret设置

鼠标放到用户头像处,点击下拉选项AccessKey管理,进入页面后,创建AccessKey。输入手机验证码后,就创建成功了。注意****这是唯一一次保存键和密码的时间,保存到本地上,以后就不可查看了,只能删除重建。

AccessKey ID和AccessKey Secret相当于是阿里云账号的一个子账号,起到验证作用,可以用这个账号来调用阿里云API服务。

第一个参数,PhoneNumber手机号,第二个SignName签名名称(必须审核通过的才行);第三个TemplateCode短信模板ID(是模板管理的模板CODE);第四个是短信验证码模板变量参数(这里用json格式{“code”:“123456”},注意要用小写。验证码的值后面代码中用随机数替代,code按照自己模板中的写,一般是code)

在这里插入图片描述

最后可以尝试发起调用,这里测试不需要花钱。可以真实发送短信。

二、代码集成(java-SpringBoot)

public class MessageUtil {//产品名称:云通信短信API产品,开发者无需替换static final String product = "Dysmsapi";//产品域名,开发者无需替换static final String domain = "dysmsapi.aliyuncs.com";static final String accessKeyId = "填自己的";static final String accessKeySecret = "填自己的";@Autowiredprivate RedisRepository redisRepository;public MessageDto getSsm(String number) {if (number.equals("") || number == null) {throw new SysException("没有填写手机号");}System.setProperty("sun.net.client.defaultConnectTimeout", "10000");System.setProperty("sun.net.client.defaultReadTimeout", "10000");//初始化acsClient,暂不支持region化IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);try {DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);} catch (ClientException e1) {e1.printStackTrace();}IAcsClient acsClient = new DefaultAcsClient(profile);//随机生成六位验证码int code = (int) ((Math.random() * 9 + 1) * 100000);//组装请求对象-具体描述见控制台-文档部分内容SendSmsRequest request = new SendSmsRequest();//必填:待发送手机号request.setPhoneNumbers(number);//必填:短信签名-可在短信控制台中找到,你在签名管理里的内容request.setSignName("填自己的");//必填:短信模板-可在短信控制台中找到,你模板管理里的模板编号request.setTemplateCode("填自己的");//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为request.setTemplateParam("{\"code\":\"" + code + "\"}");//选填-上行短信扩展码(无特殊需求用户请忽略此字段)//request.setSmsUpExtendCode("90997");//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者//request.setOutId("yourOutId");//hint 此处可能会抛出异常,注意catchSendSmsResponse sendSmsResponse = null;try {sendSmsResponse = acsClient.getAcsResponse(request);} catch (ServerException e) {e.printStackTrace();} catch (ClientException e) {e.printStackTrace();}//获取发送状态MessageDto messageDto = new MessageDto(code, sendSmsResponse.getCode());//保存手机验证码至redis中,大家没有用的话可以保存在mysql数据库中redisRepository.saveMessageCode(number, String.valueOf(code));log.info(number + ":  发送了一条验证码");return messageDto;}}

三、验证码应用

这里介绍我对验证码的理解,验证码一般是用在登录或注册处的,为的就是防止机器暴力调用接口,造成资源的浪费。

具体流程是,先按下发送验证码的按钮,这时手机会收到短信。下一步就是我们最初的目的,或是登录或是注册,选项中有一项为输入验证码。输入后,后台会校验手机号和验证码是否对应。所以在发送验证码后,后台要将手机号和验证码的键值对保存起来。保存的地方可以是mysql,也可以是redis。

如果是redis,本身就具备了键值对的对应关系,只需要保存就好。

如果是Mysql,需要我们建表,并加上两列,分别是手机号和验证码。

这里介绍一下redis的代码部分

RedisUtil为工具类,直接接触redis

public class RedisUtil {public static boolean exists(StringRedisTemplate redisTemplate, String key) {return redisTemplate.hasKey(key);}public static<T> void set (StringRedisTemplate redisTemplate, String key, T  value) {redisTemplate.opsForValue().set(key, JsonUtil.toJson(value));}public static<T> T get (StringRedisTemplate redisTemplate, String key, Class<T> clazz) {String value = redisTemplate.opsForValue().get(key);if (null != value) {return JsonUtil.toObject(value, clazz);}return null;}public static void del(StringRedisTemplate redisTemplate, String key) {redisTemplate.delete(key);}
}

这个RedisRepository的实现类

里面有一处代码需要注意,RedisKeyTemplate.T_VERIFICATION_CODE,这个在最后的代码块中能发现,是给redis空间命名。相信聪明的大家肯定可以明白的。

RedisUtil.set(redisTemplate, RedisKeyUtil.buildKey(RedisKeyTemplate.T_VERIFICATION_CODE, phone), messageCode);
@Component
public class RedisRepositoryImpl implements RedisRepository {@Autowiredprivate StringRedisTemplate redisTemplate;/*** 保存手机号和验证码的键值对<phone, messageCode>** @param phone* @param messageCode 验证码*/@Overridepublic void saveMessageCode(String phone, String messageCode) {RedisUtil.set(redisTemplate, RedisKeyUtil.buildKey(RedisKeyTemplate.T_VERIFICATION_CODE, phone), messageCode);}@Overridepublic String selectMessageCodeByPhone(String phone) {return RedisUtil.<String>get(redisTemplate, RedisKeyUtil.buildKey(RedisKeyTemplate.T_VERIFICATION_CODE, phone), String.class);}
}
public interface RedisRepository {/*** 保存手机号和验证码的键值对<phone, messageCode>* @param phone* @param messageCode 验证码*/void saveMessageCode(String phone, String messageCode);/*** 根据key:手机号 查询验证码* @param phone* @return*/String selectMessageCodeByPhone(String phone);
}
public class RedisKeyTemplate {/***记录验证码信息* 键:Verification_Code:verificationCode* 值:{ verificationCode, phoneNumber }*/public final static String T_VERIFICATION_CODE = "Verification:%s";
}

http://chatgpt.dhexx.cn/article/x91Cg9nZ.shtml

相关文章

使用阿里云发送短信验证码

目录 一、用户注册登录流程 二、使用阿里云发送短信验证码 ⭐生成密钥 ⭐将密钥配置到项目中 ⚪新建properties文件并填入相应信息 ⚪pom配置 ​⚪ 测试代码 ⚪添加签名 ​⚪添加短信发送的模板 &#x1f4a7;验证码防盗刷监控 一、用户注册登录流程 二、使用阿里…

通用阿里云的短信验证码(详细)

阿里云手机短信验证码 第一步 登录阿里云开放平台 1、进入阿里云开放平台---->点击控制台 2、点击AccessKey管理 3、点击之后会弹出提示&#xff0c;选择开始使用子用户 4、新建一个用户组&#xff0c;然后按要求填写即可 5、创建一个用户&#xff0c;按要求填写内容&…

《设计模式系列》- 代理模式

有情怀&#xff0c;有干货&#xff0c;微信搜索【三太子敖丙】关注这个有一点点东西的程序员。 本文 GitHub https://github.com/JavaFamily 已收录&#xff0c;有一线大厂面试完整考点、资料以及我的系列文章。 设计模式已经跟大家分享很多了常见的模式了&#xff0c;感兴趣的…

Nginx代理tomcat

为什么需要为tomcat配置nginx反向代理&#xff1f; 1.当服务器上同时拥有nginx与tomcat时&#xff0c;tomcat修改8080端口为80会冲突 2.tomcat不更改监听端口8080即可使用nginx的80端口 3.Nginx对于静态的请求速度上要优于Tomcat&#xff0c;Tomcat不擅长做高并发的静态文件请…

GPU虚拟化

GPU 虚拟化技术 须知: 文章内容大程度参考B站王利明老师对《GPU虚拟化技术分享》的主题演讲 视频链接: https://b23.tv/uQKBpcK 1 GPU 和软件架构 GPU可以用于图形渲染&#xff0c;GPU 作为加速图形绘制的芯片时&#xff0c;它主要面向的产品主要是会集中在 PC 和游戏两个市场…

代理模式(四):代理模式效果与适用场景

15.7 代理模式效果与适用场景 代理模式是常用的结构型设计模式之一&#xff0c;它为对象的间接访问提供了一个解决方案&#xff0c;可以对对象的访问进行控制。代理模式类型较多&#xff0c;其中远程代理、虚拟代理、保护代理等在软件开发中应用非常广泛。 15.7.1 模式优点 代理…

Nginx 反向代理、负载均衡、虚拟主机

文章目录 一、反向代理1、代理原理2、正/反向代理的区别&#xff08;1&#xff09;正向代理&#xff08;2&#xff09;反向代理 3、配置Nginx-Proxy&#xff08;1&#xff09;代理模块&#xff08;2&#xff09;代理配置&#xff08;3&#xff09; proxy 代理实例 二、负载均衡…

设计模式之代理模式

定义 代理模式又叫委托模式&#xff0c;是为某个对象提供一个代理对象&#xff0c;并且由代理对象控制对原对象的访问。代理模式通俗来讲就是我们生活中常见的中介。 我们使用代理对象来代替对真实对象(real object)的访问&#xff0c;这样就可以在不修改原真实对象的前提下&a…

java设计模式9:Proxy(3)虚拟代理

加载延迟可以提高软件的友好程度。 当一个真实的主题对象的加载需要耗费资源时&#xff0c;一个虚拟代理对象可以代替真实对象接受请求。一旦接到请求&#xff0c;代理对象马上打出一段“正在加载”的信息&#xff0c;并在适当的时候加载真实主题对象&#xff0c;也就是模块或…

设计模式:(代理模式)

1.定义 在代理模式&#xff08;Proxy Pattern&#xff09;中&#xff0c;一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中&#xff0c;我们创建具有现有对象的对象&#xff0c;以便向外界提供功能接口。 简单来说&#xff1a;代理模式为其他对象提…

Nginx 虚拟主机与反向代理

一、虚拟主机 虚拟主机使用的是特殊的软硬件技术&#xff0c;它把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机&#xff0c;每台虚拟主机都可以是一个独立的网站&#xff0c;可以具有独立的域名&#xff0c;具有完整的Intemet服务器功能&#xff08;WWW、FTP、Emai…

【设计模式】学习笔记16:代理模式之虚拟代理(实现CD封面加载器)

本文出自 http://blog.csdn.net/shuangde800 在上篇中&#xff0c;我们学习了代理模式&#xff0c;并用Java RMI实现了一个最简单的远程代理。 实际上代理模式并不仅仅应用与远程代理&#xff0c;还有很多其他的应用。 比如&#xff1a;虚拟代理。 代理模式可以以很多形式出现…

代理模式(三):远程代理,虚拟代理,缓冲代理

15.4 远程代理 远程代理(Remote Proxy)是一种常用的代理模式&#xff0c;它使得客户端程序可以访问在远程主机上的对象&#xff0c;远程主机可能具有更好的计算性能与处理速度&#xff0c;可以快速响应并处理客户端的请求。远程代理可以将网络的细节隐藏起来&#xff0c;使得客…

虚拟机 全局代理 主机代理_比较虚拟代理与真实代理的性能

云计算的关键基础是虚拟化。 面向云的设计人员&#xff0c;开发人员和管理员需要问自己的一个问题是&#xff1a;“虚拟化组件的性能水平如何与其“真实”物理对应物相提并论&#xff1f;” “如果存在负面差距&#xff0c;我该如何克服呢&#xff1f;” 本文介绍了在虚拟机&a…

设计模式——代理模式(虚拟代理)

代理模式的类型分为: (1)虚拟代理 (2)远程代理 (3)智能指引 (4)保护代理 这一篇主要讲虚拟代理,想要知道其他类型讲解的小伙伴可以去我其他博客翻一翻哦。 首先来理解一波虚拟代理,啥叫虚拟代理? 举个很常见也很通俗的例子,咱们平时抽奖的时候,是不是都想要抽个…

[转载]虚拟代理模式(Virtualnbsp;Proxy)

虚拟代理模式(Virtualnbsp;Proxy) 第25章 虚拟代理模式(Virtual Proxy) 描述&#xff1a; 虚拟代理模式 (Virtual Proxy)是一种节省内存的技术&#xff0c;它建议创建那些占用大量内存或处理复杂的对象时&#xff0c;把创建这类对象推迟到使用它的时候。在特定的应用 中&#x…

代理模式——虚拟代理(二)

代理模式定义 为另一个对象提供一个替身或占位符以控制对这个对象的访问。使用代理模式创建代表对象&#xff0c;让代表对象控制对某对象的访问&#xff0c;被代理的对象可是远程的对象、创建开销大的对象或需要安全控制的对象。 代理分三种&#xff1a; 1.远程代理&#xff…

SQL语法与数据库快速入门(1)

目录 数据库简介数据库分类常用数据库简介使用场景MySql 的安装与配置数据库客户端工具MySql 介绍SQL 简介DDL 数据库操作-创建DDL 数据库操作-查看DDL 数据库操作-修改DDL 数据库操作-删除DDL 数据库表操作简介DDL 数据库表操作-创建DDL 数据库表操作-查看DDL 数据库表操作-修…

SQL语法与数据库快速入门(2)

目录&#xff1a; 多表简介SQL 约束-外键约束多表关系简介多表查询多表查询-内连接查询多表查询-外连接查询子查询简介子查询实战数据库进阶redis 内存数据库mongodb nosql 数据库neo4j 图数据库 1.多表简介 多表及使用场景介绍&#xff1a; 多表顾名思义就是在数据库设计中…

【数据库】MYSQL轻松入门

文章目录 MYSQL入门一、MYSQL概述1. 数据库相关概念1.1 数据库&#xff0c;数据库管理系统与SQL1.2 数据库种类以及主流数据库管理系统排名1.2.1 数据库的种类1.2.2 数据库主流排名 1.3 MySQL数据库安装1.3.1 下载1.3.2 修改密码 1.4 数据模型 二、SQL2.1 通用语法与注释2.2 SQ…