1.7 KiB
1.7 KiB
授权云端 API 约定(独立服务实现)
用户端仓库仅包含 license_lib.py;签发 Web 与数据库部署在独立项目。
环境变量(用户端 .env)
| 变量 | 说明 |
|---|---|
LICENSE_API_URL |
云端根地址,如 https://license.example.com |
LICENSE_CLIENT_KEY |
客户端密钥,请求头 X-Client-Key |
LICENSE_CHECK_INTERVAL_DAYS |
校验间隔,默认 3 |
LICENSE_OFFLINE_GRACE_DAYS |
断网宽限,默认 7 |
LICENSE_DISABLED |
true 时关闭许可(仅开发) |
LICENSE_WECHAT_ID |
默认 dekun03 |
LICENSE_WECHAT_REMARK |
可选;未设则提示用户用设备 ID 作备注 |
本地缓存:仓库根目录 .license/license.cache(勿提交 Git)。
POST /v1/redeem
请求:
{
"device_id": "32位十六进制",
"code": "一次性激活码"
}
成功响应:
{
"ok": true,
"subscription_id": "sub_xxx",
"plan": "monthly",
"expires_at": "2026-06-21T23:59:59+08:00"
}
续费叠加(服务端实现):
base = max(now, current_expires_at)
expires_at = base + days(plan) # monthly 30 / quarterly 90 / yearly 365
失败:ok: false,message 说明原因。
POST /v1/validate
请求:
{
"device_id": "...",
"subscription_id": "sub_xxx"
}
成功且有效:
{
"ok": true,
"valid": true,
"expires_at": "2026-06-21T23:59:59+08:00",
"plan": "monthly"
}
无效(换机、过期等):
{
"ok": true,
"valid": false,
"reason": "device_revoked"
}
套餐定价(商务参考)
| plan | 售价 | 天数 |
|---|---|---|
| monthly | 199 | 30 |
| quarterly | 399 | 90 |
| yearly | 699 | 365 |