153 lines
4.7 KiB
PHP
153 lines
4.7 KiB
PHP
<?php
|
|
|
|
class EcomZoneAPI
|
|
{
|
|
private $apiKey;
|
|
private $apiUrl;
|
|
private $lastRequestTime;
|
|
private $requestCount = 0;
|
|
private const RATE_LIMIT = 120; // requests per minute
|
|
private const RATE_WINDOW = 60; // seconds
|
|
|
|
public function __construct()
|
|
{
|
|
$this->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);
|
|
}
|
|
}
|