供 zy-client 分后台安装激活、定时校验、版本检查、升级下载与状态上报使用。
全部接口位于总后台域名 https://zht.yuxian.cyou/api/ 下,支持 POST JSON 与 POST 表单,
响应统一为 UTF-8 JSON,字段包含 code、msg、data、timestamp、sign。
| 接口 | 方法 | 用途 | 调用时机 |
|---|---|---|---|
| api/verify.php | POST | 安装激活 / 定时授权校验 | 安装时、每 30-60 分钟 |
| api/check_update.php | POST | 检查最新版本 | 随校验或手动检查 |
| api/download_package.php | POST | 下载 ZIP 升级包 | 执行升级前 |
| api/report_status.php | POST | 上报升级结果 | 升级成功/失败/回滚后 |
| api/notice.php | POST | 拉取发行方公告 | 按需 |
| 参数 | 类型 | 说明 |
|---|---|---|
| license_key | string | 总后台颁发的授权码,形如 ZY-XXXX-XXXX-XXXX-XXXX |
| domain | string | 分后台部署域名(不含协议与路径),需在授权下绑定 |
| timestamp | int | Unix 秒级时间戳,与服务器相差超过有效窗口即拒绝 |
| nonce | string | 每次请求唯一的随机串,10 分钟内重复视为重放 |
| mode | string | activate(仅安装首次)或 verify(运行期) |
| sign | string | HMAC-SHA256 签名,小写十六进制 |
sign 为 data 的 HMAC 值,分后台须校验后再采信,防止中间人篡改。blacklist。签名原文按固定顺序以竖线连接:action|license_key|domain|timestamp|nonce|mode|[附加字段...]。
附加字段由具体接口定义,缺失时按空字符串参与拼接。校验接口在请求携带 current_version 时,
该字段作为附加字段追加到末尾;未携带时按基础六字段拼接即可。
$fields = ['verify', $license_key, $domain, $timestamp, $nonce, $mode];
if ($current_version !== '') {
$fields[] = $current_version; // 与请求中实际携带的字段保持一致
}
$canonical = implode('|', $fields);
$secret = ($mode === 'activate') ? $license_key : $license_secret;
$sign = hash_hmac('sha256', $canonical, $secret);
data.secret 中下发该授权专属密钥,后续所有校验均改用此密钥,且响应不再重复下发。响应验签:
$payload = json_encode($resp['data'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$ok = hash_equals(hash_hmac('sha256', $payload, $secret), $resp['sign']);
{
"license_key": "ZY-ABCD-EFGH-JKLM-NPQR",
"domain": "kefu.example.com",
"timestamp": 1730000000,
"nonce": "a1b2c3d4e5f6...",
"mode": "verify",
"current_version": "v1.0.0",
"sign": "..."
}
| 字段 | 说明 |
|---|---|
| status | active / suspended / expired / blacklist / domain_mismatch / domain_limit / invalid |
| grade | normal / warning / disabled,供分后台执行分级控制 |
| client_name / product | 客户名称与产品标识 |
| expire_at / days_left / warn_days | 到期时间与预警窗口 |
| domains / max_domains | 已绑定域名列表与上限 |
| secret | 仅 mode=activate 成功时返回 |
| grace_hours / check_interval | 断网缓冲小时数、建议校验周期(秒) |
| version | 最新版本信息与 has_update 标记 |
| server_time | 服务器时间,供分后台校准 |
安装激活(mode=activate)时,若域名未绑定且未超出 max_domains,接口会自动完成首次绑定;
运行期校验则要求域名必须已绑定且处于生效状态。
附加签名字段:current_version。签名原文:
check_update|{license_key}|{domain}|{timestamp}|{nonce}|verify|{current_version}
返回 has_update、version(含 force 强制标记、package_hash、
min_version)、download_endpoint 与 need_pre_upgrade。强制更新版本优先下发。
附加签名字段:version。校验通过且升级包存在时返回 application/zip 二进制流;
失败返回 JSON。分后台下载后须按 package_hash 做 SHA256 比对,不一致立即终止升级。
附加签名字段顺序固定:current_version|target_version|upgrade_status|message。
upgrade_status 取值:none / pending / success / failed / rollback。
总后台按「授权码 + 域名」唯一键登记,形成全网版本分布视图。
附加签名字段:limit(1-20,默认 5)。返回 notices 数组,含标题、正文、类型、置顶与发布时间。
| code | 含义 | 分后台建议动作 |
|---|---|---|
| 0 | 校验通过 | 刷新本地授权缓存,恢复正常等级 |
| 2 | 授权码不存在 | 安装终止 / 运行期进入失效等级 |
| 3 / 4 | 域名上限 / 域名未授权 | 提示管理员核对绑定域名 |
| 5 / 6 | 授权暂停 / 已到期 | 禁用业务,仅保留授权页与升级入口 |
| 9 | 总后台未安装 | 提示检查接口地址 |
| 400 / 401 | 参数缺失 / 签名或时间戳错误 / 重放 | 记录安全日志,校准时间后重试 |
| 403 | 命中黑名单 | 立即停用业务 |
| 429 | 频率限制 | 退避后重试 |
分后台采用四级失效控制:normal(正常)、warning(到期预警,仅提示)、 grace(断网缓冲 72 小时内只读降级)、disabled(业务停用)。
$payload = [
'license_key' => $licenseKey,
'domain' => $domain,
'timestamp' => time(),
'nonce' => bin2hex(random_bytes(16)),
'mode' => 'activate',
];
$payload['sign'] = hash_hmac('sha256',
'verify|'.$payload['license_key'].'|'.$payload['domain'].'|'
.$payload['timestamp'].'|'.$payload['nonce'].'|'.$payload['mode'],
$licenseKey);
$ch = curl_init('https://zht.yuxian.cyou/api/verify.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 15,
]);
$resp = json_decode(curl_exec($ch), true);
if ($resp['code'] === 0) {
$secret = $resp['data']['secret']; // 保存到本地配置
}