概览
平台通过统一接口完成授权激活、查询、文件校验与续期。所有接口均为 POST,请求体支持 application/x-www-form-urlencoded 与 application/json。
接口地址:https://www.naizedianjing.top/api/index.php
响应统一为 JSON:
{"code":0,"msg":"ok","data":{ ... }}
code = 0 表示成功,其余为错误码,见文末说明。
每个应用拥有独立的 AppID 与 API Secret,Secret 仅用于请求签名,请勿写入前端或公开仓库。
签名算法
- 收集本次请求的全部参数(包含公共参数与业务参数),排除
sign。 - 按键名 ASCII 升序排序,拼接为
key1=value1&key2=value2形式,不做 URL 编码。 - 使用应用 API Secret 作为密钥,执行
HMAC-SHA256,输出小写十六进制字符串作为sign。 - 服务端校验
timestamp与服务器时间相差不超过 300 秒,并拒绝 10 分钟内重复出现的nonce。
PHP 示例:
<?php
// 1. 组装公共参数(不含 sign)
$params = [
'appid' => 'NZ1A2B3C4D5E6',
'action' => 'activate',
'identify' => 'SITE-7f3c9a10',
'code' => 'NZ-ABCD-EFGH-JKLM-NPQR',
'timestamp' => (string)time(),
'nonce' => bin2hex(random_bytes(8)),
];
// 2. 参数按键名 ASCII 升序,拼接 k=v&...
ksort($params, SORT_STRING);
$pairs = [];
foreach ($params as $k => $v) {
$pairs[] = $k . '=' . $v;
}
$canonical = implode('&', $pairs);
// 3. HMAC-SHA256,密钥为应用 API Secret,输出小写 hex
$params['sign'] = hash_hmac('sha256', $canonical, $apiSecret);
// 4. 以 application/x-www-form-urlencoded 提交
$ch = curl_init('https://www.naizedianjing.top/api/index.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($params),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
if (($result['code'] ?? -1) !== 0) {
exit('授权失败:' . ($result['msg'] ?? '未知错误'));
}
echo $result['data']['expire_at'] ?? '永久';
公共参数
| 参数 | 必填 | 说明 |
|---|---|---|
appid | 是 | 应用 AppID,在用户中心创建应用后获得 |
action | 是 | 接口名称:activate / query / verify / renew / heartbeat |
timestamp | 是 | 秒级 Unix 时间戳,允许误差 ±300 秒 |
nonce | 是 | 8-64 位随机字符串,10 分钟内不可重复 |
sign | 是 | HMAC-SHA256 签名,小写 hex |
identify | 是 | 机器码 / 站点唯一识别码,1-191 字符 |
激活授权 action=activate
用卡密为识别码创建授权。同一识别码重复使用同一张卡密是幂等的,会直接返回已有授权;若识别码已被其他卡密授权,请改用续期接口。
| 参数 | 必填 | 说明 |
|---|---|---|
code | 是 | 卡密,例如 NZ-ABCD-EFGH-JKLM-NPQR |
note | 否 | 备注,最多 100 字符 |
成功响应:
{
"code": 0,
"msg": "ok",
"data": {
"auth_id": 12,
"identify": "SITE-7f3c9a10",
"state": "active",
"expire_at": "2027-01-15 12:00:00",
"license": "{\n \"payload\": { ... },\n \"signature\": \"...\"\n}",
"license_name": "auth_3f9c...e1.lic"
}
}
expire_at 为 null 表示永久授权。license 即授权文件内容,可直接写入 license_name 指定的文件。
查询授权 action=query
查询识别码的实时状态,除公共参数外无需额外参数。
{
"code": 0,
"msg": "ok",
"data": {
"identify": "SITE-7f3c9a10",
"state": "active",
"expire_at": "2027-01-15 12:00:00",
"last_check_at": "2026-10-17 12:00:00"
}
}
未授权时返回 code=404。state 取值:active 正常、frozen 已冻结、expired 已过期。
校验授权文件 action=verify
提交授权文件原文,服务端会校验 RSA 签名、AppID 归属,并返回实时授权状态。
| 参数 | 必填 | 说明 |
|---|---|---|
license | 是 | 授权文件 JSON 原文,最大 32KB |
{"code":0,"msg":"ok","data":{"valid":true,"state":"active","expire_at":null}}
续期 action=renew
使用未使用的卡密为已授权识别码延长有效期。续期从「当前到期时间」与「当前时间」两者较晚者开始累加;卡密天数为 0 时变为永久授权。
| 参数 | 必填 | 说明 |
|---|---|---|
code | 是 | 未使用的卡密 |
心跳 action=heartbeat
上报在线状态并获取实时授权状态,可用于程序启动时检查。响应字段与查询接口一致,同时刷新最近在线时间。
授权文件
授权文件为 JSON,包含 payload 与 signature 两部分。签名使用应用的 RSA 私钥(2048 位,SHA-256),客户端使用应用详情页的公钥验签,无需请求平台即可离线判断文件真伪。
{
"payload": {
"appid": "NZ1A2B3C4D5E6",
"identify": "SITE-7f3c9a10",
"auth_id": 12,
"issued_at": "2026-10-17 12:00:00",
"nonce": "a1b2c3d4e5f60718",
"expire_at": "2027-01-15 12:00:00"
},
"signature": "base64 编码的 RSA-SHA256 签名"
}
验签步骤:取出 payload,按键名升序排序,使用 JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES 重新编码,再用应用公钥验证 signature。
<?php
// 客户端验签:应用公钥在应用详情页复制,保存为 app_public.pem
$publicKey = file_get_contents(__DIR__ . '/app_public.pem');
$license = json_decode(file_get_contents(__DIR__ . '/auth_xxx.lic'), true);
$payload = $license['payload'];
ksort($payload, SORT_STRING);
$signed = json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$ok = openssl_verify($signed, base64_decode($license['signature']), $publicKey, OPENSSL_ALGO_SHA256) === 1;
if (!$ok) {
exit('授权文件签名无效');
}
if ($payload['appid'] !== '你的 AppID') {
exit('授权文件不属于本应用');
}
if ($payload['expire_at'] !== null && strtotime($payload['expire_at']) < time()) {
exit('授权已过期');
}
echo '授权有效,到期时间:' . ($payload['expire_at'] ?? '永久');
注意:授权文件本身无法体现后台的冻结操作,涉及冻结/过期判断时请调用 verify 或 heartbeat 接口获取实时状态。
错误码
| code | 说明 |
|---|---|
| 0 | 成功 |
| 400 | 参数缺失或格式错误 |
| 401 | 签名错误 / 时间戳过期 / nonce 重复 |
| 403 | 应用或账号被禁用,卡密被禁用 |
| 404 | 应用、卡密或授权不存在 |
| 409 | 状态冲突(如卡密已使用、识别码已授权) |
| 500 | 服务端异常 |