接入阿里云短信

  1. 使用阿里云短信接口则需要通过阿里云平台获取一些参数
    查看自己平台的key和id查看自己key
  2. 如果没有对应key值的需要自己创建新的key
  3. 添加签名和对应自己的模板
    签名
    添加模板
  4. 在项目如添加maven依赖包
    <!--阿里云短信-->
       <dependency>
           <groupId>com.aliyun</groupId>
           <artifactId>aliyun-java-sdk-core</artifactId>
           <version>4.0.6</version> <!-- 注:如提示报错,先升级基础包版,无法解决可联系技术支持 -->
       </dependency>
       <dependency>
           <groupId>com.aliyun</groupId>
           <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
           <version>1.1.0</version>
       </dependency>
  1. 编写实例代码
/**
     * 短信统一发送
     * @param tel  手机号
     * @param templateCode 模板id 对应阿里云后台模板
     * @return
     * @throws ClientException
     */
    @Override
    public Map<String, Object> getVerifyCodeLast(String tel, String templateCode, HttpServletRequest request) {

        Map<String, Object> map = chekTel(request, tel);
        if(map.get("status").equals(true)){
            SendSmsResponse sendSmsResponse = null;
            try {
                //可自助调整超时时间
                System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
                System.setProperty("sun.net.client.defaultReadTimeout", "10000");

                //初始化acsClient,暂不支持region化
                //初始化acsClient,暂不支持region化
                IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", Constants.accessKeyId, Constants.accessKeySecret);
                DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", Constants.product, Constants.domain);
                IAcsClient acsClient = new DefaultAcsClient(profile);

                //组装请求对象-具体描述见控制台-文档部分内容
                SendSmsRequest sendSmsRequest = new SendSmsRequest();
                //必填:待发送手机号
                sendSmsRequest.setPhoneNumbers(tel);
                //必填:短信签名-可在短信控制台中找到
                sendSmsRequest.setSignName(“替换自己的短信签名”);
                //必填:短信模板-可在短信控制台中找到
                sendSmsRequest.setTemplateCode(templateCode);
                //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
                //随机生成6位数短信验证码
                String code = Constants.getCode(6);

                Map<String, Object> resultMap = new HashMap<>();
                resultMap.put("code", code);
                JSONObject o = (JSONObject)JSONObject.toJSON(resultMap);
                String str = o.toString();
                sendSmsRequest.setTemplateParam(str);

                //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
                //request.setSmsUpExtendCode("90997");

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

                //hint 此处可能会抛出异常,注意catch
                sendSmsResponse = null;
                try {
                    sendSmsResponse = acsClient.getAcsResponse(sendSmsRequest);
                } catch (ClientException e) {
                    e.printStackTrace();
                }
                //通过session记录短信验证码 手机号等 后期与前台传来一同教验
                request.getSession().setAttribute(Constants.SESSION_PHONE_CODE,code);
                request.getSession().setAttribute(Constants.SERVER_TIME,new Date());
                request.getSession().setAttribute(Constants.SESSION_PHONE_NUMBER,tel);

                System.out.println("SESSION_PHONE_CODE="+request.getSession().getAttribute(Constants.SESSION_PHONE_CODE)+
                        ",SERVER_TIME="+request.getSession().getAttribute(Constants.SERVER_TIME)+
                        ",SESSION_PHONE_NUMBER="+request.getSession().getAttribute(Constants.SESSION_PHONE_NUMBER));
				//入库短信记录
                MessageLog messageLog = new MessageLog();
                messageLog.setCreateAt(new Date());
                messageLog.setPhone(tel);
                messageLog.setContent(code);
                messageLog.setSendId(FilterContextHandler.getUserId());
                messageLog.setIpAddress(TCPIPUtil.getIpAddr(request));
                messageLog.setModuleId(templateCode);
                if(sendSmsResponse.getCode().equals("OK")) {
                    messageLog.setStatus(DicEnum.短信发送_成功.getCode());
                }else{
                    messageLog.setStatus(DicEnum.短信发送_失败.getCode());
                }
                messageLogDao.insertSelective(messageLog);
                if(sendSmsResponse.getCode().equals("OK")){
                    map.put("status",true);
                    map.put("msg","短信发送成功");
                } else {
                    map.put("status",false);
                    map.put("msg",sendSmsResponse.getMessage());
                }
            } catch (ClientException e) {
                e.printStackTrace();
                map.put("status",false);
                map.put("msg","短信发送失败--no");
                return map;
            }
        }
        return map;
    }

校验短信一些流程 可更具自己条件添加

  /**
     * 短信校验 是否合格
     * @param request
     * @param tel
     * @return
     */
    private Map<String,Object> chekTel(HttpServletRequest request,String tel){
        Map<String, Object> map = new HashMap<>();

        if(tel == null || "".equals(tel) || !Utils.isPhone(tel)) {
            map.put("msg", "手机号不正确");
            map.put("status", false);
            return map;
        }
        //获取发送短信的ip地址
        String ip = TCPIPUtil.getIpAddr(request);
        logger.debug("发送短信验证码,IP地址:" + ip + "手机号码:" + tel);

        //判断是否达到短信发送时间间隔
        int intervalTime = 60;//若没有设置,则默认60秒
        SysParam param = sysParamDao.selectOne(SysParam.builder().paramIndex(Constants.SMS_SEND_SMS_INTERVAL_TIME).build());
        if(param != null) {
            intervalTime = Integer.valueOf(param.getParamValue());
        }
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.SECOND, - intervalTime);
        MessageLog messageLog = new MessageLog();
        messageLog.setCreateAt(cal.getTime());
        messageLog.setPhone(tel);
        long count = messageLogDao.getCount(messageLog);
        //获取是否过于频繁
        if(count > 0){
            logger.debug("短信发送过于频繁,请" + intervalTime + "秒再稍后尝试");
            map.put("msg", "短信发送过于频繁,请" + intervalTime + "秒再稍后尝试");
            map.put("status", false);
            return map;
        }
        //判断是否被设置了IP黑名单
        if(ip != null && !"".equals(ip)) {
            param = sysParamDao.selectOne(SysParam.builder().paramIndex(Constants.SMS_BLACK_NAME_LIST_OF_IP).build());
            if(param != null && param.getParamValue() != null && param.getParamValue().contains(ip)) {
                logger.debug("您的IP已禁用,请联系客服");
                map.put("msg", "您的IP已禁用,请联系客服");
                map.put("status", false);
                return map;
            }
        }

        //判断是否被设置了手机号黑名单
        param = sysParamDao.selectOne(SysParam.builder().paramIndex(Constants.SMS_BLACK_NAME_LIST_OF_PHONE).build());
        if(param != null && param.getParamValue() != null && param.getParamValue().contains(tel)) {
            logger.debug( "您的手机号已禁用,请联系客服");
            map.put("msg", "您的手机号已禁用,请联系客服");
            map.put("status", false);
            return map;
        }

        //判断是否达到IP发送短信上限
        cal.add(Calendar.SECOND, intervalTime);
        cal.add(Calendar.DAY_OF_YEAR, -1);
        messageLog.setCreateAt(cal.getTime());
        if(ip != null && !"".equals(ip)) {
            param = sysParamDao.selectOne(SysParam.builder().paramIndex(Constants.SMS_PER_IP_SMS_MAX_NUM).build());
            if(param != null) {
                messageLog.setIpAddress(ip);
                count = messageLogDao.getCount(messageLog);
                if(count > Integer.valueOf(param.getParamValue()) - 1) {
                    logger.debug( "您的IP在24小时内已超过访问累计上限");
                    map.put("msg", "您的IP在24小时内已超过访问累计上限");
                    map.put("status", false);
                    return map;
                }
            }
        }

        //判断是否达到手机号发送短信上限
        param = sysParamDao.selectOne(SysParam.builder().paramIndex(Constants.SMS_PER_PHONE_SMS_MAX_NUM).build());
        if(param != null) {
            messageLog.setPhone(tel);
            count = messageLogDao.getCount(messageLog);
            if(count > Integer.valueOf(param.getParamValue()) - 1) {
                logger.debug( "您的手机号在24小时内已超过访问累计上限");
                map.put("msg", "您的手机号在24小时内已超过访问累计上限");
                map.put("status", false);
                return map;
            }
        }
        map.put("status", true);
        return map;
    }

至此就完成了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值