SpringBoot 发送短信验证码
阿里云的账号里要有一定的钱
1.创建用户信息
1.申请一个阿里云的账号
2. 打开控制台 ,点击个人头像,找到AccessKey 管理,点击打开
3.点击进入之后会看到这个,一定要保管好这个accesskey
不要泄露,选择使用子用户的
4.新建一个用户组
点击创建用户组,然后根据提示填写即可
创建完成之后点击新建的用户组进去
5. 给用户组添加权限
找到权限管理,添加权限
输入SMS点击管理短信服务,跳到有边,点击确定即可
6.创建用户
根据提示填写就可以
编程访问一定要勾选上,因为我们是通过代码操作的
点击确定即可
创建用户之后点击进入会看到这个用户的所有信息
这里的accesskeyid accessSecret 一定要妥善保管,因为一旦创建了用户之后就看不到密码了,如果泄露,要即使禁用或者删除
然后点击加入的组,将刚才创建好的用户组添加进去即可
该子用户会继承用户组的权限
2. 开通短信服务
1. 在控制台首页直接搜索短信服务
即可 ,点击进入
2.第一次进入他会让开通短信服务,直接同意开通即可,可以自己查看计费规则及其他的信息
3.添加短信的模板
根据提示填写就可以,一定不要乱写,填写正当理由,审核未通过接着审核就行
${code}
这个一定要有,不要修改他,要通过这个将验证码的变量传进去
4. 添加签名
第一次进去的时候验证码是可以选用的,选用验证码就行,因为我申请过了,所以不能在选择了
一定要等审核通过了才可以使用
5. 找到帮助文档 打开找到SDK参考选择java的,正常公司的开发都是使用SDK方式的,这里也是使用这个方式
这个帮助文档有api参考,可以自行了解
进入官方的demo中
3.代码阶段
pom.xml 在pom.xml中导入以下依赖
<!--导入依赖sms 发送短信的核心依赖-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.3</version>
</dependency>
<!--FastJson 对于数据的处理的依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
<!--redis 因为短信验证码都是几分钟后无法使用,所以放在redis中-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
先测试一下能不能使用,直接将官方的demo代码复制放到测试类中测试一下
/**
* <accessKeyId> 你自己的 accessKeyId 相当于账号
* accessSecret 在创建用户时的 accessSecret 相当于密码
*/
@Test
void contextLoads() {
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
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", "刚才定义好的签名名称");
//模板code
request.putQueryParameter("TemplateCode", "自定义短信模板的模板CODE编码");
//构建一个短信验证码
Map<String,Object> map = new HashMap<>();
map.put("code","1234");
//将定义好的验证码放入进去
//短信验证码
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();
}
}
在导包的时候一定不要导错了,导阿里云的,有些包是重名的
测试发送短信
{"Message":"OK","RequestId":"D12E6D53-3A2B-4342-87CE-8B78C9A5A8FC","BizId":"174403396982142436^0","Code":"OK"}
在控制台看到这句话就证明短信发送成功了
是不是已经收到短信了!
发送短信的正式代码
controller
package com.mango.controller;
import com.mango.Service.SendSmsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
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.UUID;
import java.util.concurrent.TimeUnit;
/**
* @Author:
* @Date: 2020/8/9 22:11
* @CrossOrigin//跨域支持
*/
@RestController
@CrossOrigin
public class SendSmsApiController {
@Autowired
private SendSmsService sendSmsService;
/**
* 使用redis的模板
*/
@Autowired
private RedisTemplate<String,String> redisTemplate;
@GetMapping("/send/{phone}")
public String sendSms(@PathVariable("phone")String phone){
//调用发送短信的方法(使用redis)
//获取redis中的手机号
String code = redisTemplate.opsForValue().get(phone);
//判断当前的code的不为空
if(!StringUtils.isEmpty(code)){
return phone+":"+code +"已存在,还没有过期";
}
//否则就是没有验证码,生成验证码并且存储到redis中,设置他的过期时间
//生成随机验证码
code = UUID.randomUUID().toString().substring(0, 4);
HashMap<String, Object> map = new HashMap<>();
map.put("code",code);
//发送短信
boolean isSend = sendSmsService.sendSms(phone, "自定义短信模板的模板CODE编码", map);
if(isSend){
//如果短信发送成功就放入到redis中,设置5分钟之后过期
redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
return phone+":"+code +"发送成功";
}else {
return "发送成功";
}
}
}
service
package com.mango.Service;
import java.util.Map;
/**
* @Author:
* @Date: 2020/8/9 22:12
*/
public interface SendSmsService {
/**
* @param phoneNum 发送的手机号
* @param TemplateCode 短信模板的code
* @param code 验证码
* @return
*/
public boolean sendSms(String phoneNum, String TemplateCode , Map<String,Object> code);
}
servcieImpl
package com.mango.Service.impl;
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.mango.Service.SendSmsService;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* @Author:
* @Date: 2020/8/9 22:12
*/
@Service
public class SendSmsImpl implements SendSmsService {
/**
* @param phoneNum 发送的手机号
* @param TemplateCode 短信模板的code
* @param code 验证码
* @return
*/
@Override
public boolean sendSms(String phoneNum, String TemplateCode, Map<String, Object> code) {
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
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", "刚才定义好的签名名称");
//模板code
request.putQueryParameter("TemplateCode", TemplateCode);
//短信验证码
request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));
try {
CommonResponse response = client.getCommonResponse(request);
//这个是他自带的判断他发送的是否成功,成功就直接返回
return response.getHttpResponse().isSuccess();
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
return false;
}
}
application.yml
server:
port: 8090
# redis 我这里使用的是本地的redis
spring:
redis:
host: 127.0.0.1
port: 6379
现在看下是不是已经发送成功了!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。