jeecg框架学习纪录 【 阿里云短信发送验证码 平台配置和项目中使用】

文章目录

    • jeecg
    • 项目效果展示
      • 短息通知页面入口
      • 代码中调用短信api 配置和代码
      • API中的重要参数配置项:
    • 阿里控制台注册
      • 注册签名
      • 注册短信模板

 阿里云短信发送验证码配置和项目使用


jeecg

第一次接触jeecg框架后,对这个框架就很喜欢,Jeecg是一款基于SpringBoot+代码生成器的快速开发平台!采用前后端分离架构:SpringBoot,Mybatis,Shiro,JWT,Vue&Ant Design。强大的代码生成器让前端和后台代码一键生成。作为一个公司全栈打杂码农,有了这个框架,可以提高工作效率。好学不如烂笔头,记录一下,以后难免会再次使用到。

项目效果展示

短息通知页面入口


这是一个页面注册页面,发送验证码到用户手机

jeecg框架学习纪录 【 阿里云短信发送验证码 平台配置和项目中使用】_第1张图片
vue代码展示:

<a-col class="gutter-row" :span="8">
  <a-button
    class="getCaptcha"
    tabindex="-1"
    :disabled="state.smsSendBtn"
    @click.stop.prevent="getCaptcha"
    v-text="!state.smsSendBtn && '获取验证码' || (state.time+' s')"></a-button>
</a-col>

getCaptcha方法:

getCaptcha (e) {
  e.preventDefault();
  let that = this;
  this.form.validateFields([ 'mobile' ], { force: true },(err,values) => {
      if(!values.mobile){
        that.cmsFailed("请输入手机号");
      }else if (!err) {
        this.state.smsSendBtn = true;
        let interval = window.setInterval(() => {
          if (that.state.time-- <= 0) {
            that.state.time = 60;
            that.state.smsSendBtn = false;
            window.clearInterval(interval);
          }
        }, 1000);

        const hide = this.$message.loading('验证码发送中..', 0);
        let smsParams = {};
            smsParams.mobile=values.mobile;
            smsParams.smsmode="0";
        postAction("/sys/sms",smsParams)
          .then(res => {
            if(!res.success){
              setTimeout(hide, 0);
              this.cmsFailed(res.message);
            }
            console.log(res);
            setTimeout(hide, 500);
          })
          .catch(err => {
            setTimeout(hide, 1);
            clearInterval(interval);
            that.state.time = 60;
            that.state.smsSendBtn = false;
            this.requestFailed(err);
          });
      }
    }
  );
}

代码中调用短信api 配置和代码

/sys/sms 控制层代码:

/**
 * 短信登录接口
 * 
 * @param jsonObject
 * @return
 */
@PostMapping(value = "/sms")
public Result<String> sms(@RequestBody JSONObject jsonObject) {
   Result<String> result = new Result<String>();
   String mobile = jsonObject.get("mobile").toString();
   //手机号模式 登录模式: "2"  注册模式: "1"
   String smsmode=jsonObject.get("smsmode").toString();
   log.info(mobile);
   if(oConvertUtils.isEmpty(mobile)){
      result.setMessage("手机号不允许为空!");
      result.setSuccess(false);
      return result;
   }
   Object object = redisUtil.get(mobile);
   if (object != null) {
      result.setMessage("验证码10分钟内,仍然有效!");
      result.setSuccess(false);
      return result;
   }

   //随机数
   String captcha = RandomUtil.randomNumbers(6);
   JSONObject obj = new JSONObject();
       obj.put("code", captcha);
   try {
      boolean b = false;
      //注册模板
      if (CommonConstant.SMS_TPL_TYPE_1.equals(smsmode)) {
         SysUser sysUser = sysUserService.getUserByPhone(mobile);
         if(sysUser!=null) {
            result.error500(" 手机号已经注册,请直接登录!");
            sysBaseAPI.addLog("手机号已经注册,请直接登录!", CommonConstant.LOG_TYPE_1, null);
            return result;
         }
         b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.REGISTER_TEMPLATE_CODE);
      }else {
         //登录模式,校验用户有效性
         SysUser sysUser = sysUserService.getUserByPhone(mobile);
         result = sysUserService.checkUserIsEffective(sysUser);
         if(!result.isSuccess()) {
            return result;
         }
         
         /**
          * smsmode 短信模板方式  0 .登录模板、1.注册模板、2.忘记密码模板
          */
         if (CommonConstant.SMS_TPL_TYPE_0.equals(smsmode)) {
            //登录模板
            b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.LOGIN_TEMPLATE_CODE);
         } else if(CommonConstant.SMS_TPL_TYPE_2.equals(smsmode)) {
            //忘记密码模板
            b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.FORGET_PASSWORD_TEMPLATE_CODE);
         }
      }

      if (b == false) {
         result.setMessage("短信验证码发送失败,请稍后重试");
         result.setSuccess(false);
         return result;
      }
      //验证码10分钟内有效
      redisUtil.set(mobile, captcha, 600);
      //update-begin--Author:scott  Date:20190812 for:issues#391
      //result.setResult(captcha);
      //update-end--Author:scott  Date:20190812 for:issues#391
      result.setSuccess(true);

   } catch (ClientException e) {
      e.printStackTrace();
      result.error500(" 短信接口未配置,请联系管理员!");
      return result;
   }
   return result;
}

随机生成6位验证码

String captcha = RandomUtil.randomNumbers(6);
JSONObject obj = new JSONObject();
   obj.put("code", captcha);

选择短信模板

/**
 * smsmode 短信模板方式  0 .登录模板、1.注册模板、2.忘记密码模板
 */
if (CommonConstant.SMS_TPL_TYPE_0.equals(smsmode)) {
   //登录模板
   b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.LOGIN_TEMPLATE_CODE);
} else if(CommonConstant.SMS_TPL_TYPE_2.equals(smsmode)) {
   //忘记密码模板
   b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.FORGET_PASSWORD_TEMPLATE_CODE);
}

sendSms 方法:

public static boolean sendSms(String phone,JSONObject templateParamJson,DySmsEnum dySmsEnum) throws ClientException {
   //可自助调整超时时间
    System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
    System.setProperty("sun.net.client.defaultReadTimeout", "10000");
    
    //初始化acsClient,暂不支持region化
    IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
    DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
    IAcsClient acsClient = new DefaultAcsClient(profile);
    
    //验证json参数
    validateParam(templateParamJson,dySmsEnum);
    
    //组装请求对象-具体描述见控制台-文档部分内容
    SendSmsRequest request = new SendSmsRequest();
    //必填:待发送手机号
    request.setPhoneNumbers(phone);
    //必填:短信签名-可在短信控制台中找到
    request.setSignName(dySmsEnum.getSignName());
    //必填:短信模板-可在短信控制台中找到
    request.setTemplateCode(dySmsEnum.getTemplateCode());
    //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
    request.setTemplateParam(templateParamJson.toJSONString());
    
    //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
    //request.setSmsUpExtendCode("90997");

    //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
    //request.setOutId("yourOutId");

    boolean result = false;

    //hint 此处可能会抛出异常,注意catch
    SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
    logger.info("短信接口返回的数据----------------");
    logger.info("{Code:" + sendSmsResponse.getCode()+",Message:" + sendSmsResponse.getMessage()+",RequestId:"+ sendSmsResponse.getRequestId()+",BizId:"+sendSmsResponse.getBizId()+"}");
    if ("OK".equals(sendSmsResponse.getCode())) {
        result = true;
    }
    return result;
    
}

API中的重要参数配置项:

这两个参数是固定配置项,不需要修改
product :“Dysmsapi” 产品名称:云通信短信API产品,
domain:"dysmsapi.aliyuncs.com" 产品域名

这两项是开发者自己的AccessKey,在阿里云平台上可以查看:
accessKeyId:“xxxxxx” 开发者自己的 用户AccessKey
accessKeySecret:“xxxxxxx”开发者自己的 AccessKey Secret
jeecg框架学习纪录 【 阿里云短信发送验证码 平台配置和项目中使用】_第2张图片

阿里控制台注册

注册签名

jeecg框架学习纪录 【 阿里云短信发送验证码 平台配置和项目中使用】_第3张图片
jeecg框架学习纪录 【 阿里云短信发送验证码 平台配置和项目中使用】_第4张图片
添加成功后,需要1~2小时的审核;审核通过 就可以正常使用。

注册短信模板

jeecg框架学习纪录 【 阿里云短信发送验证码 平台配置和项目中使用】_第5张图片平台根据 使用范围提供了模板库
jeecg框架学习纪录 【 阿里云短信发送验证码 平台配置和项目中使用】_第6张图片
添加成功后,也是需要1~2小时的审核;

你可能感兴趣的:(_,記,java实战,java,vue,spring,boot,短信,阿里大于,SDK)