Files
charge-pile-serve/app/common.php
MeSHard 94f7e83679 init
2025-11-10 16:12:07 +08:00

341 lines
11 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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
// 应用公共文件
namespace app;
use app\controller\Aes;
use app\controller\HMACMD5;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
class common
{
function generate_order($length)
{
$chars = '0123456789';
$time = time();
$password = 'DZZS' . $time;
for ($i = 0; $i < $length; $i++) {
$password .= $chars[mt_rand(0, strlen($chars) - 1)];
}
return $password;
}
function generate_EquipmentAuth($length)
{
$chars = '0123456789';
$time = time();
$password = config('hard.OperatorID') . $time . '1';//1代表是生成的设备认证流水号
for ($i = 0; $i < $length; $i++) {
$password .= $chars[mt_rand(0, strlen($chars) - 1)];
}
return $password;
}
function generate_StartChargeSeq($length)
{
$chars = '0123456789';
$time = time();
$password = config('hard.OperatorID') . $time . '2';//2代表是生成的充电订单号
for ($i = 0; $i < $length; $i++) {
$password .= $chars[mt_rand(0, strlen($chars) - 1)];
}
return $password;
}
function returnFree($dian, $fu)
{
$time = date('H:i', time());
// 计算当前电费
$dian_1 = '0.00';
$ElectricityFee = str_replace('电费:', '', $dian);
$Elect = explode(',', $ElectricityFee);
$dian_arr = [];
for ($index = 0; $index < count($Elect); $index++) {
$dian_arr[$index]['time_interval'] = substr($Elect[$index], 0, 11);
$start_time = substr($Elect[$index], 0, 5);
$end_time = substr($Elect[$index], 6, 5);
$dian_arr[$index]['price'] = substr($Elect[$index], 12, 4);
$dian_arr[$index]['dian_1'] = '';
if ($start_time < $time && $end_time > $time) {
$dian_arr[$index]['dian_1'] = explode(':', $Elect[$index])[3];
$dian_1 = explode(':', $Elect[$index])[3];
}
}
// 计算服务费
$fu_1 = '0.00';
$ServiceFee = str_replace('服务费:', '', $fu);
$Elect = explode(',', $ServiceFee);
$fu_arr = [];
for ($index = 0; $index < count($Elect); $index++) {
$fu_arr[$index]['time_interval'] = substr($Elect[$index], 0, 11);
$start_time = substr($Elect[$index], 0, 5);
$end_time = substr($Elect[$index], 6, 5);
$fu_arr[$index]['price'] = substr($Elect[$index], 12, 4);
$fu_arr[$index]['fu_1'] = '';
if ($start_time < $time && $end_time > $time) {
$fu_arr[$index]['dian_1'] = explode(':', $Elect[$index])[3];
$fu_1 = explode(':', $Elect[$index])[3];
}
}
foreach ($dian_arr as $key => &$value) {
$value['dian_1'] = false;
$start_time = substr($value['time_interval'], 0, 5);
$end_time = substr($value['time_interval'], 6, 5);
if ($start_time < $time && $end_time > $time) {
$value['dian_1'] = true;
}
foreach ($fu_arr as $kk => $vv) {
if ($value['time_interval'] == $vv['time_interval']) {
$value['price'] = number_format((double)$value['price'], 4);
$value['fu_price'] = number_format((double)$vv['price'], 4);
$value['total_price'] = number_format($vv['price'] + $value['price'], 4);
} else {
continue;
}
}
}
return ['time_price' => number_format($dian_1 + $fu_1, 4), 'price_list' => $dian_arr];
}
function getMonthDate($date)
{
$date_t = array();
$date_t[] = $date;
for ($i = 0; $i < 4; $i++) {
$this_date = strtotime($date);
$next_date = date("Y-m-d", strtotime('next monday', $this_date));
$date_t[] = $next_date;
$date = $next_date;
}
return $date_t;
}
function getSeasonDate($date)
{
$date_t = array();
$date_t[] = $date;
for ($i = 0; $i < 2; $i++) {
$this_date = strtotime($date);
$next_date = date("Y-m-d", strtotime('next month', $this_date));
$date_t[] = $next_date;
$date = $next_date;
}
return $date_t;
}
function getYearDate($date)
{
$date_t = array();
$date_t[] = $date;
for ($i = 0; $i < 11; $i++) {
$this_date = strtotime($date);
$next_date = date("Y-m-d", strtotime('next month', $this_date));
$date_t[] = $next_date;
$date = $next_date;
}
return $date_t;
}
function getDayDate($date)
{
$date_t = array();
$date_t[] = $date;
$this_date = strtotime($date);
$end_date = date("Y-m-d H:i:s", strtotime('+4 hour -1 second', $this_date));
$date_end[] = $end_date;
for ($i = 0; $i < 5; $i++) {
$this_date = strtotime($date);
$next_date = date("Y-m-d H:i:s", strtotime('+4 hour', $this_date));
$this_date_end = strtotime($end_date);
$next_date_end = date("Y-m-d H:i:s", strtotime('+4 hour', $this_date_end));
$date_end[] = $next_date_end;
$date_t[] = $next_date;
$date = $next_date;
$next_date_end = date("Y-m-d H:59:59", strtotime($next_date_end));
$end_date = $next_date_end;
}
$kk['start_time'] = $date_t;
$kk['end_time'] = $date_end;
return $kk;
}
function getDistance($lat1, $lng1, $lat2, $lng2)
{
$earthRadius = 6367000;
$lat1 = ($lat1 * pi()) / 180;
$lng1 = ($lng1 * pi()) / 180;
$lat2 = ($lat2 * pi()) / 180;
$lng2 = ($lng2 * pi()) / 180;
$calcLongitude = $lng2 - $lng1;
$calcLatitude = $lat2 - $lat1;
$stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);
$stepTwo = 2 * asin(min(1, sqrt($stepOne)));
$calculatedDistance = $earthRadius * $stepTwo;
return round($calculatedDistance / 1000, 2);
}
function Encrypt($data)
{
$aes = new Aes();
return $aes->encrypt($data);
}
function Decrypt($data)
{
$aes = new Aes();
return $aes->decrypt($data);
}
function HmacMD5($data)
{
$md5 = new HMACMD5();
return $md5->HMAC($data);
}
function CurlSend($url, $data = '', $token = '')
{
$data = json_encode($data);
// echo $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);
}
function checkParams($params)
{
$arr = ['OperatorID', 'Data', 'TimeStamp', 'Seq', 'Sig'];
// 参数检查
foreach ($arr as $v) {
if (empty($params[$v])) {
return $v;
}
}
return 2;
}
function checkSig($OperatorID, $params)
{
$sig = $OperatorID . $params['Data'] . $params['TimeStamp'] . $params['Seq'];
$ecry_sig = $this->HmacMD5($sig);
if ($params['Sig'] != $ecry_sig) {
return 1;
}
return 2;
}
function signToken()
{
$key = config('hard.DataSecretIV'); //这里是自定义的一个随机字串应该写在config文件中的解密时也会用相当 于加密中常用的 盐 salt
$token = array(
"iss" => $key, //签发者 可以为空
"aud" => '', //面象的用户,可以为空
"iat" => time(), //签发时间
"nbf" => time() + 1, //在什么时候jwt开始生效 这里表示生成100秒后才生效
"exp" => time() + 7200, //token 过期时间
"data" => [ //记录的userid的信息这里是自已添加上去的如果有其它信息可以再添加数组的键值对
'name' => 'zuxing'
]
);
// print_r($token);
$jwt = JWT::encode($token, $key, "HS256"); //根据参数生成了 token
return $jwt;
}
//验证token
function checkToken_assess($token)
{
$key = config('hard.DataSecretIV');
$key = new Key($key, 'HS256');
$status = array("code" => 2);
try {
JWT::$leeway = 60;//当前时间减去60把时间留点余地
$decoded = JWT::decode($token, $key, array('HS256')); //HS256方式这里要和签发的时候对应
$arr = (array)$decoded;
$res['code'] = 1;
$res['data'] = $arr['data'];
return 2;
} catch (\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
$status['msg'] = "签名不正确";
return 1;
} catch (\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
$status['msg'] = "token失效";
return 1;
} catch (\Firebase\JWT\ExpiredException $e) { // token过期
$status['msg'] = "token失效";
return 1;
} catch (\Exception $e) { //其他错误
$status['msg'] = "未知错误";
return 1;
}
}
function encodeData($data, $params, $ret, $msg = '')
{
$data = json_encode($data);
$data = $this->Encrypt($data);
$seq = empty($Seq) ? '0001' : $params['Seq'];
$datetime = empty($TimeStamp) ? date('YmdHis') : $params['TimeStamp'];
$sig = $params['OperatorID'] . $data . $datetime . $seq;
$s = $this->HmacMD5($sig);
return json(['Msg' => $msg, 'Ret' => $ret, 'Data' => $data, 'Sig' => $s]);
}
function generate_password($length)
{
$chars = '0123456789';
$time = time();
$password = config('hard.OperatorID') . $time;
for ($i = 0; $i < $length; $i++) {
$password .= $chars[mt_rand(0, strlen($chars) - 1)];
}
return $password;
}
}