前言
暑假持续学习ing
推荐
短信验证码
需要有SpringBoot基础再来学习
1、了解阿里云用户权限操作
1.找到AccessKey功能
- 创建一个用户组,给他添加下短信权限,Sms
然后用户也是差不多
创建一个用户给它添加到刚才那个组里面,这样整个用户就只能使用短信服务了
值得注意的是那个创建用户的时候会告诉accessKeyId和accessKeySecret,记得把这两个保存下来,特别是accessKeySecret只在你创建用户的时候显示,忘了的话只能删除accessKeyId再新建一个了,这两个是等会需要填到代码里面的。
老哥们注意下了,上面这些操作都是为了保护你的账号,这个用户组只能使用短信服务的,其他服务是是使用不了的。
(这个授权码和密码有点类似快递小哥进你的小区,你给他发个授权码和密码,有一定的时效或者权限,总比直接告诉他你的账号和密码要安全多了)
把原来的禁用掉,就可以删除了,然后新建一个
总结:
1、开启子用户
2、新建一个用户组(设置添加权限sms)
3、创建一个用户(用来具体操作的账号)
4、得到AccessKey(id,密码)
注意将这个账号保存下来,不要泄露
泄露有及时禁用
2、开通阿里云短信服务
1、主页搜索短信服务
,进入控制台
添加短信模板
1、短信的具体内容
2、等待审核通过
添加签名
1、名称
2、等待审核通过
使用阿里云专用短信测试
绑定测试手机号
使用测试专用签名,测试专用模板
3.编写测试代码
项目结构
1、新建springboot项目
2、导入依赖
pom.xml
<!-- 阿里云短信依赖 --> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.1.0</version> </dependency> <!--fastjson,用来解析json--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.60</version> </dependency> <!-- 加入redis相关的依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>
application.properties
// 服务端口 server.port=8080 // redis 相关的配置 spring.redis.host=127.0.0.1 spring.redis.port=6379
SmsApplicationTests
测试类中测试
package com.kuang.sms; 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.http.MethodType; import com.aliyuncs.profile.DefaultProfile; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import java.util.HashMap; @SpringBootTest class SmsApplicationTests { @Test void contextLoads() { // 连接阿里云 DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou","请替换为你的accessKeyId", "请替换为你的accessKeySecret"); IAcsClient client = new DefaultAcsClient(profile); // 构建请求 CommonRequest request = new CommonRequest(); request.setMethod(MethodType.POST); // 这些内容不要动,是人家阿里巴巴弄出来的,咱不用管 request.setDomain("dysmsapi.aliyuncs.com");//不要动 request.setVersion("2017-05-25");//不要动 // 自己的内容,此处 SendSms 为发送验证码 request.setAction("SendSms"); //自定义的参数(手机号,验证码,签名,模板! ) //这是我的内容,请结合你的情况修改为你的东西!!! request.putQueryParameter("PhoneNumbers", 绑定的手机号); request.putQueryParameter("SignName", "阿里云短信测试");//阿里云专用短信测试签名 request.putQueryParameter("TemplateCode", "SMS_154950909");//阿里云专用短信测试 模板 //构建短信验证码 HashMap<String,Object> map=new HashMap<>(); map.put("code",2233); request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map)); try { CommonResponse response = client.getCommonResponse(request); // 在控制台上打印出返回信息 System.out.println(response.getData()); } catch (ClientException e) { e.printStackTrace(); } } }
service
package com.kuang.sms.service; import java.util.Map; public interface SendSms { /** * 发送短信验证码 * @param phoneNum 手机号 * @param templateCode 模板号 * @param code 验证码 * @return */ public boolean send(String phoneNum, String templateCode, Map<String,Object> code); }
SendSmsImpl
package com.kuang.sms.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.http.MethodType; import com.aliyuncs.profile.DefaultProfile; import com.kuang.sms.service.SendSms; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.Map; @Service public class SendSmsImpl implements SendSms { @Override public boolean send(String phoneNum, String templateCode, Map<String, Object> code) { // 连接阿里云 DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "请替换为你的accessKeyId", "请替换为你的accessKeySecret"); IAcsClient client = new DefaultAcsClient(profile); // 构建请求 CommonRequest request = new CommonRequest(); request.setMethod(MethodType.POST); // 这些内容不要动,是人家阿里巴巴弄出来的,咱不用管 request.setDomain("dysmsapi.aliyuncs.com");//不要动 request.setVersion("2017-05-25");//不要动 // 自己的内容,此处 SendSms 为发送验证码 request.setAction("SendSms"); //自定义的参数(手机号,验证码,签名,模板! ) //这是我的内容,请结合你的情况修改为你的东西!!! request.putQueryParameter("PhoneNumbers", phoneNum); request.putQueryParameter("SignName", "阿里云短信测试"); request.putQueryParameter("TemplateCode", templateCode); request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code)); try { CommonResponse response = client.getCommonResponse(request); // 在控制台上打印出返回信息 System.out.println(response.getData()); return response.getHttpResponse().isSuccess(); } catch (ClientException e) { e.printStackTrace(); } return false; } }
controller
package com.kuang.sms.controller; import com.aliyuncs.utils.StringUtils; import com.kuang.sms.service.SendSms; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; 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; @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) { //调用发送方法,模拟真实业务,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, "SMS_154950909", param);//测试专用模版 if (isSend) { redisTemplate.opsForValue().set(phone, code, 600, TimeUnit.SECONDS); return phone + ":" + code + "发送成功!"; } else { return "发送失败!"; } } }
测试
保证redis打开,启动项目
访问http://localhost:8080/send/测试绑定手机号
结果:
封装微服务
略
最后
Markdown 7526 字数 339 行数
HTML 6011 字数 225 段落