API 文档
通过 LisansX REST API,您可以将商品列表和库存同步到自己的网站,下单并即时获取交付代码。 身份验证、接口端点以及 PHP、Node.js 和 Python 示例见下文。
API 密钥仅向经销商发放。 任何人均可查阅文档;发送请求需要有效的经销商套餐。 您的经销商申请获批后,将为您生成密钥。
身份验证
每个请求均通过三个请求头进行签名。由于签名同时涵盖时间戳、HTTP 方法、路径和原始请求体,请求在传输中无法被篡改或重放。
| 请求头 | 值 |
|---|---|
X-Api-Key | 您的 API 密钥 |
X-Timestamp | Unix 秒数 — 须与服务器时间相差在 ±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.changedwebhook 会在商品售罄或恢复供应时即时通知您。 409 price_changed- 如果您在订单中传入了可选的
"max_unit_price",而当前单价超过该值,则不会创建订单;unit_price返回当前价格。 402 delivery_failed- 订单已创建,但商品未能交付(例如货源在最后一刻售罄)。款项将自动退回您的余额。