connect('127.0.0.1',6379); $value=$redis->get(self::$Owner.'Token'); if($value==false){ $data = self::getTokenDate(); $url = self::$url . 'query_token'; $da = self::CurlSend($url, $data); $decode = self::decryptString($da['Data']); $decode = json_decode($decode, true); $token = $decode['AccessToken']; $redis->set(self::$Owner.'Token',$token,3500*$hour); }else{ $token=$redis->get(self::$Owner.'Token'); } return $token; } static function CurlSend($url, $data = '', $token = '') { $data = json_encode($data); $ch = curl_init(); $headers = array(); if ($token) { $headers[] = 'Authorization: Bearer ' . $token; } $headers[] = 'Content-Type: application/json;charset=utf-8'; $headers[] = 'Content-Length: ' . strlen($data); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在 curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $curl_return = curl_exec($ch); curl_close($ch); return json_decode(trim($curl_return), true); } static function checkParams($params){ $arr = ['OperatorID', 'Data', 'TimeStamp', 'Seq','Sig']; // 参数检查 foreach ($arr as $v) { if (empty($params[$v])) { return $v; } } self::$TimeStamp=$params['TimeStamp']; self::$Seq=$params['Seq']; return 2; } /** * @param $OperatorID * @param $params * @return int|string */ static function checkSig($OperatorID,$params){ $sig=$OperatorID.$params['Data'].$params['TimeStamp'].$params['Seq']; $ecry_sig=self::hmac_md5($sig); if($params['Sig']!=$ecry_sig){ return 1; } return 2; } static function fillParams($OperatorID){ $datas=self::getParams($OperatorID); if(empty($datas)){ return 1; } self::$OperatorID = $OperatorID; self::$OperatorSecret= $datas['OperatorSecret']; self::$AesSecret = $datas['AesSecret']; self::$AesIv = $datas['AesIv']; self::$SigSecret =$datas['SigSecret']; self::$Owner =$datas['Owner']; } /** * @param $data * @param $ret * @param string $msg * @return string */ static function encodeData($data,$ret,$msg=''){ $data=json_encode($data); $data=self::encryptString($data); $seq=empty(self::$Seq)? '0001' : self::$Seq; $datetime=empty(self::$TimeStamp)? date('YmdHis') :self::$TimeStamp; $sig= self::$OperatorID . $data . $datetime . $seq; $s= self::hmac_md5($sig); return ['Msg'=>$msg,'Ret'=>$ret,'Data'=>$data,'Sig'=>$s]; } static function getStr(){ return Yii::$app->security->generateRandomString(); } static function checkToken($token){ $redis=Common::createRedis(); $key='token-'.self::$Owner.'-'; $redisToken=$redis->get($key); if($redisToken&&($redisToken==$token)){ return 2; } return 1; } static function getParams($OperatorID){ $datas=[];// $datas里面是企业信息数组 $arr=[]; foreach ($datas as $k=> $v){ if($v['OperatorID']==$OperatorID){ $arr=$datas[$k]; } } return $arr; } static function getFile ($filename) { $ret = @file_get_contents($filename); return json_decode($ret, true); } /** * @param $log * @param $filename */ static function setFile ($log, $filename,$append=False){ if (!is_dir(dirname($filename))) { mkdir(dirname($filename), 0777, true); @chmod(dirname($filename), 0777); } @chmod($filename, 0777); if($append==true){ file_put_contents($filename, json_encode($log)."\r\n",FILE_APPEND); }else{ file_put_contents($filename, json_encode($log)); } } static function hmac_md5($s) { $ctx = hash_init('md5', HASH_HMAC,self::$SigSecret); hash_update($ctx, $s); $rs = hash_final($ctx); $rs = strtoupper($rs); return $rs; } static function encryptString($input) { $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $input = self::pkcs5_pad($input, $size); $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); mcrypt_generic_init($td, self::$AesSecret, self::$AesIv); $data = mcrypt_generic($td, $input); mcrypt_generic_deinit($td); mcrypt_module_close($td); $data = base64_encode($data); return $data; } static function pkcs5_pad($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad), $pad); } static function decryptString($sStr) { mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); //$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); $iv = self::$AesIv; $decrypted = @mcrypt_decrypt(MCRYPT_RIJNDAEL_128, self::$AesSecret, base64_decode($sStr), MCRYPT_MODE_CBC, $iv); $dec_s = strlen($decrypted); $padding = ord($decrypted[$dec_s - 1]); $decrypted = substr($decrypted, 0, -$padding); return $decrypted; } static function getCityCode(){ $file = file(Yii::getAlias('@app').'/commands/areaCode.txt'); $files = array(); foreach($file as $v){ $f = explode(' ',$v); //这里用trim()函数去除头尾的空格不起效果,因为是全角格式。所以用功能更强大的正则来去除空格 $f[1] = mb_ereg_replace('^( | )+', '', $f[1]); array_push($files,$f); } return $files; } static function getCityName($AreaCode,$cityCode){ $city=''; $pattern='/^(500)/'; if(preg_match($pattern,$AreaCode)) $city='重庆市'; $pattern='/^(310)/'; if(preg_match($pattern,$AreaCode)) $city='上海市'; $pattern='/^(120)/'; if(preg_match($pattern,$AreaCode)) $city='天津市'; $pattern='/^(110)/'; if(preg_match($pattern,$AreaCode)) $city='北京市'; $pattern='/^(4690)/'; if(preg_match($pattern,$AreaCode)){ $code=$AreaCode; }else{ $code=substr($AreaCode,0,4).'00'; } if(empty($city)){ foreach ($cityCode as $v1){ if($v1[0]==$code){ $city=$v1[1]; } } } return $city; } //php5.5不支持array_column() static function formArr($piles){ $arr=[]; foreach ($piles as $v){ $arr[]=$v['pile_id']; } return $arr; } static function insertPile($stations,$pile) { $time=time(); $arr=[]; foreach ($stations['StationInfos'] as $v){ foreach ($v['EquipmentInfos'] as $v1){ if($pile&&in_array($v1['EquipmentID'],$pile)) continue; $station_status=($v['StationStatus']==50)? 1 : 0; if($v1['EquipmentID']) $arr[]=[$v1['EquipmentID'],self::$Owner,$v['StationID'],$v1['EquipmentType'],$time,$station_status]; } } if($arr) @Yii::$app->db->createCommand()->batchInsert('pile', ['pile_id', 'owner','zhan_id','eleType','time','station_status'], $arr)->execute(); } static function insertPic($arr=[],$id,$owner){ $imgDir=[]; foreach ($arr as $v){ if($v){ $dirInfo=self::getImage($v,$owner); if($dirInfo['save_path']!=2){ $imgDir[]=[ 'url'=>$dirInfo['save_path'], 'zhan_id'=>$id, 'timer'=>date('Y-m-d H:i:s'), 'user'=>'', 'ischeck'=>0 ]; } } } if($imgDir){ Yii::$app->db->createCommand()->batchInsert(Zhanpic::tableName(), ['url','zhan_id','timer','user','ischeck'], $imgDir)->execute(); } } static function getImage($url,$owner){ $filename=substr($url,(strripos($url,'/')+1)); if($filename=='default.png') return ['save_path'=>2]; ob_start(); @readfile($url); $img=ob_get_contents(); ob_end_clean(); if($img){ $sub_dir=$owner.'/'.date('Y-m-d').'/'; $dir=Yii::getAlias('@app').'/../uploadfile/'.$sub_dir; if(!file_exists($dir)){ mkdir($dir,0777,true); } $fp2=@fopen($dir.$filename,'a'); fwrite($fp2,$img); fclose($fp2); unset($img,$url); return ['save_path'=>$sub_dir.$filename]; }else{ return ['save_path'=>2]; } } static function insertInfo($hour){ $token=self::getToken($hour); if(!$token) die('token 不能为空'); $data = self::getStationDate(); $url = self::$url.'query_stations_info'; $da = self::CurlSend($url, $data, $token); $stations=self::decryptString($da['Data']); $stations=json_decode($stations,true); // echo '
';
//        print_r($stations);
//        die();
        if($stations){
            $sql = "SELECT pile_id FROM pile  where owner=:owner ";
            $piles = Yii::$app->db->createCommand($sql, [':owner' => self::$Owner])->queryAll();
            if($piles)
                $piles=self::formArr($piles);
            self::insertPile($stations,$piles);
            $zhanList=Zhanlist::find()->select(['zhan_id'])->where(['supplier'=>self::$Owner])->asArray()->all();
            if(!empty($zhanList)){
                $aa=[];
                foreach ($zhanList as $k=>$v){
                    $aa[]=$v['zhan_id'];
                }
                $zhanList=$aa;
            }

            $cityCode=static::getCityCode();

            self::insertStation($stations,$cityCode,$zhanList);

            $page=$stations['PageCount'];
            //所有页信息
            for($i=2;$i<=$page;$i++){
                $data2=self::getStationDate($i);
                $da2 = self::CurlSend($url, $data2, $token);
                $da2=self::decryptString($da2['Data']);
                $da2=json_decode($da2,true);
                if($da2)
                    self::insertStation($da2,$cityCode,$zhanList);
                self::insertPile($da2,$piles);
            }
        }
    }
    static function padZero($str){
        $len=strlen(substr($str,strpos($str,'.')+1));
        $len=16-$len;
        for($i=0;$i<$len;$i++){
            $str.=0;
        }
        return $str;
    }
    static function pushCheck($fileName='change_status.txt'){
        $authorization=Yii::$app->request->headers->get('Authorization');
        $params=file_get_contents('php://input');
        $params=json_decode($params,true);
//        if(!empty($fileName))
//        self::writeLog($fileName,$params);
        $auths=explode(' ',trim($authorization));
        $auth=$auths[count($auths)-1];

        $checkParams=self::checkParams($params);
        if($checkParams!=2)
            return ['Msg'=>$checkParams.'为空','Ret'=>4003,'Data'=>['Status'=>1]];

        $re=self::fillParams($params['OperatorID']);
        if($re==1)
            return ['Msg'=>'OperatorID不存在','Ret'=>4003,'Data'=>['Status'=>1]];

        if($auth){
            if(self::checkToken($auth)==1)
                return self::encodeData(['Status'=>1],4002,'Token过期或者无效');
            $checkSig=self::checkSig($params['OperatorID'],$params);
            if($checkSig==1)
                return self::encodeData(['Status'=>1],4001,'签名错误');

            $data=self::decryptString($params['Data']);
            $data=json_decode($data,true);
//            if(!empty($fileName))
//            self::writeLog($fileName,$data);
            return ['code'=>200,'data'=>$data];
        }
        return self::encodeData(['Status'=>1],4002,'Bearer 未添加');
    }
    static function writeLog($name,$arr){
        if(is_array($arr)){
            if (@$_SERVER["HTTP_X_FORWARDED_FOR"])
                $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
            else if (@$_SERVER["HTTP_CLIENT_IP"])
                $ip = $_SERVER["HTTP_CLIENT_IP"];
            else if (@$_SERVER["REMOTE_ADDR"])
                $ip = $_SERVER["REMOTE_ADDR"];
            else if (@getenv("HTTP_X_FORWARDED_FOR"))
                $ip = getenv("HTTP_X_FORWARDED_FOR");
            else if (@getenv("HTTP_CLIENT_IP"))
                $ip = getenv("HTTP_CLIENT_IP");
            else if (@getenv("REMOTE_ADDR"))
                $ip = getenv("REMOTE_ADDR");
            else
                $ip = $_SERVER['REMOTE_ADDR'];
            $pushTime=['logTime'=>date('Y-m-d H:i:s',time()),'ip'=>$ip];
            $arr=array_merge($pushTime,$arr);
            $sub_dir=date('Y-m-d');
            $dir=Yii::getAlias('@app').'/../../../'.$sub_dir.'/'.$name;
            self::setFile($arr,$dir,true);
        }
    }
    public static function initeStatus(){
        $redis=Common::createRedis();
        $datas=Zhanlist::find()->select(['zhan_id'])->where(['supplier'=>self::$Owner])->asArray()->all();
        $token=self::getToken(2);
        self::$url=self::$url.'query_station_status';
        $data=[];
        foreach ($datas as $k=>$v){
            $data[]=$v['zhan_id'];
            $i=$k+1;
            if($i%25==0){
                $dd=self::statusDate($data);
                $da = self::CurlSend(self::$url, $dd,$token);
                $decode = self::decryptString($da['Data']);
                $decode = json_decode($decode, true);
                if($decode){
                    foreach ($decode['StationStatusInfos'] as $v1){

                        foreach ($v1['ConnectorStatusInfos'] as $v2){
                            $key=self::$Owner.'--'.$v2['ConnectorID'];
                            $value=$v2['Status'];
                            $redis->set($key,$value);
                        }
                    }
                }
                $data=[];
            }
        }
        if($data){
            $dd=self::statusDate($data);
            $da = self::CurlSend(self::$url, $dd,$token);
            $decode = self::decryptString($da['Data']);
            $decode = json_decode($decode, true);
            if($decode){
                if($decode['StationStatusInfos']){
                    foreach ($decode['StationStatusInfos'] as $v1){
                        if(empty($decode['ConnectorStatusInfos']))
                            continue;
                        foreach ($v1['ConnectorStatusInfos'] as $v2){
                            $key=self::$Owner.$v2['ConnectorID'];
                            $value=$v2['Status'];
                            $redis->set($key,$value);
                        }
                    }
                }
            }
        }
    }
    public static function statusDate($id){
        $datetime= date('YmdHis');
        $kk['StationIDs']=$id;
        $en = self::encryptString(json_encode($kk));
        $sig= self::$OperatorID . $en . $datetime . "0002";
        $s= self::hmac_md5($sig);
        $rr['OperatorID'] = self::$OperatorID;
        $rr['Data']= $en;
        $rr['TimeStamp']= $datetime;
        $rr['Seq']= '0002';
        $rr['Sig'] = $s;
        return $rr;
    }
}