fetchStatus($shipmentId); } private function fetchStatus(string $shipmentId): ?array { try { $token = $this->resolveToken(); if ($token === null) { return null; } $settings = $this->inpostRepository->getSettings(); $env = (string) ($settings['environment'] ?? 'sandbox'); $url = $this->apiBaseUrl($env) . '/shipments/' . rawurlencode($shipmentId); $response = $this->apiRequest($url, $token); $rawStatus = strtolower(trim((string) ($response['status'] ?? ''))); return $rawStatus !== '' ? [ 'status' => DeliveryStatus::normalize('inpost', $rawStatus), 'status_raw' => $rawStatus, 'description' => DeliveryStatus::description('inpost', $rawStatus), ] : null; } catch (Throwable) { return null; } } private function resolveToken(): ?string { $token = $this->inpostRepository->getDecryptedToken(); return ($token !== null && trim($token) !== '') ? trim($token) : null; } private function apiBaseUrl(string $environment): string { return strtolower(trim($environment)) === 'production' ? self::API_BASE_PRODUCTION : self::API_BASE_SANDBOX; } /** * @return array */ private function apiRequest(string $url, string $token): array { $ch = curl_init($url); if ($ch === false) { return []; } $opts = [ CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 15, CURLOPT_CONNECTTIMEOUT => 5, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_SSL_VERIFYHOST => 2, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $token, 'Accept: application/json', ], ]; $caPath = SslCertificateResolver::resolve(); if ($caPath !== null) { $opts[CURLOPT_CAINFO] = $caPath; } curl_setopt_array($ch, $opts); $body = curl_exec($ch); $httpCode = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE); $ch = null; if ($body === false || $httpCode < 200 || $httpCode >= 300) { return []; } $json = json_decode((string) $body, true); return is_array($json) ? $json : []; } }