app_key = config('api_logistic.YD.prod.app-key', '999999'); $this->app_secret = config('api_logistic.YD.prod.app-secret', '04d4ad40eeec11e9bad2d962f53dda9d'); $this->url = config('api_logistic.YD.prod.register.url'); $sender = [ "address" => "上海市松江区泗泾镇泗砖公路351号", "city" => "上海市", "county" => "松江区", "name" => "施尧", "phone" => '13761413262', "province" => "上海市" ]; $body = [ "orders" => [], ]; $order_packages = OrderPackage::query() ->with('order') ->whereIn('logistic_number', $logistic_numbers)->get(); foreach ($order_packages as $order_package) { $order = $order_package->order; $body['orders'][] = [ 'orderid' => $order->client_code, "mailno" => $order_package->logistic_number, "receiver" => [ "address" => $order->address, "city" => $order->city, "county" => $order->district ?? $order->city, "name" => $order->consignee_name, "phone" => $order->consignee_phone, "province" => $order->province ?? $order->city, ], "sender" => $sender ]; } $json_body = json_encode($body, JSON_UNESCAPED_UNICODE); $sign = md5($json_body . '_' . $this->app_secret); $headers = [ 'app-key' => $this->app_key, 'sign' => $sign, 'req-time' => now()->timestamp, "Content-Type" => "application/json" ]; try { $response = Http::withHeaders($headers)->withBody($json_body, 'application/json')->post($this->url); return json_decode($response); } catch (\GuzzleHttp\Exception\RequestException $e) { LogService::log(LogisticYDService::class, "韵达-registerApi", $logistic_numbers); } } public function query($logistic_number) { $this->app_key = config('api_logistic.YD.prod.app-key', '999999'); $this->app_secret = config('api_logistic.YD.prod.app-secret', '04d4ad40eeec11e9bad2d962f53dda9d'); $this->url = config('api_logistic.YD.prod.search.url'); $body = [ "mailno" => $logistic_number ]; $sign = md5(json_encode($body, JSON_UNESCAPED_UNICODE) . '_' . $this->app_secret); $headers = [ 'app-key' => $this->app_key, 'sign' => $sign, 'req-time' => now()->timestamp, "Content-Type" => "application/json" ]; try { $response = Http::withHeaders($headers)->withBody(json_encode($body, JSON_UNESCAPED_UNICODE), 'application/json')->post($this->url); } catch (\GuzzleHttp\Exception\RequestException $e) { LogService::log(LogisticYDService::class, "韵达-query", $logistic_number); return null; } return json_decode($response->body()); } public function format($nativeResponse, $logistic_number) { if (is_null($nativeResponse) || $nativeResponse->code != '0000' || empty($nativeResponse->data) ||$nativeResponse->data->result == "false") { return [ 'logistic_number' => $logistic_number, ]; } else { $nativeData = $nativeResponse->data; try { $result['logistic_number'] = $nativeData->mailno; } catch (\Exception $e) { LogService::log(LogisticYDService::class, "YD快递信息异常", $nativeResponse); return []; } $nativeRoutes = $nativeData->steps; if (!empty($nativeRoutes)) { $lastNativeRoute = $nativeRoutes[count($nativeRoutes) - 1]; $result['status'] = $this->getStatus($nativeData); if ($result['status'] == '已签收') { $result['received_at'] = $lastNativeRoute->time; } $result['transfer_status'] = $this->getTransferStatus($nativeRoutes); $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->status) { case 'GOT': $status = '已揽件'; break; case 'TRANSIT': $status = '在途'; break; case 'SIGNED': $status = '已签收'; break; case 'RETURN': $status = '返回中'; break; case 'SIGNFAIL': $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->description; $item['remark'] = ""; $transferStatus[] = $item; } return $transferStatus; } }