阿里云短信验证码服务

阿里云短信服务

1595076994722.png

了解阿里云用户权限操作

登录阿里云账号,然后悬停头像,会发现AccessKey 管理,点击去

1595077086699.png

这个时候为了安全,选择子用户的 AccessKey

1595077171082.png

创建用户组

1595077242704.png

然后填写,会验证验证码

1595077299265.png

1595077340977.png

1595077355439.png

开通阿里云短信服务

创建好用户组之后,需要点开用户组,然后添加权限

1595077488257.png

然后添加用户

1595077586777.png

创建好之后保存自己的密码和账户

1595077692093.png

  1. 用户登录名称 icanci@1829881847712669.onaliyun.com
  2. AccessKey ID LTAI4G4JptDwzhS624rapUz2
  3. SECRET jKrNsVyG1jhYkWN5g6V5v3IzQZoGZS

然后进入短信服务

1595077852074.png

然后添加一个模板

1595078186685.png

然后再添加签名

1595078300581.png

添加短信模板

  • 短信的基本内容
  • 等待审核通过 需要正当的理由

添加签名

  • 公司的名称
  • 等待审核通过 需要正当的理由

添加用户到组,否则没有权限操作

1595118580625.png

编写测试代码

新建SpringBoot项目

添加依赖

  1. <!-- 阿里云短信业务 -->
  2. <dependency>
  3. <groupId>com.aliyun</groupId>
  4. <artifactId>aliyun-java-sdk-core</artifactId>
  5. <version>4.4.3</version>
  6. </dependency>
  7. <!-- 如果有需要使用JSON -->
  8. <dependency>
  9. <groupId>com.alibaba</groupId>
  10. <artifactId>fastjson</artifactId>
  11. <version>1.2.70</version>
  12. </dependency>
  13. <!-- 整合 Redis -->
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-data-redis</artifactId>
  17. </dependency>
  1. package cn.icanci.sms.test;
  2. import com.alibaba.fastjson.JSON;
  3. import com.aliyuncs.CommonRequest;
  4. import com.aliyuncs.CommonResponse;
  5. import com.aliyuncs.DefaultAcsClient;
  6. import com.aliyuncs.IAcsClient;
  7. import com.aliyuncs.exceptions.ClientException;
  8. import com.aliyuncs.exceptions.ServerException;
  9. import com.aliyuncs.http.MethodType;
  10. import com.aliyuncs.profile.DefaultProfile;
  11. import java.util.HashMap;
  12. /**
  13. * @Author: icanci
  14. * @ProjectName: aliyun-sms
  15. * @PackageName: cn.icanci.sms.test
  16. * @Date: Created in 2020/7/18 22:16
  17. * @ClassAction:
  18. */
  19. public class SendSms {
  20. public static void main(String[] args) {
  21. // 连接阿里云
  22. DefaultProfile profile =
  23. DefaultProfile.getProfile(
  24. "cn-hangzhou",
  25. "账户",
  26. "密码"
  27. );
  28. IAcsClient client = new DefaultAcsClient(profile);
  29. CommonRequest request = new CommonRequest();
  30. // 构建请求
  31. request.setSysMethod(MethodType.POST);
  32. // 官方提供,不需要修改
  33. request.setSysDomain("dysmsapi.aliyuncs.com");
  34. // 官方提供,不需要修改 版本号
  35. request.setSysVersion("2017-05-25");
  36. // 不需要修改
  37. request.setSysAction("SendSms");
  38. // 自定义的参数 (手机号,验证码,签名,模板)
  39. // 自定义手机号
  40. request.putQueryParameter("PhoneNumbers", "15252067235");
  41. // 自定义签命
  42. request.putQueryParameter("SignName", "是小猪童鞋啦");
  43. // 自定义模板 Code
  44. request.putQueryParameter("TemplateCode", "SMS_196653273");
  45. // 构建短信验证码
  46. HashMap<String, Object> map = new HashMap<>();
  47. map.put("code",9711);
  48. // 自定义验证码
  49. request.putQueryParameter("TemplateParam", JSON.toJSONString(map));
  50. try {
  51. CommonResponse response = client.getCommonResponse(request);
  52. System.out.println(response.getData());
  53. } catch (ServerException e) {
  54. e.printStackTrace();
  55. } catch (ClientException e) {
  56. e.printStackTrace();
  57. }
  58. }
  59. }

编写可复用的微服务接口、实现验证码的发送

  1. // Service 接口
  2. public interface SendSms {
  3. /**
  4. * 短信发送业务
  5. * @param phoneNum 手机号
  6. * @param templateCode 模板Code
  7. * @param code 需要发送的信息
  8. * @return 返回是否发送成功
  9. */
  10. boolean send(String phoneNum, String templateCode, Map<String, Object> code);
  11. }
  1. // Service 实现类
  2. package cn.icanci.sms.service.impl;
  3. import cn.icanci.sms.service.SendSms;
  4. import com.alibaba.fastjson.JSON;
  5. import com.aliyuncs.CommonRequest;
  6. import com.aliyuncs.CommonResponse;
  7. import com.aliyuncs.DefaultAcsClient;
  8. import com.aliyuncs.IAcsClient;
  9. import com.aliyuncs.exceptions.ClientException;
  10. import com.aliyuncs.exceptions.ServerException;
  11. import com.aliyuncs.http.MethodType;
  12. import com.aliyuncs.profile.DefaultProfile;
  13. import org.springframework.stereotype.Service;
  14. import java.util.Map;
  15. /**
  16. * @Author: icanci
  17. * @ProjectName: aliyun-sms
  18. * @PackageName: cn.icanci.sms.service.impl
  19. * @Date: Created in 2020/7/19 8:34
  20. * @ClassAction:
  21. */
  22. @Service
  23. public class SendSmsImpl implements SendSms {
  24. @Override
  25. public boolean send(String phoneNum, String templateCode, Map<String, Object> code) {
  26. /**
  27. * 连接阿里云
  28. */
  29. DefaultProfile profile =
  30. DefaultProfile.getProfile(
  31. // 不需要改
  32. "cn-hangzhou",
  33. // key
  34. "LTAI4G4JptDwzhS624rapUz2",
  35. // pwd
  36. "jKrNsVyG1jhYkWN5g6V5v3IzQZoGZS"
  37. );
  38. IAcsClient client = new DefaultAcsClient(profile);
  39. CommonRequest request = new CommonRequest();
  40. // 构建请求
  41. request.setSysMethod(MethodType.POST);
  42. // 官方提供,不需要修改
  43. request.setSysDomain("dysmsapi.aliyuncs.com");
  44. // 官方提供,不需要修改 版本号
  45. request.setSysVersion("2017-05-25");
  46. // 不需要修改
  47. request.setSysAction("SendSms");
  48. // 自定义的参数 (手机号,验证码,签名,模板)
  49. // 自定义手机号
  50. request.putQueryParameter("PhoneNumbers", phoneNum);
  51. // 自定义签命
  52. request.putQueryParameter("SignName", "是小猪童鞋啦");
  53. // 自定义模板 Code
  54. request.putQueryParameter("TemplateCode", templateCode);
  55. // 自定义验证码
  56. request.putQueryParameter("TemplateParam", JSON.toJSONString(code));
  57. try {
  58. CommonResponse response = client.getCommonResponse(request);
  59. System.out.println(response.getData());
  60. // 是否成功
  61. return response.getHttpResponse().isSuccess();
  62. } catch (ServerException e) {
  63. e.printStackTrace();
  64. } catch (ClientException e) {
  65. e.printStackTrace();
  66. }
  67. return false;
  68. }
  69. }
  1. # 本机 redis 配置
  2. spring:
  3. redis:
  4. port: 6379
  5. host: 127.0.0.1
  1. // 发送短信的业务接口
  2. package cn.icanci.sms.controller;
  3. import cn.icanci.sms.service.SendSms;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.data.redis.core.RedisTemplate;
  6. import org.springframework.util.StringUtils;
  7. import org.springframework.web.bind.annotation.*;
  8. import java.util.HashMap;
  9. import java.util.UUID;
  10. import java.util.concurrent.TimeUnit;
  11. /**
  12. * @Author: icanci
  13. * @ProjectName: aliyun-sms
  14. * @PackageName: cn.icanci.sms.controller
  15. * @Date: Created in 2020/7/19 8:39
  16. * @ClassAction: 发送短信业务的接口
  17. */
  18. @RestController
  19. @CrossOrigin
  20. public class SendSmsController {
  21. @Autowired
  22. private SendSms sendSms;
  23. @Autowired
  24. private RedisTemplate<String, String> redisTemplate;
  25. @GetMapping("/send/{phone}")
  26. public String getSmsCode(@PathVariable("phone") String phone) {
  27. // 调用方法发送 (模拟真实业务)
  28. String code = redisTemplate.opsForValue().get(phone);
  29. if (!StringUtils.isEmpty(code)) {
  30. // 已经存在,没有过期
  31. return phone + " : " + code;
  32. }
  33. // 生成验证码并且存储到Redis中
  34. code = UUID.randomUUID().toString().substring(0, 4);
  35. HashMap<String, Object> codeMap = new HashMap<>();
  36. codeMap.put("code", code);
  37. boolean isSend = sendSms.send(phone, "SMS_196653273", codeMap);
  38. if (isSend) {
  39. // 将手机号作为key,验证码作为 code,有效时间是5分钟
  40. redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.MINUTES);
  41. return phone + " : " + code + " 发送成功";
  42. } else {
  43. return "发送失败";
  44. }
  45. }
  46. }

启动项目,浏览器输入http://localhost:8080/send/15252067235

等待手机接受验证码即可