• 阿里云短信服务接入流程


    背景

    在最近的项目需求中, 需要将复用阿里短信能力, 实现用户手机号验证: 如果用户号码验证通过后, 可以让用户上传文件资料并进行打印.
    故核心内容就是: 阿里云短信服务接入, 下面我们主要来介绍下阿里云短信服务接入流程

    一. 熟悉整个对接流程

    1. 进入阿里云短信服务新手指引页面
      可以看到整个对接流程如下图所示:
      在这里插入图片描述

    2. 每个过程如下图所示:
      在这里插入图片描述

    二. 具体搭建过程

    准备工作

    1. 注册后登录云通信产品试用界面

    2. 进行实名认证,如下图所示
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    3. 开通短信服务
      购买免费的短信包, 然后零元购后就可以在短信控制台进行配置
      在这里插入图片描述
      点击进入 阿里云短信服务控制台. 这里可以修改每分钟, 每小时, 每天发送信息的频率
      在这里插入图片描述

    4. 获取AccessKey
      在阿里云短信服务控制台右上角点击AccessKey管理
      在这里插入图片描述
      创建用户组
      在这里插入图片描述
      配置用户组权限
      在这里插入图片描述
      在用户组-添加组成员页面新建用户
      在这里插入图片描述
      新建用户
      在这里插入图片描述
      新建用户配置(该用户属于子用户, 用于发送短信)
      在这里插入图片描述
      复制并保存 AccessKey ID和AccessKey Secret, 以便在后续SDK中使用
      (这一步非常重要, 因为AccessKey ID 和 AccessKey Secret只显示一次, 无法找回, 只能重新生成)

      在这里插入图片描述

    添加签名

    注意: 如果仅仅测试的话, 可以跳过添加签名添加模板步骤. 直接调用sdk, 并使用无限制的测试签名和模板进行测试

    1. 添加签名设置
      在这里插入图片描述
    2. 根据用途选择适用场景和签名用途, 然后进行审核
      在这里插入图片描述

    添加模板

    1. 创建模板
      模板就是指短信模板, 具体就是在发送验证短信时, 短信发送内容的模板
      在这里插入图片描述

    2. 配置短信模板内容后进行审核, 审核通过即可使用
      在这里插入图片描述

    发送短信(SDK)

    注意: 这里因为使用sdk进行测试调用, 因此无需等待签名和模板审核成功. 使用下面短信测试专用的签名和模板编码即可
    SignName: 阿里云短信测试,
    TemplateCode: SMS_154950909

    整体流程
    进入OpenApi页面 -> 添加参数 -> 发起调用 -> 复制生成的sdk代码 -> 下载jar包->封装并复用代码

    1. 配置测试手机号
      因为使用的是测试模板和签名, 因此需要我们配置用于测试的手机号
      在这里插入图片描述
      否则则会提示: 只能向已回复授权信息的手机号发送
      在这里插入图片描述

    2. 在线调用sdk
      这里调用成功后, 就会发送短信.
      在这里插入图片描述

    3. 查看是否调用成功(成功后复制sdk代码)
      发起调用成功并收到短信后(如下图), 复制上图右侧生成的sdk示例代码到项目中
      在这里插入图片描述

    4. 添加依赖( 获取sdk的jar包 )
      如果是maven项目. 直接复制下图展示的Maven坐标
      在这里插入图片描述

    注意: 如果是SSM/JavaEE项目(需要手动放入jar), 配置过程如下

    1. 直接将下图包放到指定目录下(博客底部会将jar分享)
      在这里插入图片描述

    2. Project Structure->Libraries 中, 将lib下面的jar添加到项目中
      在这里插入图片描述

    3. 选择jar所在目录, 添加后如下图所示
      在这里插入图片描述

    4. 添加成功后, 对应的sdk代码则不会报红, 项目也可以正常运行

    三. 封装sdk方法

    1. 将上一步的sdk方法进行封装
      这里主要有三个方法: 第一个用于使用AK&SK初始化账号Client, 第二个用于生成6位验证码. 第三个用于获取发送短信结果

      import com.aliyun.dysmsapi20170525.Client;
      import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
      import com.aliyun.tea.TeaException;
      import com.aliyun.teaopenapi.models.Config;
      import org.springframework.stereotype.Component;
      
      /**
       * info:
       *
       * @Author caoHaiYang
       * @Date 2022/8/29 11:47
       */
      @Component
      public class SendSms {
      
          public static final String accessKeyId = "你的accessKeyId ";
          public static final String accessKeySecret = "你的accessKeySecret ";
          public static final String templateCode = "SMS_154950909";
          public static final String signName = "阿里云短信测试";
      
          /**
           * 使用AK&SK初始化账号Client
           * @param accessKeyId
           * @param accessKeySecret
           * @return Client
           * @throws Exception
           */
          public static com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
              Config config = new com.aliyun.teaopenapi.models.Config()
                      // 您的 AccessKey ID
                      .setAccessKeyId(accessKeyId)
                      // 您的 AccessKey Secret
                      .setAccessKeySecret(accessKeySecret);
              // 访问的域名
              config.endpoint = "dysmsapi.aliyuncs.com";
              return new com.aliyun.dysmsapi20170525.Client(config);
          }
      
          /**
           * 获取6位验证码
           * @return
           */
          public  String getVerifyCode() {
              Long codeL = System.nanoTime();
              String codeStr = Long.toString(codeL);
              String verifyCode = codeStr.substring(codeStr.length() - 6);
              System.out.println("生成的6位验证码为:" + verifyCode);
              return verifyCode;
          }
      
          /**
           * 发送短信
           * @param phoneNumber   手机号
           * @throws Exception
           * @return   短信验证码(如果为null说明出现错误)
           */
          public String sendMessage(String phoneNumber) throws Exception {
              //随机生成6位验证码
              String verifyCode = this.getVerifyCode();
      
              Client client = SendSms.createClient(accessKeyId, accessKeySecret);
              com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
                      .setPhoneNumbers(phoneNumber)
                      .setSignName(signName)
                      .setTemplateCode(templateCode)
                      .setTemplateParam("{\"code\":\""+verifyCode+"\"}");
              com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
              try {
                  // 复制代码运行请自行打印 API 的返回值
                  SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, runtime);
                  System.out.println(sendSmsResponse.getBody().getMessage());
                  return verifyCode;
              } catch (TeaException error) {
                  // 如有需要,请打印 error
                  com.aliyun.teautil.Common.assertAsString(error.message);
              } catch (Exception _error) {
                  TeaException error = new TeaException(_error.getMessage(), _error);
                  // 如有需要,请打印 error
                  com.aliyun.teautil.Common.assertAsString(error.message);
              }
              return null;
          }
          
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65
      • 66
      • 67
      • 68
      • 69
      • 70
      • 71
      • 72
      • 73
      • 74
      • 75
      • 76
      • 77
      • 78
      • 79
      • 80
      • 81
      • 82
      • 83
      • 84
      • 85
    2. 新建短信发送业务

      /**
       * 发送短信业务
       * @Author caoHaiYang
       * @Date 2022/8/29 13:47
       */
      public interface SendMessageService {
      
          /**
           * 短信发送接口
           * @param phoneNumber
           * @return
           */
          int sendMessage(String phoneNumber) throws Exception;
      
          /**
           * 验证短信码
           * @param phoneNumber
           * @param verifyCode
           * @return
           */
          int verifyMessageCode(String phoneNumber, String verifyCode);
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
    3. 创建业务实现类

      这里的逻辑就是:
      发送短信接口传入手机号之后, 调用 sendSms.sendMessage 返回验证码, 然后将手机号作为key验证码作为value放入redis中并设置过期时间. 而在验证短信码接口调用时: 根据传入的手机号去redis中查验证码, 将查询到的验证码和接口传入的验证码进行比对. 成功返回1, 不成功返回0

      import com.ring.config.Constants;
      import com.ring.config.JedisPoolUtil;
      import com.ring.model.BannerBean;
      import com.ring.service.SendMessageService;
      import com.ring.sms.SendSms;
      import org.apache.commons.lang3.StringUtils;
      import org.springframework.stereotype.Service;
      import redis.clients.jedis.Jedis;
      
      import javax.annotation.Resource;
      
      /**
       * info:
       *
       * @Author caoHaiYang
       * @Date 2022/8/29 16:07
       */
      @Service
      public class SendMessageServiceImpl implements SendMessageService {
          @Resource
          private SendSms sendSms;
      
      
          @Override
          public int sendMessage(String phoneNumber) throws Exception {
              //通过阿里sms发送短信
              String verifyCode = sendSms.sendMessage(phoneNumber);
              if (StringUtils.isEmpty(verifyCode)) {
                  return 0;
              }
              //将短信保存到redis中
              Jedis jedis = null;
              try {
                  jedis = JedisPoolUtil.getJedis();
                  jedis.auth(Constants.REDIS_PASSWORD);
                  jedis.select(Constants.REDIS_DB);
                  jedis.setex(phoneNumber, 600, verifyCode);
                  return 1;
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return -1;
          }
      
          @Override
          public int verifyMessageCode(String phoneNumber, String verifyCode) {
              Jedis jedis = null;
              try {
                  jedis = JedisPoolUtil.getJedis();
                  jedis.auth(Constants.REDIS_PASSWORD);
                  jedis.select(Constants.REDIS_DB);
                  String currentVerifyCode = jedis.get(phoneNumber);
                  if (verifyCode.equals(currentVerifyCode)) {
                      return 1;
                  }
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return 0;
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
    4. 生成代码操作
      在测试完短信验证码后, 我们可以根据以下流程流程编写其他接口代码
      进入OpenApi页面 -> 添加参数 -> 发起调用 -> 复制生成的sdk代码 -> 封装并复用代码

    5. 当前阿里云短信服务可以提供的接口如下图所示
      在这里插入图片描述
      在这里插入图片描述

    查询发送详情

    发送成功后, 可以在短信服务控制台查看发送详情
    查看指定时段短信发送量
    在这里插入图片描述
    查看短信具体发送内容
    在这里插入图片描述 https://pan.baidu.com/s/1a3FeYANNIEo8ZvO5tIPeJg?pwd=pces


    链接:https://pan.baidu.com/s/1a3FeYANNIEo8ZvO5tIPeJg
    关注后进入私聊, 回复括号内关键字[ 短信服务 ] 获取阿里云短信服务jar包提取码

  • 相关阅读:
    为什么Google searxh console站点地图产品页无法抓取
    5分钟彻底搞懂this指向问题 (附练习题)
    《多线程案例》阻塞队列、定时器、线程池、饿汉与懒汉模式
    vue中el-dialog 中的内容没有预先加载,因此无法获得内部元素的ref 的解决方案 使用强制提前加载dialog方法
    基于Chirp窄带扩频技术的无线混合组网应用,以多角色智能计量插座作为Chirp广域基站,构建边缘计算混合无线网络
    stata17中java installation not found或java not recognozed的问题
    关于C51单片机程序太大如何处理
    【校招VIP】【约起来】高校大学生自己的商业项目|产品脑图的重要性:活动模型的细节
    进程和线程、协程的区别
    [Linux] 进程间通信基础
  • 原文地址:https://blog.csdn.net/qq_43371556/article/details/126589708