API Dokümantasyonu

LisansX REST API ile ürün listesini ve stokları kendi sitenize çekebilir, sipariş verip teslimat kodlarını anında alabilirsiniz. Kimlik doğrulama, uç noktalar ve PHP, Node.js ve Python örnekleri aşağıda.

API anahtarı yalnızca bayilere verilir. Dokümantasyonu herkes inceleyebilir; istek göndermek için aktif bir bayilik paketi gerekir. Anahtarınız bayilik başvurunuz onaylandığında oluşturulur.

Kimlik Doğrulama

Her istek üç başlıkla imzalanır. İmza; zaman damgası, HTTP yöntemi, yol ve ham gövdeyi birlikte kapsadığı için istek yolda değiştirilemez ya da tekrar oynatılamaz.

BaşlıkDeğer
X-Api-KeyAPI anahtarınız
X-TimestampUnix saniye — sunucu saatinden ±300 sn içinde olmalı
X-SignatureAşağıdaki formülle üretilen hex imza
signingKey = sha256_hex(api_secret)
signature  = hmac_sha256_hex(signingKey, timestamp + "\n" + METHOD + "\n" + path + "\n" + rawBody)
  • path: yol ve varsa sorgu dizesi (/api/v1/products?limit=50). Sorgu parametreleri de imzaya dahildir — istediğiniz adresi ne gönderiyorsanız onu imzalayın.
  • rawBody: gönderdiğiniz JSON'un birebir kendisi; GET isteklerinde boş dize.
  • Gövdeyi imzaladıktan sonra yeniden serileştirmeyin — en küçük fark bile imzayı bozar.

Uç Noktalar

YöntemYolAçıklama
GET /api/v1/products Satışa açık tüm ürünler, bayi fiyatlarıyla
GET /api/v1/products/{id} Tek ürün detayı ve stok durumu
POST /api/v1/order Sipariş oluştur — başarılıysa teslimat kodları döner
GET /api/v1/order/{order_no} Sipariş durumu ve teslim edilen kodlar
GET /api/v1/balance Güncel bakiyeniz

Dakikalık istek limiti bayi hesabına göre tanımlanır. Aşıldığında 429 rate_limited döner. Tüm hata yanıtları {"success": false, "error": "...", "message": "..."} biçimindedir.

Entegrasyon Örnekleri

Kopyala-yapıştır çalışır durumdadır

<?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();

        // İmzalama anahtarı = ham secret'ın SHA-256 hex karşılığı
        $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);
        curl_close($ch);
        return json_decode((string)$raw, true) ?: ['success' => false, 'error' => 'invalid_response'];
    }
}

// --- Kullanım ---
$api = new LisansXClient('https://lisansx.net', 'API_ANAHTARINIZ', 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'));
}

Sık Karşılaşılan Hatalar

401 invalid_signature
İmzalama anahtarını sha256(secret) olarak türetmeyi atlamış olabilirsiniz.
401 invalid_timestamp
Sunucunuzun saati kaymış. NTP ile senkronize edin.
403 ip_not_allowed
IP kısıtlaması tanımlı ve isteğiniz listede olmayan bir IP'den geliyor.
409 replayed_request
Aynı imzalı POST isteği ikinci kez geldi (tekrar oynatma koruması). Her isteği yeni zaman damgasıyla imzalayın; aynı saniyede aynı ürüne iki sipariş verecekseniz gövdeye benzersiz bir "nonce" alanı ekleyin (ör. kendi sipariş numaranız).
429 rate_limited
Dakikalık limiti aştınız; isteklerinizi zamana yayın.
409 out_of_stock
Ürün stokta yok ya da istenen adet kadar yok (available alanı kalan adedi verir). Sipariş açılmaz, bakiye çekilmez. Kendi müşterinizden ödeme almadan önce GET /api/v1/products/{id} ile stoğu kontrol edin; stock.changed webhook'u ürün tükenince/geri gelince anında haber verir.
409 price_changed
Siparişe isteğe bağlı "max_unit_price" gönderdiyseniz ve güncel birim fiyat bunu aşıyorsa sipariş açılmaz; unit_price güncel fiyatı verir.
402 delivery_failed
Sipariş açıldı ama ürün teslim edilemedi (ör. kaynakta son anda tükendi). Tutar otomatik olarak bakiyenize iade edilir.
WhatsApp'tan Yaz Telegram'dan Yaz