阿里云短信服务
比如验证码
一、了解阿里云用户权限操作
![image-20210826232918130](https://jqblog-img.oss-cn-hangzhou.aliyuncs.com/picgo/20210826232918.png)
1. 登录阿里云,点击头像看到获取AccessKey
![image-20210826233540342](https://jqblog-img.oss-cn-hangzhou.aliyuncs.com/picgo/20210826233540.png)
2. 使用子账号可以自己设置:
![](https://jqblog-img.oss-cn-hangzhou.aliyuncs.com/picgo/20210826233635.png)
3. 创建用户组
4. 配置用户组权限(sms)
![image-20210826234414734](https://jqblog-img.oss-cn-hangzhou.aliyuncs.com/picgo/20210827004629.png)
5. 创建用户
![image-20210826234711938](https://jqblog-img.oss-cn-hangzhou.aliyuncs.com/picgo/20210827004641.png)
创建了用户将用户添加到用户组
6. 得到用户的AccessKey(id,密码)
一定要把这个账号保存下来!!!!之后各种微服务都要用到这个账号!!!!
![image-20210826235943566](https://jqblog-img.oss-cn-hangzhou.aliyuncs.com/picgo/20210826235943.png)
二、开通阿里云短信服务
1、阿里云搜索短信服务,进入短信服务控制台,开通短信服务
![image-20210827000505504](https://jqblog-img.oss-cn-hangzhou.aliyuncs.com/picgo/20210827000505.png)
短信发送频率:
![image-20210827001119226](https://jqblog-img.oss-cn-hangzhou.aliyuncs.com/picgo/20210827001119.png)
2、找到帮助文档
![](https://jqblog-img.oss-cn-hangzhou.aliyuncs.com/picgo/20210827002949.png)
三、添加短信模板
短信的具体内容
等待审核通过(需要正当理由)
四、添加签名(也就是短信开头那个)
五、编写测试代码
此时已经拿到授权码,短信服务,短信模板,短信签名
控制台的快速学习中有默认的demo:
![image-20210827003720723](https://jqblog-img.oss-cn-hangzhou.aliyuncs.com/picgo/20210827003720.png)
安装使用SDK
六、编写可复用的微服务接口,实现验证码的发送
1. 新建一个springboot的项目,导入依赖
<!--导入依赖-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.0.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. 测试短信服务
// 连接阿里云,有三个参数
// 1.地区 一般不变 2.accsessKey账号替换 3.账号的密码! 自己去阿里云找自己的账号密码
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
//构建一个客户端
IAcsClient client = new DefaultAcsClient(profile);
//构建一个请求!
CommonRequest request = new CommonRequest();
request.setMethod(MethodType.POST);
request.setDomain("dysmsapi.aliyuncs.com"); //不要动
request.setVersion("2017-05-25"); //不要动
request.setAction("sendSms"); //自定义
//自定义的参数(手机号,验证码,签名,模板)
// request.putQueryParameter("RegionId","cn-hangzhou");
request.putQueryParameter("phoneNumbers", "手机号"); //这里的手机号是接受短信的对象
request.putQueryParameter("signName", "阿里云对应的签名名称写在这里");
request.putQueryParameter("TemplateCode", "阿里云模板对应的Code写在这里");
//构建一个短信验证码
HashMap<String, Object> map = new HashMap<>();
map.put("code", 2233);
request.putQueryParameter("TemplateParam", JSON.toJSONString(map));
try {
CommonResponse response = client.getCommonResponse(request); //发送
System.out.println(response.getData()); //响应
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
3. 真实业务
1. 创建业务文件夹
2. 创建接口SendSms
public interface SendSms {
//要传进来一个手机号,模板号,还有随机生成的验证码
public boolean send(String phoneNum, String templateCode, Map<String, Object> code);
}
3. 封装SendSms的实现类
@Service
public class SendSmsImpl implements SendSms {
@Override
public boolean send(String phoneNum, String templateCode, Map<String, Object> code) {
// 连接阿里云,有三个参数
// 1.地区 一般不变 2.accsessKey账号替换 3.账号的密码! 自己去阿里云找自己的账号密码
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "密码");
//构建一个客户端
IAcsClient client = new DefaultAcsClient(profile);
//构建一个请求!
CommonRequest request = new CommonRequest();
request.setMethod(MethodType.POST);
request.setDomain("dysmsapi.aliyuncs.com"); //不要动
request.setVersion("2017-05-25"); //不要动
request.setAction("sendSms"); //自定义
//自定义的参数(手机号,验证码,签名,模板)
// request.putQueryParameter("RegionId","cn-hangzhou");
request.putQueryParameter("phoneNumbers", phoneNum); //这里的手机号是接受短信的对象
request.putQueryParameter("signName", "阿里云对应的签名名称写在这里");
request.putQueryParameter("TemplateCode", templateCode);
request.putQueryParameter("TemplateParam", JSON.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;
}
}
4. 接口:模拟真实测试:springboot集成redis
在application.properties配置redis后,打开本地redis的服务
srever.port=9000
spring.redis.host=127.0.0.1
spring.redis.port=6379
接口:
package com.sms.controller;
import com.sms.service.SendSms;
import io.netty.util.internal.StringUtil;
import org.apache.catalina.security.SecurityUtil;
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 javax.swing.text.html.HTMLDocument;
import java.util.HashMap;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/**
* @author 蒋二妹
* @DATE 2021/9/1 - 22:06
*/
@RestController
@CrossOrigin //跨域支持
public class SmsApiController {
@Autowired
private SendSms sendSms;
@Autowired
private RedisTemplate<String, String> redisTemplate;
@GetMapping("/send/{phone}")
public String code(@PathVariable("phone") String phone){
//调用发送方法(模拟真实测试:springboot集成redis)
//通过手机号获取redis中是否存储过验证码,如果还有则没有过期,没有就重新生成存储进redis
String code = redisTemplate.opsForValue().get(phone);
if (StringUtils.isEmpty(code)) {
return phone + ":" + code + "已存在,还没有过期";
}
//重新生成验证码并存储到redis
code = UUID.randomUUID().toString().substring(0, 4);
HashMap<String, Object> param = new HashMap<>();
param.put("code", code);
boolean isSend = sendSms.send(phone, "需要使用的模板code", param);
if (isSend) {
redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.SECONDS);
return phone + ":" + code + "发送成功!";
}else {
return "发送失败!";
}
}
}
4. 启动启动类测试即可
localhost:9000/13511299999 回车查看返回字符串,此时手机也收到了一条短信验证码