You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

256 lines
8.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace App\Repositories;
use App\Models\ThirdAppointmentLog;
use App\Models\ThirdPlateLog;
/**
* 科拓道闸
*/
class CarRepository
{
public $baseUrl;
public $appid;
public $appsecret;
public $parkId;
public function __construct()
{
$this->baseUrl = 'https://kp-open.keytop.cn/unite-api';
// $this->appid = '10749';
// $this->appsecret = 'f82b42c6f60246eba56ec4a77dfe7f9b';
// $this->parkId = '4603';
$this->appid = '13520';
$this->appsecret = 'dac06919e42c4974937ccb867792141a';
$this->parkId = '7818';
}
/**
* 停车场信息查询接口
* @return false|mixed
*/
public function getParkingLotInfo()
{
$url = $this->baseUrl . '/api/wec/GetParkingLotInfo';
$header[] = 'Content-Type: application/json;charset=UTF-8';
$header[] = 'version: 1.0.0';
$header[] = 'accept-language: zh-CN';
$params = [
'appId' => $this->appid,
'parkId' => $this->parkId,
'serviceCode' => 'getParkingLotInfo',
'ts' => round(microtime(true) * 1000),
'reqId' => getBatchNo()
];
$params['key'] = $this->sign($params);
$params = json_encode($params);
try {
$result = httpCurl($url, 'POST', $params, $header);
$result = json_decode($result, true);
if (empty($result['resCode'])) {
return json_decode($result['data'], true);
} else {
return false;
}
} catch (\Exception $e) {
return false;
}
}
/**
* 预约车位
*/
public function appointment($model, $plateNo, &$out)
{
$url = $this->baseUrl . '/api/find/ReserveSpace';
$header[] = 'Content-Type: application/json;charset=UTF-8';
$header[] = 'version: 1.0.0';
$header[] = 'accept-language: zh-CN';
$params = [
'appId' => $this->appid,
'parkId' => $this->parkId,
'serviceCode' => 'reserveSpace',
'ts' => round(microtime(true) * 1000),
'reqId' => getBatchNo(),
'plateNo' => $plateNo,
'type' => 1,
'addrId' => '4,6',
'enterTime' => date('Y-m-d 00:00:01', strtotime($model->start_time)),
'leaveTime' => date('Y-m-d 23:59:58', strtotime($model->end_time)),
// 失效时间
'failureTime' => date('Y-m-d 23:59:59', strtotime($model->end_time)),
'flag' => 1,
'cardType' => 100,
];
$params['key'] = $this->sign($params);
$params = json_encode($params);
$result = [];
$finally = $order_no = 0;
$plate_status = 2;
try {
$resultJson = httpCurl($url, 'POST', $params, $header);
$out = $resultJson;
$result = json_decode($resultJson, true);
if (empty($result['resCode'])) {
$finally = 1;
$order_no = json_decode($result['data'], true)['orderNo'];
$plate_status = 1;
return true;
} else {
return false;
}
} catch (\Exception $e) {
$out = $e->getMessage();
return false;
} finally {
// 写日志
$thirdAppointmentLogModel = ThirdAppointmentLog::add($model->id, 0, $model->user_id, $url, $params, $result, $finally, '用户车位预订');
// 写车牌记录信息
ThirdAppointmentLog::addPlate($thirdAppointmentLogModel, $plateNo, $plate_status, $order_no);
}
}
/**
* 预约车位(课程报名渠道)
*/
public function courseAppointment($course, $courseSigns, $plateNo, &$out)
{
$url = $this->baseUrl . '/api/find/ReserveSpace';
$header[] = 'Content-Type: application/json;charset=UTF-8';
$header[] = 'version: 1.0.0';
$header[] = 'accept-language: zh-CN';
$params = [
'appId' => $this->appid,
'parkId' => $this->parkId,
'serviceCode' => 'reserveSpace',
'ts' => round(microtime(true) * 1000),
'reqId' => getBatchNo(),
'plateNo' => $plateNo,
'type' => 1,
'addrId' => '',
'enterTime' => $course->start_date . ' 00:00:00',
'leaveTime' => $course->end_date . ' 00:00:00',
'failureTime' => date('Y-m-d 59:59:59', strtotime($course->end_date)),
'flag' => 1,
'cardType' => 100,
];
$params['key'] = $this->sign($params);
$params = json_encode($params);
$result = [];
$finally = $order_no = 0;
$plate_status = 2;
try {
$resultJson = httpCurl($url, 'POST', $params, $header);
$out = $resultJson;
$result = json_decode($resultJson, true);
if (empty($result['resCode'])) {
$finally = 1;
$order_no = json_decode($result['data'], true)['orderNo'];
return true;
} else {
return false;
}
} catch (\Exception $e) {
$out = $e->getMessage();
return false;
} finally {
// 写日志
$thirdAppointmentLogModel = ThirdAppointmentLog::add(0, $courseSigns->id, $courseSigns->user_id, 0, $url, $params, $result, $finally, '用户车位预订');
// 写车牌记录信息
ThirdAppointmentLog::addPlate($thirdAppointmentLogModel, $plateNo, $plate_status, $order_no);
}
}
/**
* 取消预约车位
*/
public function cancelAppointment($appointment_id = 0, $course_sign_id = 0, $plateNo, &$out)
{
// 获取车位预约的订单号
$thirdPlateLog = ThirdAppointmentLog::where(function ($query) use ($appointment_id, $course_sign_id) {
if ($appointment_id) {
$query->where('appointment_id', $appointment_id);
}
if ($course_sign_id) {
$query->where('course_sign_id', $course_sign_id);
}
})->where('plate', 'like', "%$plateNo%")
->where('plate_status', 1)
->first();
if (empty($thirdPlateLog)) {
$out = '预约成功记录不存在';
return false;
};
$url = $this->baseUrl . '/api/find/CancelReserveSpace';
$header[] = 'Content-Type: application/json;charset=UTF-8';
$header[] = 'version: 1.0.0';
$header[] = 'accept-language: zh-CN';
$params = [
'appId' => $this->appid,
'parkId' => $this->parkId,
'serviceCode' => 'cancelReserveSpace',
'ts' => round(microtime(true) * 1000),
'reqId' => getBatchNo(),
'orderNo' => $thirdPlateLog->plate_order_no,
];
$params['key'] = $this->sign($params);
$params = json_encode($params);
$result = [];
$finally = 0;
try {
$resultJson = httpCurl($url, 'POST', $params, $header);
$out = $resultJson;
$result = json_decode($resultJson, true);
if (empty($result['resCode'])) {
// 修改车牌预约状态
$thirdPlateLog->plate_status = 3;
$thirdPlateLog->save();
$finally = 1;
return true;
} else {
return false;
}
} catch (\Exception $e) {
$out = $e->getMessage();
return false;
} finally {
// 写日志
ThirdAppointmentLog::add($appointment_id, $course_sign_id, 0, $url, $params, $result, $finally, '用户取消车位预订');
}
}
/**
* 签名
*/
public function sign($data)
{
// 过滤掉空值、null、空字符串及特定键appId, appSercert
$filteredData = array_filter($data, function ($value) {
return !is_null($value) && $value !== '' && !is_array($value) && !is_object($value);
}, ARRAY_FILTER_USE_BOTH);
// 移除特定键appId, appSercert如果存在的话
if (isset($filteredData['appId'])) {
unset($filteredData['appId']);
}
if (isset($filteredData['appSercert'])) {
unset($filteredData['appSercert']);
}
// 按ASCII码字典序排序属性名
uksort($filteredData, 'strcasecmp');
// 拼接成URL键值对格式的字符串
$stringA = '';
foreach ($filteredData as $key => $value) {
$stringA .= $key . '=' . $value . '&';
}
$stringA = rtrim($stringA, '&'); // 去除最后一个多余的&
// 拼接上appSercert并计算MD5
$appSercert = $this->appsecret; // 假设'appSercert'始终存在
$stringSignTemp = $stringA . '&' . $appSercert;
$signValue = strtoupper(md5($stringSignTemp)); // 转换为大写
return $signValue;
}
}