API 文档

通过 LisansX REST API,您可以将商品列表和库存同步到自己的网站,下单并即时获取交付代码。 身份验证、接口端点以及 PHP、Node.js 和 Python 示例见下文。

API 密钥仅向经销商发放。 任何人均可查阅文档;发送请求需要有效的经销商套餐。 您的经销商申请获批后,将为您生成密钥。

身份验证

每个请求均通过三个请求头进行签名。由于签名同时涵盖时间戳、HTTP 方法、路径和原始请求体,请求在传输中无法被篡改或重放。

请求头值
X-Api-Key您的 API 密钥
X-TimestampUnix 秒数 — 须与服务器时间相差在 ±300 秒以内
X-Signature按下方公式生成的十六进制签名
signingKey = sha256_hex(api_secret)
signature  = hmac_sha256_hex(signingKey, timestamp + "\n" + METHOD + "\n" + path + "\n" + rawBody)
  • path: 路径 及查询字符串(如有)(/api/v1/products?limit=50)。查询参数同样计入签名——请对您实际请求的 URL 原样签名。
  • rawBody: 您发送的 JSON 原文;GET 请求为空字符串。
  • 签名后请勿重新序列化请求体——哪怕最细微的差异也会导致签名失效。

接口端点

方法路径说明
GET /api/v1/products 所有在售商品,按您的经销商价格显示
GET /api/v1/products/{id} 单个商品详情及库存状态
POST /api/v1/order 创建订单——成功时返回交付码
GET /api/v1/order/{order_no} 订单状态及已交付的代码
GET /api/v1/balance 您的当前余额

每分钟请求限额按经销商账户设定。 超出限额时返回 429 rate_limited。所有错误响应均采用 {"success": false, "error": "...", "message": "..."} 格式。

集成示例

复制粘贴即可使用

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

        // 签名密钥 = 原始 secret 的 SHA-256 十六进制摘要
        $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'];
    }
}

// --- 用法 ---
$api = new LisansXClient('https://lisansx.net', 'YOUR_API_KEY', 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'));
}

常见错误

401 invalid_signature
您可能遗漏了将签名密钥派生为 sha256(secret) 的步骤。
401 invalid_timestamp
您的服务器时间存在偏差,请通过 NTP 进行同步。
403 ip_not_allowed
已设置 IP 限制,而您的请求来自不在列表中的 IP。
409 replayed_request
同一签名的 POST 请求被重复接收(重放保护)。请为每个请求使用新的时间戳签名;如需在同一秒内为同一商品下两笔订单,请在请求体中添加唯一的 "nonce" 字段(例如您自己的订单号)。
429 rate_limited
您已超出每分钟限额,请分散发送请求。
409 out_of_stock
商品缺货或库存不足所需数量(available 字段返回剩余数量)。不会创建订单,也不会扣除余额。向您的客户收款前,请先通过 GET /api/v1/products/{id} 检查库存;stock.changed webhook 会在商品售罄或恢复供应时即时通知您。
409 price_changed
如果您在订单中传入了可选的 "max_unit_price",而当前单价超过该值,则不会创建订单;unit_price 返回当前价格。
402 delivery_failed
订单已创建,但商品未能交付(例如货源在最后一刻售罄)。款项将自动退回您的余额。
通过 Telegram 联系 提交支持工单