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.

Les clés API sont attribuées uniquement aux revendeurs. Tout le monde peut consulter la documentation ; l'envoi de requêtes nécessite un forfait revendeur actif. Votre clé est générée lorsque votre demande de revendeur est approuvée.

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êteValeur
X-Api-KeyVotre clé API
X-TimestampSecondes Unix — doit se situer à ±300 s de l'heure du serveur
X-SignatureSignature 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éthodeCheminDescription
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 available indique la quantité restante). Aucune commande n'est créée et aucun montant n'est débité du solde. Vérifiez le stock avec GET /api/v1/products/{id} avant d'encaisser le paiement de votre propre client ; le webhook stock.changed vous 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_price indique 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.
Écrire sur Telegram Ouvrir un ticket d'assistance