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ık | Değer |
|---|---|
X-Api-Key | API anahtarınız |
X-Timestamp | Unix saniye — sunucu saatinden ±300 sn içinde olmalı |
X-Signature | Aş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öntem | Yol | Açı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 (
availablealanı kalan adedi verir). Sipariş açılmaz, bakiye çekilmez. Kendi müşterinizden ödeme almadan önceGET /api/v1/products/{id}ile stoğu kontrol edin;stock.changedwebhook'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_pricegü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.