一,准备工作
1.首先点击注册阿里云账号
然后接下来讲解一下怎么接入短信吧
2.购买阿里云短信
点击:阿里云短信
一般测试开发用,选择:5000条即可
二、接入阿里云短信
1. 登录阿里云,点击头像看到获取AccessKey
2. 使用子账号可以自己设置:
3. 创建用户组
4. 配置用户组权限(sms)
5. 创建用户
创建了用户将用户添加到用户组
6. 得到用户的AccessKey(id,密码)
一定要把这个账号保存下来!!!!之后各种微服务都要用到这个账号!!!!
二、开通阿里云短信服务
1、阿里云搜索短信服务,进入短信服务控制台,开通短信服务
短信发送频率:
2、找到帮助文档
三、添加短信模板
短信的具体内容
等待审核通过(需要正当理由)
四、添加签名(也就是短信开头那个)
五、编写测试代码
此时已经拿到授权码,短信服务,短信模板,短信签名
控制台的快速学习中有默认的demo:
安装使用SDK
六、编写可复用的微服务接口,实现验证码的发送
1. 新建一个springboot的项目,导入依赖
com.aliyun
aliyun-java-sdk-core
4.0.3
com.alibaba
fastjson
1.2.75
org.springframework.boot
spring-boot-starter-data-redis
2. 测试短信服务
// 连接阿里云,有三个参数
// 1.地区 一般不变 2.accsessKey账号替换 3.账号的密码! 自己去阿里云找自己的账号密码
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "", "");
//构建一个客户端
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 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 code);
}
3. 封装SendSms的实现类
@Service
public class SendSmsImpl implements SendSms {
@Override
public boolean send(String phoneNum, String templateCode, Map code) {
// 连接阿里云,有三个参数
// 1.地区 一般不变 2.accsessKey账号替换 3.账号的密码! 自己去阿里云找自己的账号密码
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "", "密码");
//构建一个客户端
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 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 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 回车查看返回字符串,此时手机也收到了一条短信验证码