|
|
@@ -0,0 +1,145 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Services;
|
|
|
+
|
|
|
+use App\Traits\ServiceAppAop;
|
|
|
+
|
|
|
+class LogisticALiYunService
|
|
|
+{
|
|
|
+ use ServiceAppAop;
|
|
|
+
|
|
|
+ public function query($logistic_number)
|
|
|
+ {
|
|
|
+ $host = config('api_logistic.ALiYun.prod.search.host');
|
|
|
+ $path = config('api_logistic.ALiYun.prod.search.path');
|
|
|
+ $headers = [
|
|
|
+ "Authorization:APPCODE " . config('api_logistic.ALiYun.prod.app-code')
|
|
|
+ ];
|
|
|
+ $url = $host.$path.'?no='.$logistic_number;
|
|
|
+ $curl = curl_init();
|
|
|
+ curl_setopt($curl, CURLOPT_CUSTOMREQUEST, config('api_logistic.ALiYun.prod.method'));
|
|
|
+ curl_setopt($curl, CURLOPT_URL, $url);
|
|
|
+ curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
|
|
|
+ curl_setopt($curl, CURLOPT_FAILONERROR, false);
|
|
|
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
|
|
+ curl_setopt($curl, CURLOPT_HEADER, true);
|
|
|
+ if (1 == strpos("$" . $host, "https://")) {
|
|
|
+ curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
|
|
|
+ curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
|
|
|
+ }
|
|
|
+ $out_put = curl_exec($curl);
|
|
|
+ dd($out_put);
|
|
|
+ $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
|
|
|
+
|
|
|
+ list($header, $body) = explode("\r\n\r\n", $out_put, 2);
|
|
|
+ if ($httpCode == 200) {
|
|
|
+ print("正常请求计费(其他均不计费)<br>");
|
|
|
+ print($body);
|
|
|
+ } else {
|
|
|
+ if ($httpCode == 400 && strpos($header, "Invalid Param Location") !== false) {
|
|
|
+ print("参数错误");
|
|
|
+ } elseif ($httpCode == 400 && strpos($header, "Invalid AppCode") !== false) {
|
|
|
+ print("AppCode错误");
|
|
|
+ } elseif ($httpCode == 400 && strpos($header, "Invalid Url") !== false) {
|
|
|
+ print("请求的 Method、Path 或者环境错误");
|
|
|
+ } elseif ($httpCode == 403 && strpos($header, "Unauthorized") !== false) {
|
|
|
+ print("服务未被授权(或URL和Path不正确)");
|
|
|
+ } elseif ($httpCode == 403 && strpos($header, "Quota Exhausted") !== false) {
|
|
|
+ print("套餐包次数用完");
|
|
|
+ } elseif ($httpCode == 403 && strpos($header, "Api Market Subscription quota exhausted") !== false) {
|
|
|
+ print("套餐包次数用完,请续购套餐");
|
|
|
+ } elseif ($httpCode == 500) {
|
|
|
+ print("API网关错误");
|
|
|
+ } elseif ($httpCode == 0) {
|
|
|
+ print("URL错误");
|
|
|
+ } else {
|
|
|
+ print("参数名错误 或 其他错误");
|
|
|
+ print($httpCode);
|
|
|
+ $headers = explode("\r\n", $header);
|
|
|
+ $headList = array();
|
|
|
+ foreach ($headers as $head) {
|
|
|
+ $value = explode(':', $head);
|
|
|
+ $headList[$value[0]] = $value[1];
|
|
|
+ }
|
|
|
+ print($headList['x-ca-error-message']);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public function format($response, $logistic_number): array
|
|
|
+ {
|
|
|
+ $result = [];
|
|
|
+ if (!isset($response) || ($response && $response->status != 0)) {
|
|
|
+ return [
|
|
|
+ 'logistic_number' => $logistic_number,
|
|
|
+ ];
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ if ($response->result->number ?? false) $result['logistic_number'] = $response->result->number;
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ LogService::log(LogisticYTOService::class, "AliJiSu快递信息异常", $response);
|
|
|
+ }
|
|
|
+ $list = $response->result->list;
|
|
|
+ if (!empty($list) && is_array($list)) {
|
|
|
+ $lastNativeRoute = $list[0];
|
|
|
+ $result['status'] = $this->getStatus($response);
|
|
|
+ if ($result['status'] == '已签收') $result['received_at'] = $lastNativeRoute->time;
|
|
|
+ $result['transfer_status'] = $this->getTransferStatus($list);
|
|
|
+ $result['routes_length'] = array_key_exists('transfer_status', $result) ? count($result['transfer_status']) : 0;
|
|
|
+ } else {
|
|
|
+ $result['status'] = null;
|
|
|
+ $result['transfer_status'] = [];
|
|
|
+ }
|
|
|
+ if (!array_key_exists('status', $result)) {
|
|
|
+ $result['status'] = null;
|
|
|
+ $result['transfer_status'] = [];
|
|
|
+ }
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param $nativeData
|
|
|
+ * @return string
|
|
|
+ */
|
|
|
+ private function getStatus($nativeData): string
|
|
|
+ {
|
|
|
+ $status = null;
|
|
|
+ switch ($nativeData->result->deliverystatus) {
|
|
|
+ case '1':
|
|
|
+ $status = '在途';
|
|
|
+ break;
|
|
|
+ case '2':
|
|
|
+ $status = '派送中';
|
|
|
+ break;
|
|
|
+ case '3':
|
|
|
+ $status = '已签收';
|
|
|
+ break;
|
|
|
+ case '4':
|
|
|
+ $status = '派送异常';
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ $status = '其他';
|
|
|
+ }
|
|
|
+ return $status;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param $nativeRoutes
|
|
|
+ * @return array
|
|
|
+ */
|
|
|
+ private function getTransferStatus($nativeRoutes): array
|
|
|
+ {
|
|
|
+ $transferStatus = [];
|
|
|
+ foreach ($nativeRoutes as $nativeRoute) {
|
|
|
+ $item = [];
|
|
|
+ $item['accept_time'] = $nativeRoute->time;
|
|
|
+ $item['accept_address'] = $nativeRoute->status;
|
|
|
+ $item['remark'] = "";
|
|
|
+ $transferStatus[] = $item;
|
|
|
+ }
|
|
|
+ return $transferStatus;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|