WHC系列:License Management System --- 自托管软件许可证管理平台

Edward

发布于4天前
应怜鱼乱红纱涨,莫道青衿梦里游

🎯 What —— 这是什么?

  • 🏷️ 一句话定位:为自有软件批量生成许可证,并完成设备绑定、有效期控制、状态管理和客户端在线校验。

  • 🚀 核心优势

    • 完整许可证生命周期:支持批量生成、首次激活、延期、暂停、封禁、恢复、吊销和设备解绑。
    • 客户端接入简单:Android SDK 或普通 HTTP 客户端使用 API Key 即可完成激活、校验和换机。
    • 🔒 私有部署与服务端持久化:许可证、用户、API Key 和审计日志保存在 PostgreSQL,不依赖某个浏览器保存业务数据。
    • 📊 统计与操作留痕:可查看激活率、收入、到期趋势、设备分布和后台管理记录。
  • 📊 适用场景

    • 自己开发并通过官网、网盘或线下渠道分发的 Android 应用。
    • B2B、企业内部、定制软件或“一客户一授权”的交付模式。
    • 需要限制设备数量、控制授权期限,并保留操作审计的软件产品。

注意:请只把许可证能力接入自己拥有版权或已经获得修改授权的软件。若应用通过 Google Play 销售数字内容,还需要另外确认 Google Play Billing 的最新政策。

🛠️ How —— 怎么用?

使用场景:向一家软件客户发放 Android 企业版授权

假设你维护一款 Android 企业应用,现在要给 苏州星帆软件有限公司 发放两枚 90 天许可证:

  • 一枚用于客户正式设备;
  • 一枚作为备用授权;
  • 每枚单价记录为 899
  • 客户最多可以自助换机 3 次;
  • 批次备注为 华东区 2026 年 8 月 Android 企业版授权

下面就按照这个信息,从登录、生成许可证一直走到客户端激活、换机和审计。

登录应用

打开应用后,点击 **Sign in with Lazycat(使用懒猫账号登录)**进行登录。
CleanShot 2026-07-29 at 20.32.53.png

先看懂 Dashboard

登录后首先进入 Dashboard(概览)。这里适合每天快速看一次许可证系统的整体状态。

CleanShot 2026-07-29 at 20.34.50.png

页面主要包含:

  1. Total licenses:系统中的许可证总数。
  2. Active / Expired / Banned:当前激活、过期和封禁数量。
  3. Activations today / this month:当天和当月激活情况。
  4. Revenue:根据许可证里填写的单价汇总。
  5. Expiring in 7 days:即将到期、需要续费跟进的客户。
  6. Recent activity:最近的登录、生成、状态修改和 API Key 操作。
  7. License mix:未使用、暂停、吊销和永久许可证的组成。

批量生成许可证

点击左侧 Generate(生成),进入 Generate licenses(生成许可证) 页面。

CleanShot 2026-07-29 at 20.35.50.png

按照下面的示例填写:

页面字段示例内容用途
Unlimited (lifetime)关闭本次使用固定期限
Duration (days)90从首次激活开始计算
Number of keys2给客户发放两枚密钥
Customer (optional)苏州星帆软件有限公司后续可按客户名称搜索
Unit price (optional)899用于内部收入统计
Device reset quota3 resets客户最多自助换机 3 次
Notes (optional)华东区 2026 年 8 月 Android 企业版授权记录销售批次和产品版本

CleanShot 2026-07-29 at 20.37.30.png

填写完成后,点击 Generate 2 licenses(生成 2 个许可证)

CleanShot 2026-07-29 at 20.37.49.png

右侧出现 2 keys created 就表示生成成功。

建议立即复制两枚密钥,分别记录为:

  • KEY-A:客户正式设备使用;
  • KEY-B:备用和状态管理测试。

新生成的许可证状态为 UNUSED。这时有效期还没有开始倒计时,只有客户第一次成功激活后,系统才会计算 90 天后的到期日期。

把许可证保存成 CSV

生成结果右上角有 CSV 按钮。可以选择 保存至本地保存至懒猫

如果选择 保存至懒猫,会打开懒猫文件选择器,保存你需要的位置。

保存后可以直接在懒猫网盘里打开查看是否保存正确。

CleanShot 2026-07-29 at 20.41.20.png

搜索并管理许可证

点击左侧进入 Licenses(许可证)

CleanShot 2026-07-29 at 20.42.40.png

顶部搜索框支持搜索:

  • 完整许可证密钥;
  • 客户名称;
  • 设备 ID 或设备名称;
  • 备注内容。

例如输入:

苏州星帆软件有限公司

即可找到刚才生成的两枚许可证。右侧状态筛选可以选择 UnusedActiveSuspendedBannedExpiredRevoked

点击许可证密钥进入详情页,页面包含三个标签:

  1. Overview(概览):有效期、设备、客户、价格、备注和重置次数。
  2. Manage(管理):修改备注或延长有效期。
  3. Activity(活动):查看这枚许可证自己的激活、校验、解绑和管理记录。

CleanShot 2026-07-29 at 20.43.44.png

给许可证补充合同备注

打开 KSM-V7U2-PGQG-U64R,进入 Manage(管理),在 Notes(备注) 中填写:

合同编号 XF-2026-0801;客户备用授权;交付人王海

点击 Save notes(保存备注)

CleanShot 2026-07-29 at 20.44.33.png

回到 Overview(概览) 可以看到新备注;打开 Activity(活动) 也会立即出现更新记录。

CleanShot 2026-07-29 at 20.45.34.png

CleanShot 2026-07-29 at 20.52.43.png

备注适合记录合同号、客户、产品版本和交付批次,不要在这里保存 API Key、密码或其他敏感凭据。

延长未激活许可证

仍在 KSM-V7U2-PGQG-U64R → Manage(管理) 中,点击 +30d,再点击 Extend by 30 days(延长 30 天)

CleanShot 2026-07-29 at 20.53.21.png
这时:

  • Duration 会从 90 days 增加到 120 days
  • Status 仍然是 UNUSED
  • Activated 仍然显示 Not activated
  • Expires 仍然是

CleanShot 2026-07-29 at 21.09.36.png

暂停、封禁和恢复许可证

许可证详情右上角的 Actions(操作) 包含不同状态控制:

操作适合场景是否可恢复
Suspend(暂停)等待付款、临时调查或暂时停止服务可以 Resume
Ban(封禁)怀疑许可证分享、退款欺诈或违规使用可以 Unban
Reset device(重置设备)客户更换手机,需要解除旧设备绑定可以重新激活
Revoke(永久吊销)确认许可证永久失效不可恢复
Delete(删除)误创建或清理测试数据不可恢复

CleanShot 2026-07-29 at 21.10.11.png
例如,客户尾款尚未确认时:

  1. 点击 Actions → Suspend
  2. Reason (optional) 填写:
等待客户确认尾款

CleanShot 2026-07-29 at 21.10.37.png
3. 确认后状态变为 SUSPENDED
4. 原来的合同备注仍保留在 Notes
5. 暂停原因会单独显示为 Moderation reason

CleanShot 2026-07-29 at 21.11.13.png
6. 客户完成付款后,点击 Actions → Resume 恢复。

CleanShot 2026-07-29 at 21.11.48.png
如果这枚许可证还没有激活,恢复后会回到 UNUSED;如果已经激活且尚未过期,则会回到 ACTIVE

RevokeDelete 都是破坏性操作。正式客户密钥不要用来做测试,建议另外生成一枚专用测试许可证。

创建客户端 API Key

许可证已经生成,但 Android 客户端还需要一枚 API Key 才能调用激活和校验接口。

进入 Settings(设置) → API keys(接口密钥),输入:

Android 企业版验收 2026-08

CleanShot 2026-07-29 at 21.12.46.png
点击 Create(创建)

系统会弹出 API key created 对话框,并且只在这一次显示完整明文。请立即复制并安全保存:

lsk_xxxxxxxx.xxxxxxxxxxxxxxxxx

CleanShot 2026-07-29 at 21.13.01.png
关闭对话框后,列表只显示 API Key 的 prefix,无法再次恢复完整内容。

建议为不同环境分别创建:

  • Android Production
  • Android Staging
  • Android QA

这样某个环境发生泄露时,只需撤销对应 API Key,不会影响其他客户端。

用 API 激活客户设备

License Manager 在同一个应用域名下公开四个客户端端点:

POST /api/v1/license/activate
POST /api/v1/license/validate
GET  /api/v1/license/me
POST /api/v1/license/reset-device

先准备变量,把 <CLIENT_API_KEY><KEY-A> 替换成真实内容:

BASE_URL='https://license-manager.你的懒猫微服名.heiyu.space/api/v1'
CLIENT_API_KEY='<CLIENT_API_KEY>'
LICENSE_KEY='<KEY-A>'
DEVICE_ID='suzhou-xingfan-android-001'

执行首次激活:

curl -sS -X POST "$BASE_URL/license/activate" \
  -H "X-API-Key: $CLIENT_API_KEY" \
  -H 'Content-Type: application/json' \
  -d "{
    \"key\":\"$LICENSE_KEY\",
    \"deviceId\":\"$DEVICE_ID\",
    \"deviceName\":\"苏州星帆测试机 01\",
    \"deviceModel\":\"Xiaomi 15\",
    \"appVersion\":\"3.2.0\"
  }"

成功后,返回数据中会看到:

{
  "status": "ACTIVE",
  "deviceId": "suzhou-xingfan-android-001",
  "deviceName": "苏州星帆测试机 01",
  "deviceModel": "Xiaomi 15",
  "appVersion": "3.2.0",
  "alreadyActive": false,
  "daysRemaining": 90
}

CleanShot 2026-07-29 at 21.25.51.png
回到 KSM-V7U2-PGQG-U64R → Overview(概览),设备、激活时间和到期时间也会同步更新。

CleanShot 2026-07-29 at 21.27.15.png

客户换手机时怎么处理

如果原设备仍可使用,可由客户端自助解绑:

curl -sS -X POST "$BASE_URL/license/reset-device" \
  -H "X-API-Key: $CLIENT_API_KEY" \
  -H 'Content-Type: application/json' \
  -d "{
    \"key\":\"$LICENSE_KEY\",
    \"deviceId\":\"$DEVICE_ID\"
  }"

成功后,详情页的设备绑定会被清空,Resets used0 / 3 变为 1 / 3,然后客户就可以在新设备重新激活。

CleanShot 2026-07-29 at 21.28.45.png

如果原手机损坏或无法联网,管理员可以打开许可证详情,点击 Actions → Reset device 强制解绑。管理员强制解绑用于客服处理,不消耗客户自助换机额度。

查看 Statistics

点击左侧 Statistics(统计),可以切换:

7 days / 30 days / 90 days / 1 year

CleanShot 2026-07-29 at 21.29.34.png

这里主要看:

  • Activation rate:已经开始使用的许可证比例;
  • Churn rate:过期或吊销许可证占比;
  • Avg. revenue / license:许可证平均记录金额;
  • Activations / Expirations:激活和到期趋势;
  • Status distribution:各状态组成;
  • Device distribution:客户使用的设备型号分布。

如果刚完成激活,刷新后应能在状态和设备统计里看到变化。

查看审计记录和单许可证 Activity

点击 Audit Logs(审计日志),可以按关键词和动作筛选登录、生成、编辑、暂停、封禁、删除、API Key 创建和撤销等后台操作。

CleanShot 2026-07-29 at 21.30.10.png

例如选择:

license generate
license suspend
license unsuspend
apikey create

可以检查操作人、目标、IP 和时间。

客户端激活、校验和自助解绑属于单枚许可证的高频事件,不要只在全局 Audit Logs 中查找。请打开对应许可证详情,再进入 Activity(活动)

后续怎么坚持用

日常可以按照下面的顺序使用:

  1. 每天看 Dashboard:关注到期、封禁和异常活动。
  2. 按客户批次生成许可证:客户名称、合同号和产品版本保持统一格式。
  3. 生成后立即保存 CSV:交付副本保存到本地或懒猫网盘。
  4. 客服问题先搜索许可证:根据客户、密钥、设备或备注定位。
  5. 临时问题用 Suspend:例如等待付款;确认后再 Resume。
  6. 违规风险用 Ban:调查结束后可以 Unban。
  7. 客户换机优先 reset:保留重置次数和操作记录。
  8. 定期检查 API Key:不用的测试 Key 及时 Revoke。
  9. 用 Audit Logs 做复盘:确认谁在什么时间执行了关键操作。

💡 实用技巧

  • 许可证期限从激活开始:生成后放几个月再交付,也不会提前消耗有效期。
  • 客户名要统一:不要一会儿写简称、一会儿写全称,否则搜索和统计会变得混乱。
  • Notes 写业务上下文:推荐格式是“合同号 + 产品版本 + 交付批次 + 负责人”。
  • 生产和测试 API Key 分开:泄露或撤销时更容易控制影响范围。
  • 不要滥用永久吊销:付款延迟优先暂停,疑似滥用优先封禁;只有确定永久失效时才 Revoke。
  • CSV 要做回读:无论保存到本地还是懒猫,都要重新打开一次,确认密钥数量和内容正确。
  • 客户端保护不是绝对防破解:如果软件核心价值完全在 APK 内,客户端校验仍可能被绕过;更高价值的能力应尽量放在服务端,并在关键请求中再次校验许可证。

🧩 Conclusion —— 一句话总结

License Management System 把许可证生成、设备绑定、有效期控制、客户换机、客户端校验、统计和审计整合成一套可私有部署的完整流程;它尤其适合需要自行分发 Android 应用、面向企业客户交付授权,并希望业务数据留在自己微服上的开发者和小型软件团队。

评论

0

暂无评论

说点什么呢~
收藏
0
0
0