授权 API
供客户系统(协会/商城/外贸)验证授权使用。
一、验证授权
POST /api/license/verify
Content-Type: application/json
请求
{
"license": "XH-2026-DEMO-0001",
"domain": "demo.xiehui.com",
"product": "xiehui",
"version": "1.0.0"
}
成功响应
{
"code": 0,
"data": {
"valid": true,
"plan": "pro",
"domain_matched": "demo.xiehui.com",
"expire_at": "2027-11-06 00:00:00",
"days_left": 365,
"server_time": "2026-11-06 08:00:00",
"token": "base64(json)",
"signature": "base64(rsa签名)"
}
}
错误码
| code | 含义 | |---|---| | 1001 | 授权码不存在 | | 1002 | 授权已过期 | | 1003 | 域名不匹配 | | 1004 | 授权已吊销 | | 1005 | 产品不匹配 |
二、防绕过机制
授权站返回的 token 是 JSON 的 base64,signature 是私钥签名。
客户系统必须:
- 用内置公钥验签 token
- 验签通过才信任
- 不要只信网络返回的
valid: true(可能被中间人伪造)
$ok = openssl_verify($token, base64_decode($signature), $publicKey, OPENSSL_ALGO_SHA256) === 1;
三、公钥获取
GET /api/keys
{
"code": 0,
"data": {
"primary": { "name": "key-2026", "public_key": "-----BEGIN PUBLIC KEY-----..." },
"secondary": { "name": "key-2025", "public_key": "-----BEGIN PUBLIC KEY-----..." }
}
}
客户系统内置主备两把公钥,验签时先主后备,换密钥不影响老客户。
四、离线授权
POST /api/license/offline
请求:
{
"license": "XH-2026-DEMO-0001",
"domain": "intranet.local",
"fingerprint": "可选机器指纹"
}
响应:返回 base64 的 license.dat 文件内容,客户系统本地验签后离线可用。
五、版本查询
GET /api/version/latest?product=xiehui¤t=1.0.0
{
"code": 0,
"data": {
"latest": "1.6.0",
"has_update": true,
"changelog": "· 仪表盘改版\n· ...",
"download_url": "https://.../api/version/download/12",
"package_hash": "sha256...",
"package_sign": "base64签名"
}
}
六、下载更新包
GET /api/version/download/{id}?license=xxx&domain=xxx
需授权验证通过才返回文件。
七、调用示例(PHP)
$resp = Http::timeout(10)->post('https://cy.yunfenxiang.net/api/license/verify', [
'license' => config('license.code'),
'domain' => request()->getHost(),
'product' => 'xiehui',
]);
$data = $resp->json('data');
// 验签
$pub = config('license.public_key');
$ok = openssl_verify($data['token'], base64_decode($data['signature']), $pub, OPENSSL_ALGO_SHA256);
if ($ok === 1 && $data['valid']) {
// 授权有效
}
下一篇:客户系统集成