apiKey = Configuration::get('ECOMZONE_API_KEY'); $this->apiUrl = Configuration::get('ECOMZONE_API_URL'); $this->lastRequestTime = time(); // Debug log the configuration PrestaShopLogger::addLog( sprintf('EcomZone API initialized with URL: %s', $this->apiUrl), 1, null, 'EcomZone' ); } private function checkRateLimit() { $currentTime = time(); if ($currentTime - $this->lastRequestTime >= self::RATE_WINDOW) { $this->requestCount = 0; $this->lastRequestTime = $currentTime; } if ($this->requestCount >= self::RATE_LIMIT) { throw new Exception('Rate limit exceeded. Please wait before making more requests.'); } $this->requestCount++; } private function makeRequest($method, $url, $params = []) { try { // Debug log the request PrestaShopLogger::addLog( sprintf('Making request: %s %s', $method, $url), 1, null, 'EcomZone' ); $curl = curl_init(); // Add token as URL parameter AND header for maximum compatibility $urlWithToken = $url . (strpos($url, '?') === false ? '?' : '&') . 'token=' . $this->apiKey; if ($method === 'GET' && !empty($params)) { $urlWithToken .= '&' . http_build_query($params); } $options = [ CURLOPT_URL => $urlWithToken, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_SSL_VERIFYPEER => false, // For testing only, remove in production CURLOPT_SSL_VERIFYHOST => false, // For testing only, remove in production CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $this->apiKey, 'Accept: application/json', 'Content-Type: application/json' ], ]; if ($method === 'POST') { $options[CURLOPT_POSTFIELDS] = json_encode($params); } curl_setopt_array($curl, $options); // Debug log the curl options PrestaShopLogger::addLog( sprintf('Curl options: %s', json_encode([ 'url' => $urlWithToken, 'headers' => $options[CURLOPT_HTTPHEADER] ])), 1, null, 'EcomZone' ); $response = curl_exec($curl); $err = curl_error($curl); $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); // Debug log the response PrestaShopLogger::addLog( sprintf('Response Code: %d, Error: %s, Response: %s', $httpCode, $err ?: 'none', substr($response, 0, 1000) ), 1, null, 'EcomZone' ); curl_close($curl); if ($err) { throw new Exception("cURL Error: " . $err); } if ($httpCode >= 400) { throw new Exception("HTTP Error: " . $httpCode . " Response: " . $response); } return json_decode($response, true); } catch (Exception $e) { PrestaShopLogger::addLog( 'EcomZone API Error: ' . $e->getMessage(), 3, null, 'EcomZone' ); throw $e; } } public function getCatalog($perPage = 10) { $this->checkRateLimit(); $url = $this->apiUrl . '/catalog'; return $this->makeRequest('GET', $url, ['per_page' => $perPage]); } public function getProduct($sku) { $this->checkRateLimit(); $url = $this->apiUrl . '/product/' . urlencode($sku); return $this->makeRequest('GET', $url); } public function createOrder($orderData) { $this->checkRateLimit(); $url = $this->apiUrl . '/ordering'; return $this->makeRequest('POST', $url, $orderData); } }