Files
verify/docs/API_DOCUMENT.md
T
admin ed4a561704 feat: add application API documentation and C++ SDK
- Add complete API documentation for application integration (docs/API_DOCUMENT.md)
- Fix check-update API to use version ID comparison instead of string comparison
- Add validation: client version must exist in server version list
- Add support for patch/incremental updates with base_version check
- Add C++ SDK with HTTP client, JSON parser, and crypto support
- Add simple_test.cpp for standalone testing on Windows

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 11:58:44 +08:00

877 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 应用对接API文档
## 概述
本文档描述了验证平台应用对接API的详细说明,供第三方应用开发者集成使用。
**服务器地址**: `https://gendan.xyz`
**API基础路径**: `/api/v1/app/{appKey}`
---
## 认证与加密
### 请求认证
- 公开接口:无需认证
- 需认证接口:请求头携带 `Authorization: Bearer {token}`
- Token通过登录接口获取
### 数据加密
平台支持AES和RC4两种加密方式,具体加密类型由应用配置决定。
#### AES加密
- 算法:AES-GCM
- 密钥长度:16/24/32字节(自动填充至32字节)
- 格式:Base64编码(nonce + ciphertext
#### RC4加密
- 密钥长度:任意长度
- 格式:Base64编码
---
## API接口列表
### 1. 应用信息接口(公开)
#### 1.1 获取应用信息
**请求**
```
GET /api/v1/app/{appKey}/info
```
**响应**
```json
{
"code": 200,
"message": "success",
"data": {
"id": 1,
"name": "应用名称",
"description": "应用描述",
"icon_url": "图标URL",
"status": "active",
"billing_type": "balance",
"login_policy": "strict",
"max_devices": 1,
"multi_open_mode": "forbidden",
"max_instances": 1,
"enable_trial": false,
"trial_balance": 0,
"heartbeat_interval": 60,
"heartbeat_timeout": 300
}
}
```
#### 1.2 检查更新
**请求**
```
GET /api/v1/app/{appKey}/check-update?version=1.0.0
```
**参数说明**
- `version` (必填): 客户端当前版本号,必须存在于服务器版本列表中
**响应**
```json
{
"code": 200,
"message": "success",
"data": {
"has_update": true,
"current_version": "1.0.0",
"latest_version": "1.0.1",
"download_url": "下载地址",
"file_size": 1024000,
"file_hash": "文件哈希",
"entry_file": "入口文件",
"update_notes": "更新说明",
"update_strategy": "optional|forced",
"update_type": "full|patch",
"update_method": "auto|manual",
"changelog": "更新日志",
"files": [],
"is_patch": false
}
}
```
**错误响应**
```json
{
"code": 400,
"message": "请提供客户端版本号"
}
```
```json
{
"code": 404,
"message": "客户端版本不存在"
}
```
**更新判断逻辑**
基于版本ID(创建顺序)判断,与版本管理页面一致:
| has_update | update_strategy | 含义 |
|------------|-----------------|------|
| false | "" | 已是最新版本,无需更新 |
| true | optional | 有可选更新 |
| true | forced | 必须强制更新(存在更高ID的强制版本) |
**判断规则**
1. 如果存在 `ID > 客户端版本ID``update_strategy = "forced"` 的版本 → `has_update=true, update_strategy="forced"`
2. 如果存在 `ID > 客户端版本ID` 的版本(无强制更新) → `has_update=true, update_strategy="optional"`
3. 客户端版本ID已是最高 → `has_update=false`
**增量更新**
- 如果 `update_type``"patch"` 且存在以客户端版本为基础的增量包:
- `is_patch`: true
- `base_version`: 基础版本号
- `patch_url`: 增量包下载地址
- `patch_size`: 增量包大小
- `patch_hash`: 增量包哈希
#### 1.3 获取公告列表
**请求**
```
GET /api/v1/app/{appKey}/announcements
```
**响应**
```json
{
"code": 200,
"message": "success",
"data": [
{
"id": 1,
"title": "公告标题",
"content": "公告内容",
"type": "info",
"is_top": true,
"created_at": "2024-01-01T00:00:00Z"
}
]
}
```
---
### 2. 用户认证接口(公开)
#### 2.1 用户注册
**请求**
```
POST /api/v1/app/{appKey}/register
Content-Type: application/json
{
"username": "用户名",
"email": "邮箱(如需验证)",
"email_code": "邮箱验证码(如需验证)",
"phone": "手机号(如需短信验证)",
"sms_code": "短信验证码(如需短信验证)",
"password": "密码",
"device_id": "设备ID",
"device_name": "设备名称",
"device_type": "android|ios|windows|mac|linux|web",
"instance_id": "实例ID"
}
```
**响应**
```json
{
"code": 200,
"message": "注册成功",
"data": {
"user_id": 1
}
}
```
#### 2.2 用户登录
**请求**
```
POST /api/v1/app/{appKey}/login
Content-Type: application/json
{
"username": "用户名",
"password": "密码",
"device_id": "设备ID(必填)",
"device_name": "设备名称",
"device_type": "android|ios|windows|mac|linux|web",
"instance_id": "实例ID"
}
```
**响应**
```json
{
"code": 200,
"message": "登录成功",
"data": {
"user_id": 1,
"token": "JWT令牌"
}
}
```
**错误响应**
```json
{
"code": 403,
"message": "设备绑定数量已达上限,请解绑后再试",
"data": {
"error_code": "DEVICE_LIMIT_EXCEEDED",
"max_devices": 1,
"device_count": 1,
"devices": [
{
"id": 1,
"device_id": "xxx",
"device_name": "设备名",
"device_type": "windows",
"online_count": 0,
"created_at": "2024-01-01T00:00:00Z"
}
]
}
}
```
#### 2.3 发送邮箱验证码
**请求**
```
POST /api/v1/app/{appKey}/send-email-code
Content-Type: application/json
{
"email": "邮箱地址",
"purpose": "register|reset_password"
}
```
**响应**
```json
{
"code": 200,
"message": "success",
"data": {
"message": "验证码已发送"
}
}
```
#### 2.4 重置密码
**请求**
```
POST /api/v1/app/{appKey}/reset-password
Content-Type: application/json
{
"email": "邮箱地址",
"code": "验证码",
"password": "新密码(至少6位)"
}
```
**响应**
```json
{
"code": 200,
"message": "success",
"data": {
"message": "密码重置成功"
}
}
```
#### 2.5 修改密码
**请求**
```
POST /api/v1/app/{appKey}/change-password
Content-Type: application/json
{
"username": "用户名",
"old_password": "原密码",
"new_password": "新密码(至少6位)"
}
```
**响应**
```json
{
"code": 200,
"message": "success",
"data": {
"message": "密码修改成功"
}
}
```
---
### 3. 账户接口(需认证)
#### 3.1 获取账户信息
**请求**
```
POST /api/v1/app/{appKey}/account
Authorization: Bearer {token}
Content-Type: application/json
{
"user_id": 1
}
```
**响应**
```json
{
"code": 200,
"message": "success",
"data": {
"user_id": 1,
"username": "用户名",
"balance": 100.0,
"status": "active"
}
}
```
#### 3.2 心跳上报
**请求**
```
POST /api/v1/app/{appKey}/heartbeat
Authorization: Bearer {token}
Content-Type: application/json
{
"user_id": 1,
"device_id": "设备ID",
"instance_id": "实例ID"
}
```
**响应**
```json
{
"code": 200,
"message": "心跳成功",
"data": {
"message": "心跳成功",
"balance": 99.0
}
}
```
---
### 4. 充值接口(公开)
#### 4.1 卡密充值
**请求**
```
POST /api/v1/app/{appKey}/recharge
Content-Type: application/json
{
"username": "用户名",
"card_key": "卡密",
"device_id": "设备ID"
}
```
**响应**
```json
{
"code": 200,
"message": "充值成功",
"data": {
"message": "充值成功",
"value": 30.0
}
}
```
#### 4.2 试用
**请求**
```
POST /api/v1/app/{appKey}/trial
Content-Type: application/json
{
"user_id": 1
}
```
**响应**
```json
{
"code": 200,
"message": "试用成功",
"data": {
"message": "试用成功",
"trial_balance": 10.0
}
}
```
---
### 5. 设备管理接口(需认证)
#### 5.1 获取设备列表
**请求**
```
GET /api/v1/app/{appKey}/devices
Authorization: Bearer {token}
```
**响应**
```json
{
"code": 200,
"message": "success",
"data": [
{
"id": 1,
"device_id": "设备ID",
"device_name": "设备名称",
"device_type": "windows",
"status": "active",
"online_sessions": 1,
"created_at": "2024-01-01T00:00:00Z"
}
]
}
```
#### 5.2 获取设备数量
**请求**
```
POST /api/v1/app/{appKey}/device-count
Authorization: Bearer {token}
Content-Type: application/json
{
"user_id": 1
}
```
**响应**
```json
{
"code": 200,
"message": "success",
"data": {
"count": 1,
"max_devices": 1,
"remaining": 0
}
}
```
#### 5.3 解绑设备(需认证)
**请求**
```
POST /api/v1/app/{appKey}/unbind-device
Authorization: Bearer {token}
Content-Type: application/json
{
"user_id": 1,
"device_id": "设备ID"
}
```
**响应**
```json
{
"code": 200,
"message": "success",
"data": {
"message": "解绑成功"
}
}
```
#### 5.4 解绑设备(用户认证)
**请求**
```
POST /api/v1/app/{appKey}/unbind-device-with-auth
Content-Type: application/json
{
"username": "用户名",
"password": "密码",
"device_id": "设备ID"
}
```
**响应**
```json
{
"code": 200,
"message": "success",
"data": {
"message": "解绑成功"
}
}
```
#### 5.5 获取实例列表
**请求**
```
POST /api/v1/app/{appKey}/instances
Authorization: Bearer {token}
Content-Type: application/json
{
"user_id": 1
}
```
**响应**
```json
{
"code": 200,
"message": "success",
"data": [
{
"id": 1,
"instance_id": "实例ID",
"device_id": "设备ID",
"device_name": "设备名称",
"is_online": true,
"last_heartbeat": "2024-01-01T00:00:00Z",
"created_at": "2024-01-01T00:00:00Z"
}
]
}
```
#### 5.6 强制下线实例
**请求**
```
POST /api/v1/app/{appKey}/instances/{instance_id}/offline
Authorization: Bearer {token}
Content-Type: application/json
{
"user_id": 1
}
```
**响应**
```json
{
"code": 200,
"message": "success",
"data": {
"message": "已强制离线"
}
}
```
---
### 6. 云端数据接口(需认证)
#### 6.1 获取云端常量列表
**请求**
```
GET /api/v1/app/{appKey}/constants
Authorization: Bearer {token}
```
**响应**
```json
{
"code": 200,
"message": "success",
"data": {
"config_key": {
"type": "string",
"value": "配置值"
},
"file_key": {
"type": "binary",
"value": "/api/v1/app/{appKey}/constants/file_key/download",
"file_name": "文件名",
"file_size": 1024,
"md5": "文件MD5",
"mime_type": "application/octet-stream"
}
}
}
```
#### 6.2 获取单个云端常量
**请求**
```
GET /api/v1/app/{appKey}/constants/{key}
Authorization: Bearer {token}
```
#### 6.3 下载云端常量文件
**请求**
```
GET /api/v1/app/{appKey}/constants/{key}/download
Authorization: Bearer {token}
```
#### 6.4 获取云端变量列表
**请求**
```
GET /api/v1/app/{appKey}/variables
Authorization: Bearer {token}
```
#### 6.5 获取单个云端变量
**请求**
```
GET /api/v1/app/{appKey}/variables/{key}
Authorization: Bearer {token}
```
#### 6.6 下载云端变量文件
**请求**
```
GET /api/v1/app/{appKey}/variables/{key}/download
Authorization: Bearer {token}
```
#### 6.7 上传云端变量文件
**请求**
```
POST /api/v1/app/{appKey}/variables/{key}/upload
Authorization: Bearer {token}
Content-Type: multipart/form-data
file: 文件内容
```
**响应**
```json
{
"code": 200,
"message": "success",
"data": {
"message": "上传成功",
"file_url": "文件URL",
"file_size": 1024,
"mime_type": "application/octet-stream",
"original_name": "原文件名",
"download_url": "下载URL"
}
}
```
#### 6.8 更新云端变量
**请求**
```
POST /api/v1/app/{appKey}/variables
Authorization: Bearer {token}
Content-Type: application/json
{
"variables": {
"key1": "value1",
"key2": "value2"
}
}
```
#### 6.9 创建变量记录(Stream类型)
**请求**
```
POST /api/v1/app/{appKey}/variables/{key}/records
Authorization: Bearer {token}
Content-Type: application/json
{
"field1": "value1",
"field2": "value2"
}
```
**响应**
```json
{
"code": 200,
"message": "success",
"data": {
"id": 1,
"created_at": "2024-01-01T00:00:00Z"
}
}
```
#### 6.10 获取变量记录列表
**请求**
```
GET /api/v1/app/{appKey}/variables/{key}/records?page=1&page_size=20
Authorization: Bearer {token}
```
**响应**
```json
{
"code": 200,
"message": "success",
"data": {
"records": [
{
"id": 1,
"data": {"field": "value"},
"created_at": "2024-01-01T00:00:00Z"
}
],
"total": 100,
"page": 1,
"page_size": 20,
"total_pages": 5
}
}
```
#### 6.11 删除变量记录
**请求**
```
DELETE /api/v1/app/{appKey}/variables/{key}/records/{record_id}
Authorization: Bearer {token}
```
---
### 7. 动态代码接口(需认证)
#### 7.1 执行动态代码
**请求**
```
POST /api/v1/app/{appKey}/dynamic-code/{key}/execute
Authorization: Bearer {token}
Content-Type: application/json
{
"params": {
"param1": "value1"
},
"user_id": 1
}
```
**响应**
```json
{
"code": 200,
"message": "success",
"data": {
"result": "执行结果",
"execution_time": 10
}
}
```
---
## 错误码说明
| 错误码 | 说明 |
|-------|------|
| 200 | 成功 |
| 400 | 参数错误 |
| 401 | 未授权/Token无效 |
| 403 | 禁止访问/余额不足/设备限制等 |
| 404 | 资源不存在 |
| 500 | 服务器内部错误 |
## 特殊错误码
| 错误码 | 说明 |
|-------|------|
| DEVICE_LIMIT_EXCEEDED | 设备绑定数量已达上限 |
| IP_LIMIT_EXCEEDED | IP绑定数量已达上限 |
| MULTI_INSTANCE_LIMIT_EXCEEDED | 多开数量已达上限 |
---
## 集成流程
1. 调用 `/info` 获取应用配置信息
2. 调用 `/register``/login` 获取用户Token
3. 使用Token调用需认证的接口
4. 定期调用 `/heartbeat` 保持在线状态
5. 根据需要调用其他接口
---
## C++ SDK使用示例
```cpp
#include "verify_client.hpp"
int main() {
// 创建客户端
verify::Client client("https://gendan.xyz", "your_app_key");
// 获取应用信息
auto info = client.getAppInfo();
// 用户登录
auto loginResult = client.login("username", "password", "device_id");
std::string token = loginResult["token"].asString();
client.setToken(token);
// 心跳
client.heartbeat("user_id", "device_id", "instance_id");
// 充值
client.recharge("username", "card_key", "device_id");
return 0;
}
```