阿里云短信服务接入流程

背景

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

一. 熟悉整个对接流程

  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

扫描二维码关注公众号,回复: 14997158 查看本文章

整体流程
进入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;
        }
        
    }
    
    
  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);
    }
    
  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;
        }
    }
    
  4. 生成代码操作
    在测试完短信验证码后, 我们可以根据以下流程流程编写其他接口代码
    进入OpenApi页面 -> 添加参数 -> 发起调用 -> 复制生成的sdk代码 -> 封装并复用代码

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

查询发送详情

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


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

猜你喜欢

转载自blog.csdn.net/qq_43371556/article/details/126589708