目录
前言:
今天通过学习B站狂神视频,知道了怎么利用阿里云服务器来发送验证短信,同时模拟实际业务将短信缓存到redis,在限制时间内不重发验证码短信,做完项目觉得挺快乐的,分享一下整个项目部署过程,不难,基本上有什么操作我都仔细罗列出来了,但是需要一些前提条件:阿里云服务器,java的学习基础,有需要的小伙伴可以去我的github上面参考代码,加油,同时也给狂神视频分享一波~支持支持!!!
-------------------------------------B站狂神阿里云短信业务-------------------------------------
准备条件
一台阿里云服务器;
java学习基础;
SpringBoot学习基础;(有这个更好,因为我个人是基于Spingboot部署的小demo,没有的话看了文章相信你也可以完成这个小项目的)
1、登录阿里云
点击头像选择AccessKey,AccessKey就是后面我们需要连接阿里云服务器的ID
确认使用子用户AccessKey:
2、添加用户组
(1)创建用户组,分配权限
(2)创建用户组注意细节:
3、给用户组添加权限
(1)点击新建的用户组
(2)添加权限:
(3)搜索以下三个权限,其中DysmsFullAccess就是短信验证服务:
(4)添加成功后显示
4、添加用户
(1)添加用户细节
(2)将用户组添加到用户组,获取对应权限
(3)选中用户组,确认添加
(4)关键:创建AccessKey
点击创建,我这里创建过所以是灰色的,同时阿里云会发送验证短信让你验证,验证完毕后会提示是否下载AccessKey.csv文件,一定要下载,就提示一次,上面可是有你的账号密码的,到时候代码就是要通过这个AccessKey ID和AccessKey Secret连接阿里云的。
(5)供大家参考的资费
小于十万一条 0.045
5、创建模板
搜索短信服务:
点进去后确认开通:
先给自己账户充钱! 完全不慌
点击国内消息,选择添加模板
模板内容:一般审核十几分钟,填写理由正当即可
重点模版CODE
记住这个模版CODE,这个就是我们代码块中使用到的模板TemplateCode参数对应的value
6、添加签名
尽量正当理由,不要用学习之类的理由。这是狂神说的,反正我没用学习的理由~嘿嘿.
重点签名名称
签名名称是等会代码中的“SignName”参数对应的value,等下代码我也会注释的~
准备工作做完了,就进入写代码阶段,这里略过创建代码过程,最基本的Springboot的项目带web依赖就行,web依赖不带也行!个人的往期Springboot学习文章也有介绍的~点这里去小小白菜供大猪的更多博客!
7、添加阿里云短信依赖
<!-- 阿里短信依赖-->
<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-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.3.3.RELEASE</version>
</dependency>
8、添加redis服务器地址
#设置redis服务器
redis:
host: 127.0.0.1 #redis的服务器地址
#password: weida #设置密码
jedis:
pool:
max-active: 8
max-wait: -1
max-idle: 500
min-idle: 0
lettuce:
shutdown-timeout: 30000
9、在service层下新建接口以及接口实现类
ISmsService:
public interface ISmsService {
/**
* 发送验证短信需求
* @param phone 发送手机号
* @param templateCode 发送模板代码
* @param map 模板中需要的代码块
* @return
*/
boolean sendSms(String phone,String templateCode,Map<String,Object> map);
/**
* 发送无代码短信需求
* @param phone 需要发送到的手机号码
* @param templateCode 发送的短信模板
* @return
*/
boolean sendSms(String phone,String templateCode);
}
SmsServiceImpl :
核心代码块就是这一部分,相关的私人信息已经屏蔽,AccessKey ID,AccessKey Secret就是前面我们csv文件保存的账号密码(可以这样理解),然后几个自定义参数:
PhoneNumbers:手机号码
SignName:签名
TemplateCode:模板代码
TemplateParam:模板参数
使用该代码只需要修改一下这些相关信息即可
@Service
public class SmsServiceImpl implements ISmsService {
@Override
public boolean sendSms(String phone,String templateCode,Map<String,Object> map) {
//连接阿里云
DefaultProfile profile =
DefaultProfile.getProfile("AccessKey ID",
"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", phone );
//签名
request.putQueryParameter("SignName", "Vinda的学习网站");
//模板
request.putQueryParameter("TemplateCode", templateCode);
//验证码
request.putQueryParameter("TemplateParam", JSON.toJSONString(map));
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
return true;
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
return false;
}
@Override
public boolean sendSms(String phone, String templateCode) {
//连接阿里云
DefaultProfile profile =
DefaultProfile.getProfile("AccessKey ID",
"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", phone );
//签名
request.putQueryParameter("SignName", "Vinda的学习网站");
//模板
request.putQueryParameter("TemplateCode", templateCode);
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
return true;
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
return false;
}
}
10、添加Controller类
记得打开 跨域支持:@CrossOrigin
@CrossOrigin //跨域支持
@RestController
public class SmsController {
@Autowired
ISmsService smsService;
@Autowired
SmsConfig smsConfig;
@Autowired
RedisUtils RedisUtils;
@GetMapping("/sendsms/{phone}")
public String sendCode(@PathVariable("phone")String phone){
//从redis缓存中拿取用户手机号码,在实际开发中应该加上手机号码和用户id作为唯一的key
String phone1 = (String) RedisUtils.get(phone);
//确认没有这个号码
if(StringUtils.isEmpty(phone1)){
//存入数据库
RedisUtils.set("phone",phone);
}
//查询是否在5分钟前发过该短信,验证码应该也是唯一的,加上用户ID
String code = (String) RedisUtils.get("code");
//如果没有这个验证码
if(StringUtils.isEmpty(code)){
//新建验证码:
code = UUID.randomUUID().toString().substring(0, 4);
}else {
RedisUtils.set("code",code, (long) (1 * 60));
return "手机号码为:"+ phone + "的用户,在1分钟内不能重复发送验证码";
}
//调用发送方法
Map<String,Object> param = new HashMap<>();
param.put("code",code);
//调用发送:
boolean b = smsService.sendSms(phone, smsConfig.YZMCODE, param);
if (b){
//发送成功再将验证码存入缓存
RedisUtils.set("code",code, (long) (1 * 60));
return "手机号码为:"+ phone + "的用户,成功发送验证码:"+code;
}else return "手机号码为:"+ phone + "的用户,发送短信失败";
}
}
11、启动程序
在地址栏中输入:localhost:8080/sendsms/你的手机号码,这里我测试了自己的手机,冲!
再次发送:
手机接收:
测试成功!
12、小结
短信发送到自己手机上是真的挺开心的,到时候可以通过服务器向用户发送验证码起到登录验证、注册验证功能详细的代码在我的github上,有些redis的工具类代码没有放出来,只有核心代码,同时还有一些私人信息没有修改,使用的话记得修改对应的模板code,标签,手机号码的等相关信息,如需使用redis记得修改对应的redis服务器地址,并且打开redis服务器服务。需要的小伙伴自行下载,没有springboot基础也是可以做的,只要能正确的调用相关的API,当然,前提是你也要学会借助官方的帮助文档,链接在这:阿里云短信服务官方帮助文档
同时也是可以看看狂神视频学习啦~前进道路是充满困难的,但也是充满希望的,加油!
----------------------------点我到Vinda的Github获取相关代码--------------------------------