SpringBoot 发送短信验证码
阿里云账户要有一点钱
1.创建用户信息
1.申请一个阿里云的账号
2. 打开控制台 ,点击个人头像,找到AccessKey 管理,点击打开
3.点击进入之后会看到这个,一定要保管好这个accesskey
不要泄露,选择使用子用户的
![](https://img.haomeiwen.com/i21839209/80901af3edce57b0.png)
4.新建一个用户组
![](https://img.haomeiwen.com/i21839209/f75247b10ad279d9.png)
点击创建用户组,然后根据提示填写即可
![](https://img.haomeiwen.com/i21839209/cbb9eb4df1a23f25.png)
创建完成之后点击新建的用户组进去
![](https://img.haomeiwen.com/i21839209/eb29f0276ad8f245.png)
5. 给用户组添加权限
找到权限管理,添加权限
![](https://img.haomeiwen.com/i21839209/338b3f2752b9bcf2.png)
输入SMS点击管理短信服务,跳到有边,点击确定即可
6.创建用户
![](https://img.haomeiwen.com/i21839209/422a04482ac08a5a.png)
![](https://img.haomeiwen.com/i21839209/49a183f69869b009.png)
根据提示填写就可以
编程访问一定要勾选上,因为我们是通过代码操作的
点击确定即可
创建用户之后点击进入会看到这个用户的所有信息
![](https://img.haomeiwen.com/i21839209/3708c95505d4d337.png)
这里的accesskeyid accessSecret
一定要妥善保管,因为一旦创建了用户之后就看不到密码了,如果泄露,要即使禁用或者删除
然后点击加入的组,将刚才创建好的用户组添加进去即可
该子用户会继承用户组的权限
2. 开通短信服务
1. 在控制台首页直接搜索短信服务
即可 ,点击进入
2.第一次进入他会让开通短信服务,直接同意开通即可,可以自己查看计费规则及其他的信息
3.添加短信的模板
![](https://img.haomeiwen.com/i21839209/7d4a6a1a041c3662.png)
![](https://img.haomeiwen.com/i21839209/b09ac533304873eb.png)
根据提示填写就可以,一定不要乱写,填写正当理由,审核未通过接着审核就行
${code}
这个一定要有,不要修改他,要通过这个将验证码的变量传进去
4. 添加签名
![](https://img.haomeiwen.com/i21839209/cf8437e8165ab142.png)
第一次进去的时候验证码是可以选用的,选用验证码就行,因为我申请过了,所以不能在选择了
一定要等审核通过了才可以使用
5. 找到帮助文档 打开找到SDK参考选择java的,正常公司的开发都是使用SDK方式的,这里也是使用这个方式
这个帮助文档有api参考,可以自行了解
![](https://img.haomeiwen.com/i21839209/3dc1a15c8423ce01.png)
进入官方的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
现在看下是不是已经发送成功了!
网友评论