API

V3.0 接口说明

路径、参数顺序、签名公式与成功 JSON 对齐科御网络验证系统开发文档 V3.0.0。apiRoute 不含前缀 /v3/,例如 License/verify/10000。

签名规则

  1. 时间戳为东八区 10 位 Unix 秒,与服务器相差超过 60 秒返回 502
  2. 仅签名模式:sign = MD5(apiRoute + 有序参数 + signKey)。signKey 只参与本地拼接,不放进请求体。
  3. AES 多重校验:data = Base64(AES-128-ECB-PKCS7(mode|authCode|password|deviceId|timeStamp, signKey)),sign 仍按明文公式计算,不加密。加密密钥即为签名密钥(UTF-8,不足 16 字节补 0,超出截断)。RSA 签名不要拼接系统公钥。科御 AES 项目请求体是 data=&sign=&encoding=utf-8
  4. 成功响应签名:返回参数前 5 项按出现顺序无分隔拼接 + 签名密钥。验证接口为sign = MD5(code + endDate + token + remark + timeStamp + signKey)。AES 响应除 sign 外每个字段单独加密。失败 sign = MD5(code + msg + signKey)
  5. deviceId 只允许字母和数字,长度 5-64;带连字符会返回 203 设备ID只能是字母和数字。
  6. Content-Type 推荐 application/x-www-form-urlencoded;也接受 JSON 与 GET 查询串。
const apiRoute = "License/verify/" + appId;
const sign = md5(apiRoute + mode + authCode + password + deviceId + timeStamp + signKey);

// 科御 AES(官方默认):
// data = Base64(AES-128-ECB-PKCS7(mode|authCode|password|deviceId|timeStamp, signKey))
// POST body: data=<urlencode(b64)>&sign=<md5>&encoding=utf-8

// 仅签名:
// body: mode=0&authCode=...&password=&deviceId=DEVDEMO0001&timeStamp=...&sign=...

// 响应:除 sign 外每字段单独 AES+Base64;sign = md5(明文前5项 + signKey)

Linux C 测试示例

单文件,gcc + libssl 运行库。内置 MD5、AES-128-ECB PKCS7、Base64;HTTP/HTTPS POST(80 遇到 308 会自动改走 443)。默认按科御 AES 发送 data+sign+encoding。

# 编译
gcc -O2 -Wall -o keyunet_verify keyunet_verify.c -ldl

./keyunet_verify -t

# 官方科御 AES(默认):POST data=&sign=&encoding=utf-8
./keyunet_verify -H api.keyunet.cn -P 80 \
  -A 67612919 -K gngkcyuBkc56xMmM \
  -C MYo1VJWrGdWm -D MYLINUX001 -m 0

# 本站仅签名项目再加 -e sign -s
./keyunet_verify -H keyu.grok.me -s -e sign \
  -A 10000 -K KeyuNetSignKey01 -C KY-YEAR-DEMO01 -D DEVDEMO0001

# signKey 只在本地拼进 MD5 / 当 AES 密钥,不放进请求体
# deviceId 只能字母数字,不能有 -

完整源码:keyunet_verify.c/Makefile

网络验证

网络验证

POST /v3/License/verify/{appId}

参数
mode, authCode, password, deviceId, timeStamp, sign, encoding?
签名拼接
apiRoute + mode + authCode + password + deviceId + timeStamp + signKey
成功返回
{ "code": 200, "endDate": "...", "token": "...", "remark": "...", "timeStamp": 0, "sign": "..." }

appId 即项目 ID。计次以 surplusCount 代替 endDate。卡密模式 password 为空。deviceId 仅字母数字 5-64 位。成功 sign = MD5(code+endDate+token+remark+timeStamp+signKey)。冻结卡 102 授权冻结;黑名单 102 授权已被封禁;过期 101;错卡 103。

心跳守护

POST /v3/License/heartBeat/{appId}

参数
token, deviceId, timeStamp, sign
签名拼接
apiRoute + token + deviceId + timeStamp + signKey
成功返回
{ "code": 200, "endDate": "...", "timeStamp": 0, "sign": "..." }

成功 sign = MD5(code+endDate+timeStamp+signKey)。计次用 surplusCount。失败 504 令牌无效;设备不一致 104;建议间隔不低于 200 秒。

黑名封禁

POST /v3/Project/bl/{appId}

参数
deviceId, timeStamp, sign
签名拼接
apiRoute + deviceId + timeStamp + signKey
成功返回
{ "code": 200, "msg": "操作成功" }

拉黑设备与来源 IP 后,验证 / 心跳返回 102 授权已被封禁。

云端数据

远程函数

POST /v3/Variable/runFunction/{appId}

参数
funName, params, token, timeStamp, sign
签名拼接
apiRoute + funName + params + token + timeStamp + signKey
成功返回
{ "code": 200, "result": "...", "timeStamp": 0, "sign": "..." }

需有效心跳令牌。函数体为自定义 JS,return 写入 result。params 英文逗号拆成 $1…$9。响应 sign = MD5(code+result+timeStamp+signKey)。

添加变量

POST /v3/Variable/addVal/{appId}

参数
varName, value, remark, timeStamp, sign
签名拼接
apiRoute + varName + value + remark + timeStamp + signKey
成功返回
{ "code": 200, "msg": "..." }

变量名不可重复,已存在返回 508。

删除变量

POST /v3/Variable/delVal/{appId}

参数
varName, timeStamp, sign
签名拼接
apiRoute + varName + timeStamp + signKey
成功返回
{ "code": 200, "msg": "..." }

不存在返回 505 远程变量不存在。

更新变量

POST /v3/Variable/setVal/{appId}

参数
varName, value, timeStamp, sign
签名拼接
apiRoute + varName + value + timeStamp + signKey
成功返回
{ "code": 200, "msg": "..." }

不存在或已停用返回 505。

读取变量

POST /v3/Variable/getVal/{appId}

参数
varName, token, timeStamp, sign
签名拼接
apiRoute + varName + token + timeStamp + signKey
成功返回
{ "code": 200, "value": "Hello,World!", "timeStamp": 0, "sign": "..." }

需要有效心跳令牌。返回 sign = MD5(code+value+timeStamp+signKey)。

更新备注

POST /v3/Variable/setRemark/{appId}

参数
authCode, remark, timeStamp, sign
签名拼接
apiRoute + authCode + remark + timeStamp + signKey
成功返回
{ "code": 200, "msg": "..." }

按卡号更新备注;卡号不存在返回 602。

项目信息

POST /v3/Project/appInfo/{appId}

参数
select, timeStamp, sign
签名拼接
apiRoute + select + timeStamp + signKey
成功返回
{ "code": 200, "appName": "...", "version": 1.1, ... "timeStamp": 0, "sign": "..." }

select=0 全部,签名为除 sign 外全部字段顺序拼接;1–12 单项,签名 = code+该项+timeStamp+signKey(9 为商店链接)。

自动更新

GET /update/{appId}?key=&version=

参数
key, version
签名拼接
key 为项目签名密钥(演示可传 demo)
成功返回
{ "code": 200, "force": false, "dialog": true, "version": 1.1, "file_name": "", "download_url": "...", "md5": "", "download_timeout": 60, "msg": "..." }

{appId} 同样是项目 ID。方案①用项目版本+下载网址;方案②热更新 GET。这是少数会在 URL 里带 key 的接口。

状态码

100项目停用
101授权过期
102授权冻结
103卡号或账号密码错误
104已更换设备或超过多开上限
105已激活的卡密不能更改计费模式
200通过 / 成功
201项目ID错误
202账号已存在
203输入不符合规则
204密码与确认密码不同
205新密码不能和旧密码相同
206已达试用或注册上限
207项目已关闭试用
301充值卡号错误
302被充值卡号或账号未使用过
303被充值卡号或账号错误
304一号多开的卡密不能充值
401要换机的卡号或账户错误
402换机码无效
500点数不足
501包月过期
502签名过期,请检查提交的时间戳
503签名错误,请检查各个变量是否正常以及签名拼接顺序是否正确
504令牌无效
505变量不存在或变量已停用
506变量可用请求次数已用完
507变量可用总条数达到上限
508远程变量添加失败,变量名已被使用
600请求过于频繁
601输入不符合规则
602更新数据失败
603函数不存在或函数已停用
604函数或参数存在错误
605函数执行异常