短信通知限制

4 篇文章 0 订阅

class SmsLimitService
{

    /**
     * 全局限制
     * @return bool
     * @author: mzc
     * @date:2017/10/13 9:47
     */
    public static function globalLimit($params,$smsType){
        $appId = $params['appId']; //应用ID
        $tel = $params['tel']; //手机号

        //1. ip白名单限制
        /*$ip = get_client_ip();
        $whiltListIp = M('WhiteList')->field("INET_NTOA(ip) as ip")->select();
        $whiltListIp = array_column($whiltListIp,'ip');

        $res = self::whiteListLimit($ip,$whiltListIp);
        if(!$res){
            apiResponse(CodeModel::ERROR, $ip.'不在白名单列表里');
        }*/

        //2.同一手机号多少秒内不能重复发,默认30s
        $limitTime = 30;
        $cacheName =$appId.$tel.$smsType.$limitTime;//应用.电话号码.短信类型(普通短信,语音通知.时间
        $res = self::secondsLimit($limitTime,$cacheName);
        if(!$res){
            apiResponse(CodeModel::ERROR, '同一手机号'.$limitTime.'内不能重复发送');
        }

        //3. 同一手机号1小时内限制多少条短信(语音)发送,
        $limitNum = 3;
        $hour = 1;
        $limitTime = $hour*3600;
        $cacheStartTime = $appId.$tel.$smsType.$limitTime;//应用.电话号码.短信类型(普通短信,语音通知.时间
        $cacheNameNum = $appId.$tel.$smsType.$limitTime.$limitNum;
        $res = self::hourLimit($limitNum,$limitTime,$cacheStartTime,$cacheNameNum);
        if(!$res){
            apiResponse(CodeModel::ERROR,'同一手机号'.$limitTime.'小时内限制'.$limitNum.'条短信(语音)发送');
        }


        //4. 同一手机号1天内限制多少条短信发送,
        $limitNum = 3;
        $day = 1;
        $limitTime = $day*24*3600;
        $cacheStartTime = $appId.$tel.$smsType.$limitTime;//应用.电话号码.短信类型(普通短信,语音通知.时间
        $cacheNameNum = $appId.$tel.$smsType.$limitTime.$limitNum;
        $res = self::DayLimit($limitNum,$limitTime,$cacheStartTime,$cacheNameNum);
        if(!$res){
            apiResponse(CodeModel::ERROR,'同一手机号'.$limitTime.'天内限制'.$limitNum.'条短信(语音)发送');
        }
    }


    /**
     * ip白名单限制
     * @return bool
     * @author: mzc
     * @date:2017/10/13 9:46
     */
    private static function  whiteListLimit($ip,$whiltListIp){
        if(in_array($ip,$whiltListIp)){
            return true;
        }else{
            return false;
        }
    }

    /**
     * 多少秒内不能重复发,默认30s
     * @return bool
     * @author: mzc
     * @date:2017/10/13 9:46
     */
    private static function secondsLimit($limitTime,$cacheName){
        if(empty(S($cacheName))){
            S($cacheName,1,$limitTime); //缓存时间
            return true;
        }else{
            return false;
        }


        /*if(empty(S($cacheName))){
            S($cacheName,time()); //第一次发送时,缓存起时间
        }

        $nextTime = time();//本次发送时间

        $preTime = S($cacheName);//获取前一次发送时间

        if($nextTime-$preTime<$limitTime){
            return false;
        }else{
            S($cacheName,$nextTime);
            return true;
        }*/
    }

    /**
     * 1小时内限制多少条短信发送,默认3条
     * @return bool
     * @author: mzc
     * @date:ct
     */
    private static function hourLimit($limitNum=3,$limitTime=3600,$cacheStartTime,$cacheNameNum){
        return self::limitSend($limitNum,$limitTime,$cacheStartTime,$cacheNameNum);
    }

    /**
     * 1天内限制多少条短信发送,默认10条
     * @return bool
     * @author: mzc
     * @date:2017/10/13 9:46
     */
    private static function dayLimit($limitNum=10,$limitTime,$cacheStartTime,$cacheNameNum){
        return self::limitSend($limitNum,$limitTime,$cacheStartTime,$cacheNameNum);
    }

    public static function clear($redis,$key){
        $redis->rm($key);
    }


    private static function limitSend($limitNum,$limitTime,$cacheStartTime,$cacheNameNum){
        $redis = Cache::getInstance('redis');

//        $redis->clear();
//        exit;

        $startTime = $redis->get($cacheStartTime);
        $num = $redis->get($cacheNameNum);

        if(empty($startTime)&&empty($num)){
            $redis->set($cacheStartTime,time(),$limitTime);
            $redis->set($cacheNameNum,1,$limitTime);
            return true;
        }else{
            $nextTime = time();
//           echo $startTime.':'.$nextTime.':'.$num.':'.$limitNum;
            if($nextTime-$startTime<$limitTime&&$num>$limitNum){
                return false;
            }else{
                $prefix = C('DATA_CACHE_PREFIX'); //必须加,因为在set,get的时候会默认加上这个
                $redis->incr($prefix.$cacheNameNum);
                return true;
            }
        }
    }

}

具体参考


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值