学习目标:

  • 阿里云短信服务

准备工作:

  1. 注册阿里云账户
  2. 开通短信服务
  3. 申请签名和模板
  4. 拿到AccessKey

大概说一下测试和申请流程,输入https://www.aliyun.com/进入官网,然后注册账号,直接在搜索框输入短信服务就能找到,进入控制台,找到国内消息,申请签名和模板,


AccessKey:在右上角头像哪里

申请大概需要几个小时,个人用户一般很难通过,我个人申请被驳回很多次,最后用域名备案才通过

开始编写代码:

第一步先导入依赖

   <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.3.3</version></dependency>

第二步:在项目yml文件中配置阿里云短信的秘钥,秘钥在上面AccessKey管理可以拿到

aliyun:sms:regionId: defaultaccessKeyId: xxxxxxxxxxxxxxxxxxxxxxxsecret: xxxxxxxxxxxxxxxxxxxxxxx

第三步:去读取配置文件的参数秘钥,InitializingBean接口为bean提供了属性初始化后的处理方法

@Component
public class ConstantPropertiesUtils implements InitializingBean {@Value("${aliyun.sms.regionId}")private String regionId;@Value("${aliyun.sms.accessKeyId}")private String accessKeyId;@Value("${aliyun.sms.secret}")private String secret;public static String REGION_Id;public static String ACCESS_KEY_ID;public static String SECRECT;@Overridepublic void afterPropertiesSet() throws Exception {REGION_Id=regionId;ACCESS_KEY_ID=accessKeyId;SECRECT=secret;}
}

什么是验证码呢,就是后台随机生成的一段数字,为了方便就写了一个工具类获取验证码

package com.example.shiro.sys.utlis.smsSend;import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;/*** @author szm* @create 2022-03-31 18:31*/
public class RandomUtil {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个数据** @param list* @param n* @return*/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]));System.out.print(list.get((int) robjs[i]) + "\t");}System.out.print("\n");return r;}
}

准备工作都写完了,在编写controller来获取验证码,我这里还整合redis缓存,方便后面做验证码的有效期和校验,不整合redis也不影响发送验证码

/*** 发送手机验证码*/@GetMapping("/getCode/{phone}")public R getCode(@PathVariable String phone){//先从redis获取验证码,如果获取到就返回ok//key 手机号 value 验证码String code =(String) redisUtil.get(phone);if(!StringUtils.isEmpty(code)){return R.ok();}//如果redis获取不到,生成验证码,通过整合短信服务进行发送code = RandomUtil.getFourBitRandom();//调用service方法,通过整合短信服务进行发送boolean isSend = msgSendService.send(phone,code);//生成验证码放到redis里面,设置有效时间if(isSend){redisUtil.set(phone,code, 120);return R.ok();}else{return R.error("发送短信失败!!!");}}

直接看业务层具体的实现

 @Overridepublic boolean send(String phone, String code) {//判断手机号是否为空if(StringUtils.isEmpty(phone)){return false;}//整合阿里云短信服务//设置相关参数DefaultProfile profile = DefaultProfile.getProfile(ConstantPropertiesUtils.REGION_Id,ConstantPropertiesUtils.ACCESS_KEY_ID,ConstantPropertiesUtils.SECRECT);IAcsClient client = new DefaultAcsClient(profile);CommonRequest request = new CommonRequest();//request.setProtocol(ProtocolType.HTTPS);//这些参数都是写死的 不要改变request.setMethod(MethodType.POST);request.setDomain("dysmsapi.aliyuncs.com");request.setVersion("2017-05-25");request.setAction("SendSms");//手机号request.putQueryParameter("PhoneNumbers", phone);//签名名称request.putQueryParameter("SignName", "这里写你开通短信的签名");//模板coderequest.putQueryParameter("TemplateCode", "模板code");//验证码  使用json格式   {"code":"123456"}Map<String,Object> param = new HashMap();param.put("code",code);request.putQueryParameter("TemplateParam", JSONObject.toJSONString(param));//调用方法进行短信发送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;}

最后看能不能收到短信验证码,我配置了swagger-ui进行测试

成功接收到,实现也很简单,代码复制就能使用

springboot发送短信验证码相关推荐

  1. SpringBoot发送短信验证码实现

    前言 短信验证码是通过发送验证码到手机的一种有效的验证码系统.主要用于验证用户手机的合法性及敏感操作的身份验证.常见的使用场景有:登录注册.信息修改.异常登录.找回密码等操作. 此篇文章记录后台框架S ...

  2. SpringBoot+阿里云短信服务实现发送短信验证码功能

    目录 一.登陆阿里云,开通短信服务(收费的,需要充值,1元能发20条左右),并获取AccessKeyId和AccessKeySecret 二.创建短信模板与签名 三.引入依赖 四.准备工作已完成,编码 ...

  3. SpringBoot 实现手机发送短信验证码

    手机发送短信 内容 一.手机发送短信 1. 前端界面代码 2. UserInfoController 控制器 3. application.properties 配置类文件 4. 具体实现 总结 内容 ...

  4. springboot整合redis实现发送短信验证码

    我用的短信平台是阿里云的,需要付费购买服务,购买地址:https://common-buy.aliyun.com/?spm=5176.8195934.907839.sms6.312c4183mzE9Y ...

  5. java + maven 实现发送短信验证码功能

    如何使用java + maven的项目环境发送短信验证码,本文使用的是榛子云短信 的接口. 1. 安装sdk 下载地址: http://smsow.zhenzikj.com/doc/sdk.html ...

  6. php榛子云短信验证,java + maven +榛子云短信 实现发送短信验证码功能

    如何使用java + maven的项目环境发送短信验证码,本文使用的是榛子云短信的接口. 下载下来是jar文件,需要将jar发布到本地的maven仓库中, 在cmd环境下输入: mvn install ...

  7. php实现短信找回密码,thinkphp5怎么调用云片接口实现发送短信验证码找回密码功能...

    thinkphp5怎么调用云片接口实现发送短信验证码找回密码功能 发布时间:2020-12-11 12:33:42 来源:亿速云 阅读:60 作者:小新 小编给大家分享一下thinkphp5怎么调用云 ...

  8. html5实现短信验证修改密码,thinkphp5如何调用云片接口实现发送短信验证码找回密码功能...

    下面由thinkphp框架教程栏目给大家介绍thinkphp5如何调用云片接口实现发送短信验证码找回密码功能,希望对需要的朋友有所帮助! 思路: 1.用户输入手机号,请求获取短信验证码. 2.thin ...

  9. JAVA实现利用第三方平台发送短信验证码

    前段时间自己做的一个小项目中,涉及到用短信验证码登录.注册的问题,之前没涉及过这一块,看了别人的博客其实也是似懂非懂的,现在就将自己做的利用第三方短信平台来发送验证码这个功能记下来. 本文以注册为例, ...

  10. JAVA利用第三方平台发送短信验证码

    本文以注册为例,在SpringMVC+Spring+Mybatis框架的基础上完成该短信验证码功能. 发送短信验证码的原理是:随机生成一个6位数字,将该6位数字保存到session当中,客户端通过se ...

最新文章

  1. leetcode算法题--合并区间
  2. 107条javascript常用小技巧
  3. 掸邦的首府---东枝【图文】
  4. QCon旧金山演讲总结:阿里无线技术架构演进
  5. 【超直白】算法:斐波那契数列
  6. Linux命令行工具使用小贴士及技巧(四)
  7. python循环小甲鱼教程_python之 小甲鱼教程 Easygui 篇
  8. C++ Maps 映射
  9. C#事件-经典小例子
  10. 树莓派raspberrypi系统安装docker以及编译nginx和php镜像
  11. tracepro杂散光分析例子_第二期青年矿床学家网络论坛(刘琰碳酸岩杂岩体型稀土矿;王小林CO2成矿效应)...
  12. MATLAB二次规划和整数规划
  13. 精确波段 抄底逃顶指标 通达信/东方财富 副图 源码
  14. 微信公众号 菜单 { “errcode“ 47001, “errmsg“ “data format error rid 61b36b ...“}
  15. SVM(支持向量机)原理
  16. 恩典时代集团与深圳植慧科技产业签署合作备忘录
  17. javascript提取顶级域名 js获取一级域名
  18. 知我者谓我心忧,不知者谓我何求!
  19. 多模态AI浪潮来袭,或造福数亿视障人群
  20. RMB小写转换成大写

热门文章

  1. 浅显易懂的经济学常识
  2. matlab解简单数学规划(线性,非线性,整数规划)
  3. CFS三层内网环境 渗透流程
  4. 2022年六一儿童节
  5. Matlab中loglog函数使用
  6. P8842 [传智杯 #4 初赛] 小卡与质数2 题解
  7. STM32个人笔记--GPIO框图
  8. better-scroll的使用以及常见的api总结
  9. CloseHandle(),TerminateThread(),ExitThread()的区别
  10. RouterOS如何实现多线路带宽叠加功能