Files

519 lines
18 KiB
PHP
Raw Permalink Normal View History

2025-11-10 16:12:07 +08:00
<?php
/**
* Created by PhpStorm.
* User: Shan
* Date: 2017/4/1
* Time: 17:37
*/
trait MyTrate{
static $url = '';
static $OperatorID = ''; //运营商标识
static $OperatorSecret= '';//运营商密钥
static $AesSecret = ''; //消息密钥
static $AesIv = ''; //消息密钥初始化向量
static $SigSecret =''; //签名密钥
static $Owner =''; //桩属主
static $TimeStamp =''; //桩属主
static $Seq =''; //桩属主'TimeStamp', 'Seq'
static function getTokenDate()
{
$datetime= date('YmdHis');
$kk['OperatorID']= self::$OperatorID;
$kk['OperatorSecret'] = self::$OperatorSecret;
$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;
$data= $rr;
return $data;
}
static function getStationDate($PageNo=1)
{
//LastQueryTime 字符串 格式“yyyy-MM-dd HH:mm:ss”可以为空如果不填写则查询所有的充电站信息
//PageNo 整型 不填写默认为1
//PageSize 整型 不填写默认为10
$datetime= date('YmdHis');
$kk['LastQueryTime']= '';
$kk['PageNo'] =$PageNo;
$kk['PageSize'] = 10;
$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;
$data= $rr;
return $data;
}
static function getToken($hour)
{
$redis=new \Redis();
$redis->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 '<pre/>';
// 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;
}
}