阿里云短佩服务

打印 上一主题 下一主题

主题 876|帖子 876|积分 2628

  1. ## 整合阿里云短信服务
  2. 用途:注册的时候发送手机验证码
  3. ### 一、开通阿里云短信服务步骤
  4. #### 1.1 登录阿里云
  5. 进入控制台,在控制台界面下找到云通信-短信服务
  6. ![1](阿里云短信服务.assets/1.png)
  7. #### 1.2 开通短信服务
  8. 点击短信服务进入开通页面,选择同意协议,开通服务![2](阿里云短信服务.assets/2.png)
  9. #### 1.3 申请模板管理
  10. 需要申请:签名管理与模板管理,先在短信服务管理界面下找到国内消息
  11. ![3](阿里云短信服务.assets/3.png)
  12. 模板:就是在你手机上显示的内容是什么,可以在这里进行定义
  13. ![4](阿里云短信服务.assets/4.png)
  14. 申请模板,点击添加模板
  15. ![5](阿里云短信服务.assets/5.png)
  16. 添加模板内容
  17. 选择验证码,模板名称一般要起的有意义,模板内容可以参考常用模板库
  18. ![6](阿里云短信服务.assets/6.png)
  19. 填写完毕后,提交申请,一般会秒通过审核
  20. #### 1.4 申请签名管理
  21. 点击签名管理
  22. ![7](阿里云短信服务.assets/7-1646357170054.png)
  23. 添加签名
  24. 注意签名名称要写的具有实际意义,签名来源必须选择一个。如果域名没有备案,请先进行备案。
  25. ![8](阿里云短信服务.assets/8.png)
  26. 提交申请
  27. ![9](阿里云短信服务.assets/9.png)
  28. 最后,短信服务是付费的,根据资费情况充值一定金额来使用
  29. #### 1.5 创建操作阿里云OSS许可证
  30. 阿里云颁发ID与秘钥
  31. 如果要使用OSS对象存储,开通OSS许可证,首先需要创建Bucket
  32. ![10](阿里云短信服务.assets/10.png)
  33. ![11](阿里云短信服务.assets/11.png)
  34. ![12](阿里云短信服务.assets/12.png)
  35. ![13](阿里云短信服务.assets/13.png)
  36. #### 1.6 创建 Access Key
  37. ![14](阿里云短信服务.assets/14.png)
  38. ![15](阿里云短信服务.assets/15.png)
  39. ![16](阿里云短信服务.assets/16.png)
  40. ![18](阿里云短信服务.assets/18.png)
  41. ### 二、代码实现
  42. #### 2.1 创建Springboot项目
  43. 创建项目结构:包括service,mapper,controller模块,并引入依赖
  44. ~~~xml
  45. <dependency>
  46.     <groupId>com.aliyun</groupId>
  47.     <artifactId>aliyun-java-sdk-core</artifactId>
  48.     <version>4.3.3</version>
  49. </dependency>
  50. <dependency>
  51.     <groupId>org.projectlombok</groupId>
  52.     <artifactId>lombok</artifactId>
  53. </dependency>
  54. <!--redis依赖-->
  55. <dependency>
  56.     <groupId>org.springframework.boot</groupId>
  57.     <artifactId>spring-boot-starter-data-redis</artifactId>
  58. </dependency>
  59. <dependency>
  60.     <groupId>com.alibaba</groupId>
  61.     <artifactId>fastjson</artifactId>
  62.     <version>1.2.72</version>
  63. </dependency>
  64. ~~~
  65. #### 2.2 编写Controller
  66. 阿里云的4位或者6位的验证码,并不是由阿里云生成的,而是由程序编写的,阿里云只是做一个传递的过程。
  67. Controller类
  68. ~~~java
  69. package cn.hxzy.controller;
  70. import cn.hxzy.common.R;
  71. import cn.hxzy.service.MsmService;
  72. import cn.hxzy.utils.RandomUtil;
  73. import org.springframework.beans.factory.annotation.Autowired;
  74. import org.springframework.data.redis.core.RedisTemplate;
  75. import org.springframework.util.StringUtils;
  76. import org.springframework.web.bind.annotation.*;
  77. import java.util.HashMap;
  78. import java.util.Map;
  79. import java.util.concurrent.TimeUnit;
  80. @RestController
  81. @RequestMapping("/msm")
  82. @CrossOrigin
  83. public class MsmController {
  84.    
  85.     @Autowired
  86.     private MsmService msmService;
  87.     @Autowired
  88.     private RedisTemplate<String,String> redisTemplate;
  89.    
  90.     //发送短信的方法
  91.     @GetMapping("/send/{phone}")
  92.     public R sendMsm(@PathVariable String phone){
  93.         //1 从redis获取验证码,如果获取到直接返回
  94.         String code = redisTemplate.opsForValue().get(phone);
  95.         if(!StringUtils.isEmpty(code)) {
  96.             return R.ok().code(Integer.parseInt(code));
  97.         }
  98.         //2 如果redis获取 不到,进行阿里云发送
  99.         //生成随机值,传递阿里云进行发送
  100.         code = RandomUtil.getFourBitRandom();
  101.         Map<String,Object> param = new HashMap<>();
  102.         param.put("code",code);
  103.         //调用service发送短信的方法
  104.         boolean isSend = msmService.send(param,phone);
  105.         if(isSend) {
  106.             //发送成功,把发送成功验证码放到redis里面
  107.             //设置有效时间
  108.             redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
  109.             return R.ok();
  110.         } else {
  111.             return R.error().message("短信发送失败");
  112.         }
  113.     }
  114. }
  115. ~~~
  116. #### 2.3 引入工具类
  117. ~~~java
  118. package cn.hxzy.utils;
  119. import java.text.DecimalFormat;
  120. import java.util.ArrayList;
  121. import java.util.HashMap;
  122. import java.util.List;
  123. import java.util.Random;
  124. /**
  125. * 获取随机数
  126. */
  127. public class RandomUtil {
  128.         private static final Random random = new Random();
  129.         private static final DecimalFormat fourdf = new DecimalFormat("0000");
  130.         private static final DecimalFormat sixdf = new DecimalFormat("000000");
  131.         public static String getFourBitRandom() {
  132.                 return fourdf.format(random.nextInt(10000));
  133.         }
  134.         public static String getSixBitRandom() {
  135.                 return sixdf.format(random.nextInt(1000000));
  136.         }
  137.         /**
  138.          * 给定数组,抽取n个数据
  139.          * @param list
  140.          * @param n
  141.          * @return
  142.          */
  143.         public static ArrayList getRandom(List list, int n) {
  144.                 Random random = new Random();
  145.                 HashMap<Object, Object> hashMap = new HashMap<Object, Object>();
  146.                 // 生成随机数字并存入HashMap
  147.                 for (int i = 0; i < list.size(); i++) {
  148.                         int number = random.nextInt(100) + 1;
  149.                         hashMap.put(number, i);
  150.                 }
  151.                 // 从HashMap导入数组
  152.                 Object[] robjs = hashMap.values().toArray();
  153.                 ArrayList r = new ArrayList();
  154.                 // 遍历数组并打印数据
  155.                 for (int i = 0; i < n; i++) {
  156.                         r.add(list.get((int) robjs[i]));
  157.                         System.out.print(list.get((int) robjs[i]) + "\t");
  158.                 }
  159.                 System.out.print("\n");
  160.                 return r;
  161.         }
  162. }
  163. ~~~
  164. 统一返回类型
  165. 返回对象
  166. ~~~java
  167. package cn.hxzy.common;
  168. import lombok.Data;
  169. import java.util.HashMap;
  170. import java.util.Map;
  171. @Data
  172. public class R {
  173.     private Boolean success;
  174.     private Integer code;
  175.     private String message;
  176.     private Map<String, Object> data = new HashMap<String, Object>();
  177.     //把构造方法私有
  178.     private R() {}
  179.     //成功的静态方法
  180.     public static R ok(){
  181.         R r=new R();
  182.         r.setSuccess(true);
  183.         r.setCode(ResultCode.SUCCESS);
  184.         r.setMessage("成功");
  185.         return r;
  186.     }
  187.     //失败的静态方法
  188.     public static R error(){
  189.         R r=new R();
  190.         r.setSuccess(false);
  191.         r.setCode(ResultCode.ERROR);
  192.         r.setMessage("失败");
  193.         return r;
  194.     }
  195.     //使用下面四个方法,方面以后使用链式编程
  196.     // R.ok().success(true)
  197.     //  r.message("ok).data("item",list)
  198.     public R success(Boolean success){
  199.         this.setSuccess(success);
  200.         return this;
  201.     }
  202.     public R message(String message){
  203.         this.setMessage(message);
  204.         return this;
  205.     }
  206.     public R code(Integer code){
  207.         this.setCode(code);
  208.         return this;
  209.     }
  210.     public R data(String key, Object value){
  211.         this.data.put(key, value);
  212.         return this;
  213.     }
  214.     public R data(Map<String, Object> map){
  215.         this.setData(map);
  216.         return this;
  217.     }
  218. }
  219. ~~~
  220. 接口
  221. ~~~java
  222. package cn.hxzy.common;
  223. public interface ResultCode {
  224.     Integer SUCCESS=20000;
  225.     Integer ERROR=20001;
  226. }
  227. ~~~
  228. redis
  229. ~~~java
  230. package cn.hxzy.config.redis;
  231. import com.fasterxml.jackson.annotation.JsonAutoDetect;
  232. import com.fasterxml.jackson.annotation.PropertyAccessor;
  233. import com.fasterxml.jackson.databind.ObjectMapper;
  234. import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
  235. import org.springframework.context.annotation.Bean;
  236. import org.springframework.context.annotation.Configuration;
  237. import org.springframework.data.redis.connection.RedisConnectionFactory;
  238. import org.springframework.data.redis.core.RedisTemplate;
  239. import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
  240. import org.springframework.data.redis.serializer.StringRedisSerializer;
  241. @Configuration
  242. public class RedisConfig {
  243.     @Bean("redis")
  244.     @SuppressWarnings("all")
  245.     public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
  246.         RedisTemplate<String, Object> template = new RedisTemplate<>();
  247.         template.setConnectionFactory(connectionFactory);
  248.         //自定义Jackson序列化配置
  249.         Jackson2JsonRedisSerializer jsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  250.         ObjectMapper objectMapper = new ObjectMapper();
  251.         objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  252.         objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
  253.         jsonRedisSerializer.setObjectMapper(objectMapper);
  254.         //key使用String的序列化方式
  255.         StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
  256.         template.setKeySerializer(stringRedisSerializer);
  257.         //hash的key也是用String的序列化方式
  258.         template.setHashKeySerializer(stringRedisSerializer);
  259.         //value的key使用jackson的序列化方式
  260.         template.setValueSerializer(jsonRedisSerializer);
  261.         //hash的value也是用jackson的序列化方式
  262.         template.setHashValueSerializer(jsonRedisSerializer);
  263.         template.afterPropertiesSet();
  264.         return template;
  265.     }
  266. }
  267. ~~~
  268. #### 2.5 application.yml设置连接redis
  269. ~~~yaml
  270. spring:
  271.   jackson:
  272.     date-format: yyyy-MM-dd HH:mm:ss
  273.     time-zone: GMT+8
  274.   redis:
  275.     database: 0
  276.     host: 127.0.0.1
  277.     port: 6379
  278. ~~~
  279. #### 2.6 编写接口与实现类
  280. Service接口
  281. ~~~java
  282. package cn.hxzy.service;
  283. import java.util.Map;
  284. public interface MsmService {
  285.     //发送短信的方法
  286.     Boolean send(Map<String, Object> param, String phone);
  287. }
  288. ~~~
  289. ServiceImpl实现类
  290. ~~~java
  291. package cn.hxzy.service.impl;
  292. import cn.hxzy.service.MsmService;
  293. import com.alibaba.fastjson.JSONObject;
  294. import com.aliyuncs.CommonRequest;
  295. import com.aliyuncs.CommonResponse;
  296. import com.aliyuncs.DefaultAcsClient;
  297. import com.aliyuncs.IAcsClient;
  298. import com.aliyuncs.http.MethodType;
  299. import com.aliyuncs.profile.DefaultProfile;
  300. import org.springframework.stereotype.Service;
  301. import org.springframework.util.StringUtils;
  302. import java.util.Map;
  303. @Service
  304. public class MsmServiceImpl implements MsmService {
  305.     //发送短信
  306.     @Override
  307.     public Boolean send(Map<String, Object> param, String phone) {
  308.         //判断手机号是否为空
  309.         if(StringUtils.isEmpty(phone)) return false;
  310.         DefaultProfile profile =
  311.                 DefaultProfile.getProfile("default", "LTAI5tJHEr4rgFyg5SJL3Ub1", "yqeXTZfzd1mT6BI2Mss2HdAxDKyORY");
  312.         
  313.         IAcsClient client = new DefaultAcsClient(profile);
  314.         //设置相关固定的参数
  315.         CommonRequest request = new CommonRequest();
  316.         //request.setProtocol(ProtocolType.HTTPS);
  317.         request.setMethod(MethodType.POST);
  318.         request.setDomain("dysmsapi.aliyuncs.com");
  319.         request.setVersion("2017-05-25");
  320.         request.setAction("SendSms");
  321.         //设置发送相关的参数
  322.         request.putQueryParameter("PhoneNumbers",phone); //手机号
  323.         request.putQueryParameter("SignName","探维世纪官方网站"); //申请阿里云 签名名称
  324.         request.putQueryParameter("TemplateCode","SMS_236045641"); //申请阿里云 模板code
  325.         request.putQueryParameter("TemplateParam", JSONObject.toJSONString(param)); //验证码数据,转换json数据传递
  326.         try {
  327.             //最终发送
  328.             CommonResponse response = client.getCommonResponse(request);
  329.             boolean success = response.getHttpResponse().isSuccess();
  330.             return success;
  331.         }catch(Exception e) {
  332.             e.printStackTrace();
  333.             return false;
  334.         }
  335.     }
  336. }
  337. ~~~
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南飓风

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表