Phase F
This commit is contained in:
@@ -95,8 +95,88 @@ final class HexaGameCloudApiClient
|
||||
);
|
||||
}
|
||||
|
||||
private function request(string $method, string $path, array $body = [], ?string $idempotencySuffix = null): array
|
||||
public function listAccounts(): array
|
||||
{
|
||||
return $this->request('GET', '/api/v1/integrations/whmcs/accounts');
|
||||
}
|
||||
|
||||
public function reconcileService(string $externalServiceId, array $payload = []): array
|
||||
{
|
||||
return $this->request(
|
||||
'POST',
|
||||
'/api/v1/integrations/whmcs/services/' . rawurlencode($externalServiceId) . '/reconcile',
|
||||
$payload,
|
||||
'service:reconcile:' . $externalServiceId . ':' . date('Y-m-d')
|
||||
);
|
||||
}
|
||||
|
||||
public function reconcileAll(array $payload = []): array
|
||||
{
|
||||
return $this->request(
|
||||
'POST',
|
||||
'/api/v1/integrations/whmcs/reconcile',
|
||||
$payload,
|
||||
'reconcile:all:' . date('Y-m-d')
|
||||
);
|
||||
}
|
||||
|
||||
public function importService(array $payload): array
|
||||
{
|
||||
return $this->request(
|
||||
'POST',
|
||||
'/api/v1/integrations/whmcs/services/import',
|
||||
$payload,
|
||||
'service:import:' . $payload['externalServiceId']
|
||||
);
|
||||
}
|
||||
|
||||
public function listEvents(?string $cursor = null, int $limit = 50): array
|
||||
{
|
||||
$query = $cursor ? ('?cursor=' . rawurlencode($cursor) . '&limit=' . $limit) : ('?limit=' . $limit);
|
||||
return $this->request('GET', '/api/v1/integrations/whmcs/events' . $query);
|
||||
}
|
||||
|
||||
public function acknowledgeEvents(array $eventIds, bool $deadLetter = false, ?string $reason = null): array
|
||||
{
|
||||
$payload = ['eventIds' => $eventIds, 'deadLetter' => $deadLetter];
|
||||
if ($reason !== null) {
|
||||
$payload['deadLetterReason'] = $reason;
|
||||
}
|
||||
|
||||
return $this->request('POST', '/api/v1/integrations/whmcs/events/ack', $payload);
|
||||
}
|
||||
|
||||
public function getServiceUsage(string $externalServiceId, array $query = []): array
|
||||
{
|
||||
$params = http_build_query(array_filter([
|
||||
'periodStart' => $query['periodStart'] ?? null,
|
||||
'periodEnd' => $query['periodEnd'] ?? null,
|
||||
'testMode' => isset($query['testMode']) ? ($query['testMode'] ? 'true' : 'false') : null,
|
||||
]));
|
||||
|
||||
$suffix = $params !== '' ? ('?' . $params) : '';
|
||||
return $this->request(
|
||||
'GET',
|
||||
'/api/v1/integrations/whmcs/services/' . rawurlencode($externalServiceId) . '/usage' . $suffix
|
||||
);
|
||||
}
|
||||
|
||||
private function request(string $method, string $pathWithQuery, array $body = [], ?string $idempotencySuffix = null): array
|
||||
{
|
||||
$pathParts = explode('?', $pathWithQuery, 2);
|
||||
$path = $pathParts[0];
|
||||
$canonicalQuery = '';
|
||||
|
||||
if (isset($pathParts[1]) && $pathParts[1] !== '') {
|
||||
parse_str($pathParts[1], $queryParams);
|
||||
ksort($queryParams);
|
||||
$pairs = [];
|
||||
foreach ($queryParams as $key => $value) {
|
||||
$pairs[] = rawurlencode((string) $key) . '=' . rawurlencode((string) $value);
|
||||
}
|
||||
$canonicalQuery = implode('&', $pairs);
|
||||
}
|
||||
|
||||
$bodyJson = $body === [] ? '' : json_encode($body, JSON_THROW_ON_ERROR);
|
||||
$timestamp = (string) (int) (microtime(true) * 1000);
|
||||
$nonce = bin2hex(random_bytes(16));
|
||||
@@ -105,7 +185,7 @@ final class HexaGameCloudApiClient
|
||||
$signatureBase = implode("\n", [
|
||||
strtoupper($method),
|
||||
$path,
|
||||
'',
|
||||
$canonicalQuery,
|
||||
hash('sha256', $bodyJson),
|
||||
$timestamp,
|
||||
$nonce,
|
||||
@@ -113,8 +193,9 @@ final class HexaGameCloudApiClient
|
||||
]);
|
||||
|
||||
$signature = hash_hmac('sha256', $signatureBase, $this->apiSecret);
|
||||
$requestUrl = $this->baseUrl . $path . ($canonicalQuery !== '' ? ('?' . $canonicalQuery) : '');
|
||||
|
||||
$ch = curl_init($this->baseUrl . $path);
|
||||
$ch = curl_init($requestUrl);
|
||||
if ($ch === false) {
|
||||
throw new RuntimeException('Unable to initialize HTTP client');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user