springboot实现短信验证码的发送
我使用的是阿里云短信服务
代码前的准备
1. 申请阿里云的短信服务

2. 添加签名,这里需要等待审核通过

3. 在模板管理设置自己的短信模板

下面添加模板,选择验证码,模板内容可以直接使用输入框内的示例,点击F12,通过Search Element箭头就可以找到textarea标签的内容
示例:您的验证码为:${code},该验证码 5 分钟内有效,请勿泄漏于他人。
4.点击自己右上角的头像,进入Access Key管理

5. 它会跳出一个选项,这里建议使用子用户AccessKey,避免直接使用最高权限的账户,就像数据库那样,不可以直接把最高权限程序猿吧.
6.首先创建一个用户组


6.接着在用户组里面添加成员
强调一下,这里一定要把编程访问勾选上,接着再为该用户授予权限,

创建后,它会为你分配一个AccessKeyID和AccessKey Secret,这里一定要把它们保存到本地,一旦关闭页面,这些东西都不会再显示.

这里授予管理短信服务的权限即可
代码实现
1.创建service层,serviceImpl层,controller层

service层代码
package com.wfszmg.demo.service;
import java.util.Map;
/**
* @author 无法手执玫瑰
* 2020/07/0022 13:19
*/
public interface SmsSend {
public boolean send(String phoneNum, String templateCode, Map<String,Object> code);
}
serviceImpl层代码
package com.wfszmg.demo.service.imlp;
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.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.wfszmg.demo.service.SmsSend;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* @author 无法手执玫瑰
* 2020/07/0022 13:21
*/
@Service
public class SmsSendImpl implements SmsSend {
@Override
public boolean send(String phoneNum, String templateCode, Map<String, Object> code) {
//连接阿里云
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "自己用户的AccessKeyId", "AccessKey Secret");
IAcsClient client = new DefaultAcsClient(profile);
//构建请求
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
//下面两个不能动
request.setSysDomain("dysmsapi.aliyuncs.com");
request.setSysVersion("2017-05-25");
request.setSysAction("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 (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
return false;
}
}
controller层
package com.wfszmg.demo.controller;
import com.wfszmg.demo.service.SmsSend;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
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.ResponseBody;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* @author 无法手执玫瑰
* 2020/07/0022 13:24
*/
@Controller
@CrossOrigin //跨域支持
public class smsController {
@Autowired
private SmsSend smsSend;
@GetMapping("/send/{phone}")
@ResponseBody
public String code(@PathVariable("phone") String phone){
String code = UUID.randomUUID().toString().substring(0,5);
Map<String,Object> map = new HashMap<>();
map.put("code",code);
boolean isSend = smsSend.send(phone,"自己短信模板的模板CODE(以SMS_开头的)",map);
System.out.println(phone);
if(isSend){
return "发送成功";
}else{
return "发送失败";
}
}
}
体验吧
对了,你还要往账户里面充点钱!
最后贴一下Test的代码吧,这样更把握整体的代码
package com.wfszmg.demo.utils;
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.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.HashMap;
import java.util.Map;
import static org.junit.Assert.*;
/**
* @author 无法手执玫瑰
* 2020/07/0022 10:33
*/
@SpringBootTest
public class SmsTest {
@Test
public void contextLoads(){
//连接阿里云
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "自己用户的AccessKeyId", "AccessKey Secret");
IAcsClient client = new DefaultAcsClient(profile);
//构建请求
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
//下面两个不能动
request.setSysDomain("dysmsapi.aliyuncs.com");
request.setSysVersion("2017-05-25");
request.setSysAction("SendSms");
//自定义参数(手机号,验证码,签名,模板)
request.putQueryParameter("PhoneNumbers", "电话号码");
request.putQueryParameter("SignName", "无法手执玫瑰");
request.putQueryParameter("TemplateCode", "自己短信模板的模板CODE(以SMS_开头的)");
//构建短信验证码
Map<String, Object> map = new HashMap<>();
map.put("code",123456);
request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));;
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
}
}
springboot实现短信验证码的发送的更多相关文章
- php 阿里云短信服务及阿里大鱼实现短信验证码的发送
一:使用阿里云的短信服务 ① 申请短信签名 ②申请短信模板 ③创建Access Key,获取AccessKeyId 与 AccessKeySecret.(为了安全起见,这里建议使用子用户的Access ...
- 用Laravel Sms实现 laravel短信验证码的发送
使用Laravel Sms这个扩展包实现短信验证码的发送,这里以阿里云的短信服务为例: 首先,要创建短信签名和短信模板,具体申请详情如下, 接下来,需要创建AccessKey,由于AccessKey是 ...
- spring boot:用redis+lua限制短信验证码的发送频率(spring boot 2.3.2)
一,为什么要限制短信验证码的发送频率? 1,短信验证码每条短信都有成本制约, 肯定不能被刷接口的乱发 而且接口被刷会影响到用户的体验, 影响服务端的正常访问, 所以既使有图形验证码等的保护, 我们仍然 ...
- Django商城项目笔记No.5用户部分-注册接口-短信验证码
Django商城项目笔记No.4用户部分-注册接口-短信验证码 短信验证码也保存在redis里(sms_code_15101234567) 在views中新增SMSCodeView类视图,并且写出步骤 ...
- 使用聚合数据API查询快递数据-短信验证码-企业核名
有位朋友让我给他新开的网站帮忙做几个小功能,如下: 输入快递公司.快递单号,查询出这个快件的所有动态(从哪里出发,到了哪里) 在注册.登录等场景下的手机验证码(要求有一定的防刷策略) 通过输入公司名的 ...
- thinkphp结合云之讯做短信验证码
thinkphp结合云之讯做短信验证码先去云之讯注册账号 网址http://www.ucpaas.com/ 注册云之讯平台账号,即可免费获得10元测试费用测试够用啦 解压附件到 ThinkPHP\Li ...
- SpringBoot + Spring Security 学习笔记(五)实现短信验证码+登录功能
在 Spring Security 中基于表单的认证模式,默认就是密码帐号登录认证,那么对于短信验证码+登录的方式,Spring Security 没有现成的接口可以使用,所以需要自己的封装一个类似的 ...
- php实现的IMEI限制的短信验证码发送类
php实现的IMEI限制的短信验证码发送类 <?php class Api_Sms{ const EXPIRE_SEC = 1800; // 过期时间间隔 const RESEND_SEC = ...
- 超实用的JavaScript代码段 Item4 --发送短信验证码
发送短信验证码 实现点击“发送验证码”按钮后,按钮依次显示为“59秒后重试”.“58秒后重试”…直至倒计时至0秒时再恢复显示为“发送验证码”.在倒计时期间按钮为禁用状态 . 第一步.获取按钮.绑定事件 ...
- springboot +spring security4 自定义手机号码+短信验证码登录
spring security 默认登录方式都是用户名+密码登录,项目中使用手机+ 短信验证码登录, 没办法,只能实现修改: 需要修改的地方: 1 .自定义 AuthenticationProvide ...
随机推荐
- RabbitMQ消息堆积问题?
原因: 有时可能因为消费者自身代码问题,导致没办法正常消费消息,那么就会导致消息队列中会堆积大量的消息: 或因为同一时间来了非常多的消息,消费者没办法及时消费,导致消息队列中堆积了大量消息. 解决办法 ...
- vue安装与卸载
一.安装最新版本 npm install -g @vue/cli 或 yarn global remove vue-cli 查看版本 vue --version 或 vue -V 二.vue-cli( ...
- LeetCode 删除数组中重复项 26 80
26(80) 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素只出现一次(使得出现次数超过两次的元素只出现两次 ) ,返回删除后数组的新长度.元素的 相对顺序 应该保 ...
- 微信小程序ECharts通过调用api接口实现图表的数据可视化
小程序ECharts使用接口调入数据 首先附上js文件链接:axios.js 提取码:AxIo 将此放到小程序目录下的utils文件夹下 在已经完成图表的js文件中完成以下修改: ①引用axios.j ...
- ROS2踩坑记录
在Windows10的WSL2中的Ubuntu22.04子系统中安装ros2 humble版本. 官方文档http://docs.ros.org/en/humble/Installation/Ubun ...
- api进阶Day2(低级流)文件流的输出流、读取流。向文件中写入文本数据、读取文件中的字符串、用lambda表达式创建文件过滤器。
文件流:输出流: package io; import java.io.FileNotFoundException; import java.io.FileOutputStream; import j ...
- Jmeter 接口自动化 对变量【登录密码】进行加密处理
在我们使用Jmeter测试的过程中,尤其是接口测试,有时候需要对参数进行MD5加密后再进行操作: Jmeter自带的就有MD5加密需要使用的到的jar(注意jmeter版本):commons-code ...
- MySQL 日期相关
NOW() 返回当前的日期和时间 CURDATE() 返回当前的日期 CURTIME() 返回当前的时间 DATE() 提取日期或日期/时间表达式的日期部分 EXTRACT() 返回日期/时间按的单独 ...
- (五).JavaScript的函数
1. 函数 1.1 函数基础简介 函数介绍 函数:具有特定功能的代码块 本质:一种对象数据类型 功能:1. 代码复用 2. 项目模块化 函数组成(两者必须同时存在): 1. 函数定义 2. 函数调用 ...
- CSS3之伸缩布局
一 主轴方向 在伸缩布局中, 默认伸缩项是从左至右的排版的 主轴的排版的方向默认就是row, 默认就是从左至右 1.默认情况下主轴是水平方向的, 但是也可以修改为垂直方向.只要看到flex-direc ...

