Files
MeSHard 94f7e83679 init
2025-11-10 16:12:07 +08:00

519 lines
18 KiB
PHP
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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;
}
}