本文最后更新于:2023年8月24日 晚上
准备工作
进入阿里云官网,登录
鼠标放置头像上点击AccessKey管理
创建一个用户组(权限管理选上sms短信服务)
创建一个用户(一定要勾上Open API调用访问)
在组中添加用户,记录用户的AccessKey ID和密钥
开启短信服务
直接搜索短信服务,启动
如 【齐氏有限公司】:您的验证码为:${code}
这里齐氏有限公司则是签名,后面提示为模板
签名:
- 一个用户只有一个验证码的签名
- 选择自用不需要提供三证
- 场景说明要严谨,比如:某某某需要某某业务
模板:
- 添加模板类型为验证码
- 名称可以提示,如:某某某公司 注册
- 申请说明需要正规,如某某某公司为了某某业务测试
使用api文档
点击查看
- 使用sdk添加阿里云依赖
- 建立Client类客户端连接
- 写入配置项
- 发送并接收,查看返回状态码和消息
建立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(); HashMap<String, String> map = new HashMap<>(); map.put("code", UUID.randomUUID().toString().substring(0, 4)); 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);
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查看是否为空