Documentation de l'API
Avec l'API REST LisansX, vous pouvez importer la liste des produits et les stocks sur votre propre site, passer des commandes et recevoir instantanément les codes de livraison. L'authentification, les points de terminaison et des exemples en PHP, Node.js et Python figurent ci-dessous.
Authentification
Chaque requête est signée à l'aide de trois en-têtes. La signature couvrant à la fois l'horodatage, la méthode HTTP, le chemin et le corps brut, la requête ne peut être ni modifiée en transit ni rejouée.
| En-tête | Valeur |
|---|---|
X-Api-Key | Votre clé API |
X-Timestamp | Secondes Unix — doit se situer à ±300 s de l'heure du serveur |
X-Signature | Signature hexadécimale générée selon la formule ci-dessous |
signingKey = sha256_hex(api_secret) signature = hmac_sha256_hex(signingKey, timestamp + "\n" + METHOD + "\n" + path + "\n" + rawBody)
- path: le chemin ainsi que la chaîne de requête, le cas échéant (
/api/v1/products?limit=50). Les paramètres de requête font aussi partie de la signature — signez exactement l'URL que vous appelez. - rawBody: le JSON exact que vous envoyez ; une chaîne vide pour les requêtes GET.
- Ne resérialisez pas le corps après l'avoir signé — la moindre différence invalide la signature.
Points de terminaison
| Méthode | Chemin | Description |
|---|---|---|
| GET | /api/v1/products |
Tous les produits en vente, à vos prix revendeur |
| GET | /api/v1/products/{id} |
Détails d'un produit et état du stock |
| POST | /api/v1/order |
Créer une commande — renvoie les codes de livraison en cas de succès |
| GET | /api/v1/order/{order_no} |
Statut de la commande et codes livrés |
| GET | /api/v1/balance |
Votre solde actuel |
La limite de requêtes par minute est définie pour chaque compte revendeur. En cas de dépassement, 429 rate_limited est renvoyé. Toutes les réponses d'erreur utilisent le format {"success": false, "error": "...", "message": "..."}.
Exemples d'intégration
Prêts à copier-coller
<?php
final class LisansXClient
{
public function __construct(
private string $baseUrl,
private string $apiKey,
private string $apiSecret
) { $this->baseUrl = rtrim($baseUrl, '/'); }
public function request(string $method, string $path, ?array $body = null): array
{
$method = strtoupper($method);
$bodyRaw = $body !== null ? json_encode($body, JSON_UNESCAPED_UNICODE) : '';
$ts = (string)time();
// Clé de signature = empreinte SHA-256 hexadécimale du secret brut
$signingKey = hash('sha256', $this->apiSecret);
$signature = hash_hmac('sha256', $ts . "\n" . $method . "\n" . $path . "\n" . $bodyRaw, $signingKey);
$ch = curl_init($this->baseUrl . $path);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'X-Api-Key: ' . $this->apiKey,
'X-Timestamp: ' . $ts,
'X-Signature: ' . $signature,
'Content-Type: application/json',
],
]);
if ($body !== null) curl_setopt($ch, CURLOPT_POSTFIELDS, $bodyRaw);
$raw = curl_exec($ch);
return json_decode((string)$raw, true) ?: ['success' => false, 'error' => 'invalid_response'];
}
}
// --- Utilisation ---
$api = new LisansXClient('https://lisansx.net', 'VOTRE_CLE_API', getenv('LISANSX_SECRET'));
$products = $api->request('GET', '/api/v1/products');
$order = $api->request('POST', '/api/v1/order', ['product_id' => 1, 'qty' => 1]);
if (!empty($order['success'])) {
foreach ($order['data']['codes'] as $code) {
echo "Teslim edilen kod: $code\n";
}
} else {
error_log('LisansX hatasi: ' . ($order['message'] ?? 'bilinmiyor'));
}
Erreurs fréquentes
401 invalid_signature- Vous avez peut-être omis de dériver la clé de signature sous la forme
sha256(secret). 401 invalid_timestamp- L'horloge de votre serveur est désynchronisée. Synchronisez-la avec NTP.
403 ip_not_allowed- Une restriction IP est définie et votre requête provient d'une IP absente de la liste.
409 replayed_request- La même requête POST signée a été reçue une seconde fois (protection contre le rejeu). Signez chaque requête avec un nouvel horodatage ; si vous passez deux commandes pour le même produit dans la même seconde, ajoutez un champ
"nonce"unique au corps (par ex. votre propre numéro de commande). 429 rate_limited- Vous avez dépassé la limite par minute ; étalez vos requêtes dans le temps.
409 out_of_stock- Le produit est en rupture de stock ou indisponible dans la quantité demandée (le champ
availableindique la quantité restante). Aucune commande n'est créée et aucun montant n'est débité du solde. Vérifiez le stock avecGET /api/v1/products/{id}avant d'encaisser le paiement de votre propre client ; le webhookstock.changedvous avertit instantanément lorsqu'un produit est épuisé ou de nouveau disponible. 409 price_changed- Si vous avez envoyé le paramètre facultatif
"max_unit_price"avec la commande et que le prix unitaire actuel le dépasse, aucune commande n'est créée ;unit_priceindique le prix actuel. 402 delivery_failed- La commande a été créée mais le produit n'a pas pu être livré (par ex. épuisé à la source au dernier moment). Le montant est automatiquement remboursé sur votre solde.