接口基地址:https://api.9awl.com/api,全部接口使用 POST 提交(查询授权信息接口支持 GET),返回 JSON。
通讯密钥(secret):9awl_api_secret_2026,请勿泄露给第三方。
| 接口 | 地址 | 方式 |
|---|---|---|
| 授权验证 | /api/license/verify | POST |
| 激活绑定 | /api/license/activate | POST |
| 解绑设备 | /api/license/unbind | POST |
| 绑定域名 | /api/license/bindDomain | POST |
| 解绑域名 | /api/license/unbindDomain | POST |
| 域名验证 | /api/license/verifyDomain | POST |
| 查询授权 | /api/license/info | GET |
为防止接口被伪造调用,除查询接口外均需携带 sign 参数,计算方式如下(结果转为大写):
sign = MD5( 授权码 + 设备号 + 通讯密钥 ) // 转大写
示例:授权码 DEMO-9AWL-2026-VIP1-0001,设备号 PC-8F21-4C90,则
sign = strtoupper(md5('DEMO-9AWL-2026-VIP1-0001' + 'PC-8F21-4C90' + secret))
域名授权接口(绑定 / 解绑 / 验证)的签名计算方式相同,仅将「设备号」替换为「域名」:
sign = MD5( 授权码 + 域名 + 通讯密钥 ) // 转大写,域名小写
软件启动或定时心跳时调用,用于校验授权是否有效。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
code | string | 是 | 授权码 |
device_id | string | 是 | 设备唯一标识(建议取硬件指纹) |
sign | string | 是 | 签名,见上 |
// 返回示例
{
"code": 0,
"msg": "验证通过",
"data": {
"code": "DEMO-9AWL-2026-VIP1-0001",
"product": "就爱云控系统",
"plan": "年度授权",
"status": 1,
"status_text": "已激活",
"max_devices": 3,
"used_devices": 1,
"expires_at": "2027-06-01 10:00:00",
"is_forever": false,
"remain_days": 243
},
"time": 1780000000
}
首次在设备上使用授权码时调用,用于激活授权并绑定设备。参数在验证接口基础上增加 device_name(域名,可选)。
POST {$baseUrl}/license/activate
code=DEMO-9AWL-2026-VIP1-0001
device_id=PC-8F21-4C90
device_name=www.9awl.com
sign=XXXXXXXX
用于换机场景。解绑后该设备不再占用授权名额,可重新绑定新设备。参数:code、device_id、sign。
用于将授权码与部署域名绑定,常见于 SaaS / 在线服务场景。首次绑定会自动激活授权(同设备激活逻辑),域名额度与设备共享 max_devices 上限。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
code | string | 是 | 授权码 |
domain | string | 是 | 绑定的域名(如 www.9awl.com,自动转小写) |
sign | string | 是 | 签名 = MD5(授权码 + 域名 + 密钥),转大写 |
POST {$baseUrl}/license/bindDomain
code=DEMO-9AWL-2026-VIP1-0001
domain=www.9awl.com
sign=XXXXXXXX
用于更换部署域名。解绑后该域名释放名额,可重新绑定新域名。参数:code、domain、sign。
在线服务运行期间定时调用,校验授权与域名绑定是否有效。验证通过会刷新 last_verify_at(日志做 30 秒节流)。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
code | string | 是 | 授权码 |
domain | string | 是 | 需验证的域名 |
sign | string | 是 | 签名 = MD5(授权码 + 域名 + 密钥),转大写 |
无需签名,仅用于查询授权基础信息(脱敏场景请改用用户中心)。
GET {$baseUrl}/license/info?code=DEMO-9AWL-2026-VIP1-0001
| code | 说明 |
|---|---|
0 | 成功 |
1001 | 授权码不存在 |
1002 | 授权已被冻结 |
1003 | 授权已过期 |
1004 | 绑定设备数已达上限 |
1005 | 签名校验失败 |
1006 | 参数错误 |
1007 | 当前设备未绑定该授权 |
1008 | 授权尚未激活 |
1009 | 授权归属其他账号 |
1010 | 当前域名未绑定该授权 |
$code = 'DEMO-9AWL-2026-VIP1-0001';
$deviceId = 'PC-8F21-4C90';
$secret = '你的通讯密钥';
$sign = strtoupper(md5($code . $deviceId . $secret));
$params = http_build_query([
'code' => $code,
'device_id' => $deviceId,
'sign' => $sign,
]);
$ch = curl_init('https://api.9awl.com/api/license/verify');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $params,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 5,
]);
$result = json_decode(curl_exec($ch), true);
if ($result['code'] === 0) {
echo '授权有效,剩余 ' . $result['data']['remain_days'] . ' 天';
} else {
echo '授权校验失败:' . $result['msg'];
}