概览

平台通过统一接口完成授权激活、查询、文件校验与续期。所有接口均为 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 仅用于请求签名,请勿写入前端或公开仓库。

签名算法

  1. 收集本次请求的全部参数(包含公共参数与业务参数),排除 sign。
  2. 按键名 ASCII 升序排序,拼接为 key1=value1&key2=value2 形式,不做 URL 编码。
  3. 使用应用 API Secret 作为密钥,执行 HMAC-SHA256,输出小写十六进制字符串作为 sign。
  4. 服务端校验 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服务端异常