阿里云短信服务——短信发送验证码

article/2025/11/9 5:48:25

引言

短信服务现在在很多地方都用的到,我们最多接触到的可能就是验证码的发送了;现在很多大厂都提供由短信服务对应的api,直接调用就可以轻松实现短信发送;下面我以阿里云为例,演示一下如何短信发送验证码;

阿里云短信服务

首先是一些准备工作,注册阿里云账号就不说了;

打开自己的控制台,搜索找到短信服务:

image-20221015172048707

点开后找到快速学习(现在阿里云短信服务正式使用开通需要营业执照什么的证明,但是它也提供了学习用的方法,实现起来都差不多):

image-20221015172316827

在这里可以绑定一下自己的手机号,因为用来测试,所以只有绑定的手机号才能成功接收短信:

image-20221015172401645

然后可以看到下面有个签名模板,这个是一些必要的参数,一会要用到:

image-20221015172458275

这些都弄完后还有两个以外的步骤:

  • 在这里创建一个accessKey,这是你这个用户接口调用凭证:

    image-20221015172728683

记住保存好自己的AccessKey ID和secret;

  • 虽然是短信测试,但是毕竟发短信还是要钱的,所以还需要充点钱,很便宜,一条短信几分钱,我充了三块钱大概可以调用接口七十多次吧:

    image-20221015172950580

做完这些后,准备工作就完成了,可以发一条短信测试一下:

image-20221015173126354

下面就是代码开发;

代码开发

其实阿里云已经提供好代码模板了,能力强的可以直接看它的模板,并不难:

image-20221015173302130

image-20221015173351566

这里代码有两种版本,我这里就用网上最多的老版的了(还是看需求,在java这一块老版本其实没有问题的);

下面就是具体代码开发:

先引入依赖:

<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-dysmsapi</artifactId><version>2.2.1</version>
</dependency>
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.2.0</version>
</dependency>

在application.yml中配置一些基本信息:

image-20221015173956653

region_id就是服务地区,选择离自己近的就好;

另外两个参数就是刚才创建的accesskey;

然后创建一个工具类用来获取这三个参数:

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class AliyunConstant implements InitializingBean {@Value("aliyun.sms.region_id")private String regionId;@Value("aliyun.sms.access_key_id")private String accessKeyId;@Value("aliyun.sms.secret")private String secret;public static String REGION_ID;public static String ACCESS_KEY_ID;public static String SECRET;@Overridepublic void afterPropertiesSet() throws Exception {REGION_ID = regionId;ACCESS_KEY_ID = accessKeyId;SECRET = secret;}
}

然后配置短信发送模板:

/**
* 短信发送方法
* @param map 短信内容
* @param phone 发送电话号码
* @return 发送信息结果
*/
public Boolean sendMessage(Map<String, Object> map, String phone) {if (StringUtils.isAnyBlank(phone)) {throw new BusinessException(StatusCode.NULL_ERROR, "手机号为空");}DefaultProfile profile =DefaultProfile.getProfile(AliyunConstant.REGION_ID, AliyunConstant.ACCESS_KEY_ID, AliyunConstant.SECRET);IAcsClient client = new DefaultAcsClient(profile);SendSmsRequest request = new SendSmsRequest();request.setSignName("阿里云短信测试"); // 短信签名request.setTemplateCode("SMS_154950909"); // 短信模板coderequest.setPhoneNumbers(phone); // 测试号的号码(其它号码需要添加测试号先)request.setTemplateParam(JSONObject.toJSONString(map)); // 发送短信信息内容(因为这里是验证码,格式为:{"code":"4-6位数字"})try {SendSmsResponse response = client.getAcsResponse(request);log.info(JSON.toJSONString(response));return response.getMessage().equals("OK"); // 短信发送成功时Message信息为OK(默认的)} catch (ServerException e) {e.printStackTrace();} catch (ClientException e) {log.error("ErrCode:" + e.getErrCode());log.error("ErrMsg:" + e.getErrMsg());log.error("RequestId:" + e.getRequestId());}return false;
}

注意:这里是验证码发送,所以map格式需要为:{“code”:“4-6位数字”},格式错误会发送失败;


在这里我在多说点验证码发送的细节吧;

首先验证码的获取可以通过后端生成一个随机数,这里提供一个生成四位或六位的随机数工具类:

import lombok.extern.slf4j.Slf4j;import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;/*** 生成随机短信验证码*/
@Slf4j
public class RandomUtils {private static final Random random = new Random();private static final DecimalFormat fourdf = new DecimalFormat("0000");private static final DecimalFormat sixdf = new DecimalFormat("000000");/*** 获取四位随机验证码*/public static String getFourBitRandom() {return fourdf.format(random.nextInt(10000));}/*** 获取六位随机验证码*/public static String getSixBitRandom() {return sixdf.format(random.nextInt(1000000));}/*** 给定数组,抽取n个数据*/public static ArrayList getRandom(List list, int n) {Random random = new Random();HashMap<Object, Object> hashMap = new HashMap<Object, Object>();// 生成随机数字并存入HashMapfor (int i = 0; i < list.size(); i++) {int number = random.nextInt(100) + 1;hashMap.put(number, i);}// 从HashMap导入数组Object[] robjs = hashMap.values().toArray();ArrayList r = new ArrayList();// 遍历数组并打印数据for (int i = 0; i < n; i++) {r.add(list.get((int) robjs[i]));log.info(list.get((int) robjs[i]) + "\t");}log.info("\n");return r;}}

然后通过该工具类生成验证码,然后就可以调用上面的短信发送模板,把验证码和发送给的手机号传过去;

短信发送成功后,将验证码存入redis中,key为该验证码发送到的手机号,还需要设置一个超时时间,比如5分钟:

redisTemplate.opsForValue().set("sms:phone:" + phone, verifyCode, 5, TimeUnit.MINUTES);

设置到redis目的就是为了防止用户短时间内多次调用短信发送接口,分分钟让你破产;

设置了redis,那么每次调用短信发送接口前都需要通过发送用户的手机号判断一下redis中是否有该用户的发送记录,如果有,就不要在调用短信发送逻辑;

这就是大致流程了,当然实际情况肯定比这个复杂,这只是一个大致思路;

大致接口实现如下:

@GetMapping("/{phone}")
public BaseResponse<String> sendMessage(@PathVariable String phone) {if (StringUtils.isAnyBlank(phone)) {throw new BusinessException(StatusCode.NULL_ERROR, "手机号为空");}// 从redis中查看有没有该手机号的验证码String verifyCode = (String) redisTemplate.opsForValue().get("sms:phone:" + phone);if (!StringUtils.isAnyBlank(verifyCode)) {return ResultUtils.success("验证码已发送");}// 如果redis没有该手机号验证码,则获取验证码并发送短信verifyCode = RandomUtils.getSixBitRandom(); // 获取六位验证码Map<String, Object> messageMap = new HashMap<>(); // 短信内容{"code":{验证码}}messageMap.put("code", verifyCode);Boolean isSend = smsService.sendMessage(messageMap, phone); // 调用短信发送模板if (isSend) { // 如果发送成功,则将对应手机号验证码存入redis中,设置5分钟内有效redisTemplate.opsForValue().set("sms:phone:" + phone, verifyCode, 5, TimeUnit.MINUTES);} else {throw new BusinessException(StatusCode.SYSTEM_ERROR, "短信发送失败");}return ResultUtils.success("短信发送成功");
}

总结

短信发送的学习是一个很简单的调用api接口的案例,阿里云也有很多其他的服务,可以尝试调用它的接口实现更多好玩的功能;


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

相关文章

实战总结:邮箱发送验证码

java邮箱发送验证码 目前项目中需要同时支持短信和邮箱验证&#xff0c;短信用的是腾讯云就不多说了&#xff0c;在此分享一下邮箱验证码发送。 首先&#xff0c;作为发送邮箱&#xff0c;需要开启POP3/SMTP/IMAP&#xff0c;登录邮箱–设置–账户–开启POP3/SMTP/IMAP&#x…

SpringBoot整合邮箱发送验证码

1、以QQ邮箱为例&#xff0c;点开设置开启POP3/SMTP服务 2、创建一个springboot项目 1&#xff09;引入maven依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependen…

Vue3发送验证码-防止页面刷新-发送验证码状态改变

效果: 1.页面DOM <div v-show"state.sendAuthCode" click"getCode">发送验证码</div> <div v-show"!state.sendAuthCode" ><span class"auth_text_blue">{{state.second}} </span>s</div>2. 业务…

C#实现手机发送验证码

目录 具体实现——封装一个类里&#xff0c;U层直接调用 配置文件的内容如下 验证手机号的正则表达式 首先先需要注册第三方网站&#xff0c;给大家推荐一个网站互亿无线&#xff0c;注册了之后每个用户可以免费发送50条短信。 下面以C#实现手机发送验证码为例。基本思路是本地…

uniapp 发送验证码倒计时

实现原理&#xff0c;点击发送验证码按钮&#xff0c;开始倒计时效果 准备工作 &#xff1a;在data中定义变量 ​​​​​​​ 点击事件 let timerId setInterval(() > {this.countDown--;this.sendText this.countDown "秒后重试";if (this.countDown < 0)…

html给手机号发送验证码,js如何实现手机发送验证码功能

js如何实现手机发送验证码功能 发布时间:2021-06-21 12:24:46 来源:亿速云 阅读:82 作者:小新 这篇文章将为大家详细讲解有关js如何实现手机发送验证码功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 效果图: 代码如下:html&g…

Python发送验证码短信

Python发送验证码短信 前提条件相关介绍实验环境发送验证码短信账户注册查看用户名查看密码主要步骤代码实现输出结果 前提条件 熟悉Python基本语法 相关介绍 Python是一种跨平台的计算机程序设计语言。是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被…

html如何发送验证码到手机,页面效果,给手机发送验证码

html>定时发送验证码 var wait 5; function send(o) { if(wait5){ //向服务器发送请求&#xff0c;给手机发送验证码 // $.post("/simple/user/sendCode/mobile", // { // "mobile" : "${user.mobile}", // "number" : 2 // }, …

实现发送验证码功能

// 需求一&#xff1a;发送验证码// 用户点击之后&#xff0c;显示05秒后重新获取// 时间到了&#xff0c;自动改为重新获取let code document.querySelector(.code)code.addEventListener(click, function () {this.innerHTML 05秒后重新获取let mark 5let time setInterva…

发送验证码倒计时

点击发送验证码按钮的时候 会调用ajax请求发送验证码 但是 如果没有设置倒计时 如果一直重复点击按钮的话 会一直请求发送验证码 所以我们要设置一个验证码倒计时 <input id"sendCodeId" type"button" class"btn btn-danger" click"sen…

微信小程序发送验证码

记录一下&#xff0c;小程序发送验证码的小案例。废话不多说&#xff0c;直接撸代码。。。 1、效果图如下 wxml: <view classheader> <input typenumber placeholder请输入手机号 bindinputmInput></input> </view> <view classnav> <v…

Javascript发送验证码

一、请求原理 由于现在网站的都有手机登陆或注册&#xff0c;向制定地址发送一个post活get请求&#xff0c;那么我们利用这一思路&#xff0c;就可以在本地上利用Ajax来模拟网站的登陆注册操作&#xff0c;从而实现向发送验证码。 二、获取第三方网站验证码接口 随便找一个带验…

简析发送手机验证码原理

文章目录 发放手机验证码手机验证码校验小结 在一般互联网网站&#xff08;如淘宝、京东等&#xff09;注册账号或者找回密码时通常让用户进行手机号码进行 发送验证码验证&#xff0c;这种方式能有效的保证帐号安全&#xff0c;下面来解析一下它的原理。 整体流程如下图如示&…

App接口测试总结

使用工具 Fiddler、Jmeter 测试步骤&#xff1a; 1. 确认接口 从开发人员那里获取接口文档&#xff0c;接口文档应该包括完整的功能接口、接口请求方式、接口请求URL、接口请求参数、接口返回参数。 如果当前项目没有接口文档&#xff0c;则可以使用fiddler对APP进行抓包确认…

Xilinx DDR3 —— MIG IP核的原理(APP接口)

DDR3 SDRAM&#xff08;Double-Data-Rate Three Synchronous Dynamic Random Access Memory&#xff09;是 DDR SDRAM的第三代产品&#xff0c;DDR SDRAM 的最大特点是双沿触发&#xff0c;即在时钟的上升沿和下降沿都能进行数据采集和发送&#xff0c;同样的工作时钟&#xff…

APP接口设计规范

APP接口设计规范 效率安全版本兼容性面向对象设计数据格式Json服务端的异常处理https协议 1.效率 APP对服务器端要求是比较严格的&#xff0c;在移动端有限的带宽条件下&#xff0c;要求接口响应速度要快&#xff0c;所有在开发过程中尽量选择效率高的框架&#xff0c;对数据…

TP6+JWT开发APP接口

1. 开发环境 PHP框架: ThinkPHP6操作系统: MacOsWeb服务器: Nginx 2. APP接口 2.1. 简介 客户端与服务端进行数据交互的通道, 大部分APP接口都是通过HTTP协议通信的 2.2. HTTP通信的三要素 URL 通信地址Method 通信方式(GET|POST|PUT|DELETE)Params 通信的内容 2.3 APP接…

快速开发一个混合APP(Hybrid APP)

混合开发APP&#xff08;Hybrid APP&#xff09;简单说就是将原生功能封装成JS接口&#xff0c;前端通过调用接口实现功能。前端使用html来开发APP&#xff0c;可以实现自动更新&#xff0c;一套代码同时生成Android和iOS两端安装包&#xff0c;开发速度快&#xff0c;用户体验…

Hybrid App开发 四大主流平台

Hybrid App在过去的两年中已经成为移动界的核心话题&#xff0c;但是作为一名Web开发者来说要如何站在移动互联网的浪潮之巅呢&#xff1f;是选择学习原生开发&#xff0c;研究Java、 Object-C、C#等语言&#xff0c;还是选择继续使用网页开发&#xff0c;容忍HTML5功能的局限性…

whatsapp协议api接口

测试demo&#xff1a;http://39.109.122.117:8081/login Whatsappapi 一、登录注册 登录 发送验证码 效验短信验证码 查询是否封号 获取版本号 查询是否封号&#xff08;商业版&#xff09; 发送验证码&#xff08;商业版&#xff09; 效验短信验证码&#xff08;商业…