阿里云短信服务

本文最后更新于:2023年8月24日 晚上

准备工作

  1. 进入阿里云官网,登录

  2. 鼠标放置头像上点击AccessKey管理

  3. 创建一个用户组(权限管理选上sms短信服务)

  4. 创建一个用户(一定要勾上Open API调用访问)

  5. 在组中添加用户,记录用户的AccessKey ID和密钥

开启短信服务

直接搜索短信服务,启动

如 【齐氏有限公司】:您的验证码为:${code}

这里齐氏有限公司则是签名,后面提示为模板

签名:

  1. 一个用户只有一个验证码的签名
  2. 选择自用不需要提供三证
  3. 场景说明要严谨,比如:某某某需要某某业务

模板:

  1. 添加模板类型为验证码
  2. 名称可以提示,如:某某某公司 注册
  3. 申请说明需要正规,如某某某公司为了某某业务测试

使用api文档

点击查看

  1. 使用sdk添加阿里云依赖
  2. 建立Client类客户端连接
  3. 写入配置项
  4. 发送并接收,查看返回状态码和消息

建立Client类客户端连接:

写一个方法用来提供连接客户端:

1
2
3
4
5
6
7
public Client createClient() {
Config config = new Config()
.setAccessKeyId("youAccessKeyId")
.setAccessSecret("youAccessKeySecret");
config.endpoint = "dysmsapi.aliyuncs.com";
return new Client(config);
}
  • setAccessKeyId 传入用户的accessId
  • setAccessSecret 传入对应id的密钥
  • config.endpoint = “dysmsapi.aliyuncs.com”; 固定不可改,访问域名

发送短信:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Autowired
GetClient getClient;

public void send(String youPhoneNumbers, String youTemplateCode, String youSignName) {
// 获取连接客户端
Client client = getClient.createClient();
// 设置发送的模板变量的值(${code} 验证码的值)
HashMap<String, String> map = new HashMap<>();
// 使用UUID工具类生成随机数
map.put("code", UUID.randomUUID().toString().substring(0, 4));
// 填写发送配置,手机号,模板code,签名,变量值(json格式)
SendSmsRequest smsRequest = new SendSmsRequest()
.setPhoneNumbers(youPhoneNumbers)
.setTemplateCode(youTemplateCode)
.setSignName(youSignName)
.setTemplateParams(JSON.toJSONString(map));
// 发送
SendSmsResponse sendResp = client.sendSms(smsRequest);
System.out.println(sendResp.body.code);
System.out.println(sendResp.body.message);
}
  • UUID.randomUUID().toString().substring(0, 4) 使用UUID工具类生成随机数,转为字符串后使用substring从下标0开始取4位
  • setPhoneNumbers 设置发送的手机号,字符串类型
  • setTemplateCode 用户模板的code值
  • setSignName 用户签名名称
  • sendResp.body.code 返回值,成功为ok
  • sendResp.body.message 返回消息

配合redis做缓存:

配置redis地址和端口:

1
2
3
4
spring:
redis:
host: XXXXXX
port: XXXX

controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Autowired
RedisTemplate<String, String> redisTemplate;

@GetMapping("/sendPhone/{phone}")
public void sendPhone(@PathVariable("phone") String phone) {
String msg = aliyun.sendPhone(phone, "youTemplateCode", "youSignName");
String code = redisTemplate.opsForValue().get(phone);

// 查看redis
if (!StringUtils.hasText(code)) {
System.out.println("手机号" + phone + "验证码已存在,未过期!");
} else {
redisTemplate.opsForValue().set(phone, msg, TimeUnit.MINUTES);
System.out.println("发送成功!");
}
}
  • 创建key和value都是字符串的redis模板
  • redisTemplate.opsForValue().get(phone) 查找
  • redisTemplate.opsForValue().set(phone, msg, 5, TimeUnit.MINUTES); 写入,时间为5分钟(使用TimeUnit工具类)
  • 使用StringUtils工具类的hasText查看是否为空

阿里云短信服务
https://xin-fas.github.io/2022/01/20/阿里云短信服务/
作者
Xin-FAS
发布于
2022年1月20日
更新于
2023年8月24日
许可协议