first commit
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
# 授权云端 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
|
||||
|
||||
请求:
|
||||
|
||||
```json
|
||||
{
|
||||
"device_id": "32位十六进制",
|
||||
"code": "一次性激活码"
|
||||
}
|
||||
```
|
||||
|
||||
成功响应:
|
||||
|
||||
```json
|
||||
{
|
||||
"ok": true,
|
||||
"subscription_id": "sub_xxx",
|
||||
"plan": "monthly",
|
||||
"expires_at": "2026-06-21T23:59:59+08:00"
|
||||
}
|
||||
```
|
||||
|
||||
续费叠加(服务端实现):
|
||||
|
||||
```text
|
||||
base = max(now, current_expires_at)
|
||||
expires_at = base + days(plan) # monthly 30 / quarterly 90 / yearly 365
|
||||
```
|
||||
|
||||
失败:`ok: false`,`message` 说明原因。
|
||||
|
||||
## POST /v1/validate
|
||||
|
||||
请求:
|
||||
|
||||
```json
|
||||
{
|
||||
"device_id": "...",
|
||||
"subscription_id": "sub_xxx"
|
||||
}
|
||||
```
|
||||
|
||||
成功且有效:
|
||||
|
||||
```json
|
||||
{
|
||||
"ok": true,
|
||||
"valid": true,
|
||||
"expires_at": "2026-06-21T23:59:59+08:00",
|
||||
"plan": "monthly"
|
||||
}
|
||||
```
|
||||
|
||||
无效(换机、过期等):
|
||||
|
||||
```json
|
||||
{
|
||||
"ok": true,
|
||||
"valid": false,
|
||||
"reason": "device_revoked"
|
||||
}
|
||||
```
|
||||
|
||||
## 套餐定价(商务参考)
|
||||
|
||||
| plan | 售价 | 天数 |
|
||||
|------|------|------|
|
||||
| monthly | 199 | 30 |
|
||||
| quarterly | 399 | 90 |
|
||||
| yearly | 699 | 365 |
|
||||
Reference in New Issue
Block a user