签名规则
客户端接口必须携带公共请求头。签名字符串为 appId + timestamp + nonce + body,使用当前软件 AppSecret 计算 HMAC-SHA256 十六进制字符串。
GET 请求没有 JSON body 时,body 按空字符串参与签名;POST 请求必须使用实际发送的原始 body 字符串参与签名。sign_aes 模式下,参与签名的是加密后的 body。
客户端授权
软件客户端登录、注册、心跳、退出、版本和公告等基础授权接口。
POST/api/client/auth/verification-code
发送注册或登录验证码
发送注册或登录验证码
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
请求参数
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
channel | string | 是 | 验证码渠道。phone 表示短信验证码,email 表示邮箱验证码。 | phone |
purpose | string | 是 | 验证码用途。register 表示注册验证,login 表示验证码登录。 | register |
target | string | 是 | 接收验证码的手机号或邮箱地址。 | 13800138000 |
请求示例
{
"channel": "phone",
"purpose": "register",
"target": "13800138000"
}
成功响应
{
"code": "OK",
"data": {
"channel": "phone",
"expiresIn": 600,
"sent": true,
"targetMasked": "138****8000"
},
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
对接注意事项
- purpose 可为 register 或 login;channel 可为 phone 或 email。
- 注册验证码只在当前软件开启对应注册验证时可发送。
- 登录验证码只在当前软件允许对应验证码登录时可发送。
POST/api/client/auth/password-reset/request
客户端请求找回密码
客户端请求找回密码
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
请求参数
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
channel | string | 是 | 验证码渠道。phone 表示短信验证码,email 表示邮箱验证码。 | email |
email | string | 否 | 用户邮箱,可选,用于后台识别或联系用户。 | demo@example.com |
请求示例
{
"channel": "email",
"email": "demo@example.com"
}
成功响应
{
"code": "OK",
"data": {
"channel": "email",
"expiresIn": 1800,
"sent": true,
"targetMasked": "de****@example.com"
},
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
对接注意事项
- channel 可为 email 或 phone。邮箱方式发送重置链接;手机方式发送重置 token。
- 无论账号是否存在,接口都返回 sent=true,避免泄露账号存在性。
POST/api/client/auth/password-reset/confirm
客户端确认重置密码
客户端确认重置密码
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
请求参数
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
newPassword | string | 是 | 业务参数。请结合接口说明和请求示例传入。 | 123456 |
token | string | 是 | 业务参数。请结合接口说明和请求示例传入。 | rst_xxx |
请求示例
{
"newPassword": "123456",
"token": "rst_xxx"
}
成功响应
{
"code": "OK",
"data": {
"reset": true
},
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
POST/api/client/auth/register
客户端注册账号并直接创建在线会话
用于客户端首次创建用户账号。注册成功后会自动绑定当前设备并创建在线会话,返回客户端 token。
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
请求参数
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
agentCode | string | 否 | 推广码。传入后会尽量建立当前软件下的代理客户归属。 | QWERTY |
clientVersion | string | 否 | 客户端当前版本号,用于版本检查、日志排查和工单定位。 | 1.0.0 |
deviceFingerprint | string | 是 | 设备唯一指纹。建议由机器码、硬件信息或安装实例 ID 生成,并保持稳定。 | demo-device-001 |
deviceName | string | 否 | 设备名称,会显示在后台设备管理中。 | Windows PC |
email | string | 否 | 用户邮箱,可选,用于后台识别或联系用户。 | demo@example.com |
emailCode | string | 否 | 邮箱验证码。当前软件开启邮箱注册验证或邮箱验证码登录时需要提交。 | 123456 |
nickname | string | 是 | 业务参数。请结合接口说明和请求示例传入。 | 演示用户 |
password | string | 是 | 用户密码。服务端只保存哈希,不保存明文。 | 123456 |
phone | string | 否 | 手机号,可选。 | 13800138000 |
phoneCode | string | 否 | 短信验证码。当前软件开启手机注册验证或手机验证码登录时需要提交。 | 123456 |
username | string | 是 | 用户账号。账号全局唯一,但会员、点数、设备、订单等权益按软件隔离。 | demo |
请求示例
{
"agentCode": "QWERTY",
"clientVersion": "1.0.0",
"deviceFingerprint": "demo-device-001",
"deviceName": "Windows PC",
"email": "demo@example.com",
"emailCode": "123456",
"nickname": "演示用户",
"password": "123456",
"phone": "13800138000",
"phoneCode": "123456",
"username": "demo"
}
成功响应
{
"code": "OK",
"data": {
"activationReason": "membership required",
"activationRequired": true,
"app": {
"appId": "8828",
"billingMode": "time",
"bindDeviceEnabled": true,
"bindIpEnabled": false,
"maxDevices": 1
},
"entitlement": {
"expiredAt": null,
"membership": null,
"membershipActive": false,
"membershipLevelId": null,
"membershipStatus": "none",
"points": 0,
"startedAt": null
},
"heartbeat": {
"interval": 60
},
"loginAvailable": true,
"sessionId": "sess_xxx",
"token": "client-jwt",
"user": {
"avatar": "https://thirdqq.qlogo.cn/...",
"id": 1,
"nickname": "大白",
"provider": "qq",
"status": "active",
"username": "demo"
}
},
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
对接注意事项
- 注册必须提交 nickname。
- 如果当前软件开启手机验证或邮箱验证,注册时必须提交对应手机号/邮箱和验证码。
- 注册成功后会自动绑定当前设备并返回客户端 token。
- 时长收费软件即使没有会员也允许登录,客户端应根据 activationRequired 和 entitlement 决定是否拦截功能。
- 如果软件开启设备绑定或 IP 绑定,更换硬件/IP 后会拒绝登录,需要后台解绑。
POST/api/client/auth/login
客户端授权登录
用于客户端账号密码登录。会员过期不会导致登录失败,客户端应根据 entitlement 和 activationRequired 判断是否开放业务功能。
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
请求参数
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
agentCode | string | 否 | 推广码。传入后会尽量建立当前软件下的代理客户归属。 | QWERTY |
clientVersion | string | 否 | 客户端当前版本号,用于版本检查、日志排查和工单定位。 | 1.0.0 |
code | string | 是 | 第三方登录 Authorization Code,或卡密兑换时的卡密明文,取决于接口上下文。 | 123456 |
deviceFingerprint | string | 是 | 设备唯一指纹。建议由机器码、硬件信息或安装实例 ID 生成,并保持稳定。 | demo-device-001 |
deviceName | string | 否 | 设备名称,会显示在后台设备管理中。 | Windows PC |
email | string | 否 | 用户邮箱,可选,用于后台识别或联系用户。 | demo@example.com |
loginMethod | string | 是 | 登录方式。账号模式可用 password、phone_code、email_code,必须在当前软件允许的登录方式内。 | password |
password | string | 是 | 用户密码。服务端只保存哈希,不保存明文。 | 123456 |
phone | string | 否 | 手机号,可选。 | 13800138000 |
username | string | 是 | 用户账号。账号全局唯一,但会员、点数、设备、订单等权益按软件隔离。 | demo |
请求示例
{
"agentCode": "QWERTY",
"clientVersion": "1.0.0",
"code": "123456",
"deviceFingerprint": "demo-device-001",
"deviceName": "Windows PC",
"email": "demo@example.com",
"loginMethod": "password",
"password": "123456",
"phone": "13800138000",
"username": "demo"
}
成功响应
{
"code": "OK",
"data": {
"activationReason": "membership required",
"activationRequired": true,
"app": {
"appId": "8828",
"billingMode": "time",
"bindDeviceEnabled": true,
"bindIpEnabled": false,
"maxDevices": 1
},
"entitlement": {
"expiredAt": null,
"membership": null,
"membershipActive": false,
"membershipLevelId": null,
"membershipStatus": "none",
"points": 0,
"startedAt": null
},
"heartbeat": {
"interval": 60
},
"loginAvailable": true,
"sessionId": "sess_xxx",
"token": "client-jwt",
"user": {
"avatar": "https://thirdqq.qlogo.cn/...",
"id": 1,
"nickname": "大白",
"provider": "qq",
"status": "active",
"username": "demo"
}
},
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
对接注意事项
- loginMethod 可为 password、phone_code、email_code,必须是当前软件允许的登录方式。
- phone_code 和 email_code 登录前需要先调用验证码接口,登录时提交 phone/email 与 code。
- 登录不因会员过期而失败;会员状态、点数和到期时间通过 entitlement 返回。
- agentCode 可选,表示推广码,仅在用户尚未绑定代理时建立当前软件下的代理归属。
- 未开启多设备同时登录时,新客户端登录会踢下线该用户在当前软件中的其他客户端。
- 设备封禁、绑定设备更换、绑定 IP 更换、用户禁用、在线会话超限仍会被拒绝。
POST/api/client/auth/license-login
使用授权码直接登录客户端
使用授权码直接登录客户端
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
请求参数
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
clientVersion | string | 否 | 客户端当前版本号,用于版本检查、日志排查和工单定位。 | 1.0.0 |
deviceFingerprint | string | 是 | 设备唯一指纹。建议由机器码、硬件信息或安装实例 ID 生成,并保持稳定。 | demo-device-001 |
deviceName | string | 否 | 设备名称,会显示在后台设备管理中。 | Windows PC |
licenseCode | string | 是 | 后台生成的授权码明文。首次登录激活时创建并关联内部隐藏用户,可直接登录客户端。 | AUVVXXXX |
请求示例
{
"clientVersion": "1.0.0",
"deviceFingerprint": "demo-device-001",
"deviceName": "Windows PC",
"licenseCode": "AUVVXXXX"
}
成功响应
{
"code": "OK",
"data": {
"activationReason": "membership required",
"activationRequired": true,
"app": {
"appId": "8828",
"billingMode": "time",
"bindDeviceEnabled": true,
"bindIpEnabled": false,
"maxDevices": 1
},
"entitlement": {
"expiredAt": null,
"membership": null,
"membershipActive": false,
"membershipLevelId": null,
"membershipStatus": "none",
"points": 0,
"startedAt": null
},
"heartbeat": {
"interval": 60
},
"licenseCode": {
"activatedAt": "2026-06-06T10:00:00+08:00",
"codeTail": "ABCD1234",
"expiredAt": "2026-07-06T10:00:00+08:00",
"id": 1,
"licenseType": "time",
"status": "active"
},
"loginAvailable": true,
"sessionId": "sess_xxx",
"token": "client-jwt",
"user": {
"avatar": "https://thirdqq.qlogo.cn/...",
"id": 1,
"nickname": "大白",
"provider": "qq",
"status": "active",
"username": "demo"
}
},
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
对接注意事项
- 仅登录模式为 license_code 的软件可调用。
- 授权码首次登录激活时才会创建并永久关联内部隐藏用户,登录成功后返回普通客户端 token。
- 后续心跳、扣点、云变量、云函数、内购和工单接口与账号登录完全一致。
- 授权码由后台按批次生成、保存完整明文并交付代理销售。
POST/api/client/auth/heartbeat
客户端心跳续期
用于客户端保持在线状态、续期会话并获取最新授权状态。建议按软件配置的 heartbeatInterval 定时调用。
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"activationRequired": false,
"control": {
"forceLogout": false,
"forceUpdate": false,
"message": ""
},
"entitlement": {
"membershipActive": true,
"points": 100
},
"heartbeatInterval": 60,
"online": true,
"serverTime": "2026-06-04T10:00:00+08:00"
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
POST/api/client/auth/logout
客户端退出登录
客户端退出登录
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"ok": true
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
客户端当前用户信息
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"entitlement": {
"membershipActive": false,
"points": 0
},
"session": {
"sessionId": "sess_xxx",
"status": "online"
},
"user": {
"id": 1,
"username": "demo"
}
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
PATCH/api/client/me
客户端编辑当前用户资料
客户端编辑当前用户资料
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
avatar | string | 是 | 业务参数。请结合接口说明和请求示例传入。 | https://example.com/avatar.png |
email | string | 否 | 用户邮箱,可选,用于后台识别或联系用户。 | demo@example.com |
nickname | string | 是 | 业务参数。请结合接口说明和请求示例传入。 | 演示用户 |
phone | string | 否 | 手机号,可选。 | 13800138000 |
请求示例
{
"avatar": "https://example.com/avatar.png",
"email": "demo@example.com",
"nickname": "演示用户",
"phone": "13800138000"
}
成功响应
{
"code": "OK",
"data": {
"user": {
"avatar": "https://example.com/avatar.png",
"id": 1,
"nickname": "演示用户",
"username": "demo"
}
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
对接注意事项
- 只能编辑当前 token 对应用户自己的昵称、头像、邮箱和手机号。
GET/api/client/me/entitlement
客户端当前权益
客户端当前权益
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"activationReason": "membership required",
"activationRequired": true,
"entitlement": {
"expiredAt": null,
"membership": null,
"membershipActive": false,
"membershipLevelId": null,
"membershipStatus": "none",
"points": 0,
"startedAt": null
}
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
GET/api/client/app/config
读取客户端配置
读取客户端配置
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
请求参数
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"allowMultiDeviceLogin": false,
"appId": "8828",
"billingMode": "time",
"bindDeviceEnabled": true,
"bindIpEnabled": false,
"encryptionMode": "sign_aes",
"heartbeatInterval": 60,
"loginMode": "account",
"maxDevices": 1,
"maxOnlineSessions": 1,
"name": "Demo App"
},
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
对接注意事项
- loginMode=account 时使用账号、手机、邮箱或快捷登录;loginMode=license_code 时只允许授权码登录。
GET/api/client/app/version
读取版本信息
读取版本信息
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
platform | string | 否 | platform 可选 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"currentVersion": "1.0.0",
"forceUpdate": false,
"minSupportedVersion": "1.0.0"
},
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
GET/api/client/app/announcement
读取公告
读取公告
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
请求参数
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"announcement": "维护公告",
"items": []
},
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
客户端快捷登录
桌面客户端通过第三方聚合登录完成快捷登录,使用 state/session 隔离并发回调。
POST/api/client/oauth/start
客户端快捷登录开始
客户端快捷登录开始
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
请求参数
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
agentCode | string | 否 | 推广码。传入后会尽量建立当前软件下的代理客户归属。 | QWERTY |
clientVersion | string | 否 | 客户端当前版本号,用于版本检查、日志排查和工单定位。 | 1.0.0 |
deviceFingerprint | string | 是 | 设备唯一指纹。建议由机器码、硬件信息或安装实例 ID 生成,并保持稳定。 | demo-device-001 |
deviceName | string | 否 | 设备名称,会显示在后台设备管理中。 | Windows PC |
type | string | 是 | 第三方登录方式,目前支持 qq、google。 | qq |
请求示例
{
"agentCode": "QWERTY",
"clientVersion": "1.0.0",
"deviceFingerprint": "demo-device-001",
"deviceName": "Windows PC",
"type": "qq"
}
成功响应
{
"code": "OK",
"data": {
"expiresIn": 300,
"loginUrl": "https://graph.qq.com/oauth2.0/...",
"oauthSessionId": "oauth_xxx",
"pollInterval": 2,
"qrcode": "",
"type": "qq"
},
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
对接注意事项
- 客户端打开 loginUrl 让用户登录,然后轮询 /api/client/oauth/status。
GET/api/client/oauth/status
客户端快捷登录状态轮询
客户端快捷登录状态轮询
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
oauthSessionId | number/string | 是 | 快捷登录会话 ID,由开始快捷登录接口返回,用于轮询状态。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"activationReason": "membership required",
"activationRequired": true,
"app": {
"appId": "8828",
"billingMode": "time",
"bindDeviceEnabled": true,
"bindIpEnabled": false,
"maxDevices": 1
},
"entitlement": {
"expiredAt": null,
"membership": null,
"membershipActive": false,
"membershipLevelId": null,
"membershipStatus": "none",
"points": 0,
"startedAt": null
},
"heartbeat": {
"interval": 60
},
"loginAvailable": true,
"sessionId": "sess_xxx",
"status": "success",
"token": "client-jwt",
"user": {
"avatar": "https://thirdqq.qlogo.cn/...",
"id": 1,
"nickname": "大白",
"provider": "qq",
"status": "active",
"username": "demo"
}
},
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
对接注意事项
- pending 表示用户还没完成第三方登录;success 时返回内容与账号密码登录一致。
- 返回的 user.avatar 来自聚合登录平台,并会保存到用户第三方账号记录。
GET/api/client/oauth/callback
聚合登录回调地址
聚合登录回调地址
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
state | string | 是 | 快捷登录状态值,用于绑定本次回调,防止多用户同时登录时串号。 | "" |
type | string | 是 | 第三方登录方式,目前支持 qq、google。 | "" |
code | string | 是 | 第三方登录 Authorization Code,或卡密兑换时的卡密明文,取决于接口上下文。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"contentType": "text/html",
"message": "快捷登录成功,可以关闭窗口"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
对接注意事项
- 该接口由聚合登录平台跳转调用,客户端不要主动调用。state 由 /api/client/oauth/start 自动生成。
点数扣费
按 featureCode 对某个功能单独扣点,requestId 保证幂等。
POST/api/client/points/charge
按功能扣点
用于点数收费软件对某个功能单独扣点。requestId 是幂等关键字段,必须由客户端业务侧生成。
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
featureCode | string | 是 | 点数功能编码,对应后台当前软件配置的扣点功能。 | ai_generate |
payload | object | 是 | 业务透传 JSON,系统记录并传给云函数或扣点日志,不做固定解释。 | {"prompt":"hello"} |
requestId | string | 是 | 业务幂等 ID。同一用户同一软件重复提交相同 requestId 不会重复扣点。 | unique-business-id |
请求示例
{
"featureCode": "ai_generate",
"payload": {
"prompt": "hello"
},
"requestId": "unique-business-id"
}
成功响应
{
"code": "OK",
"data": {
"duplicate": false,
"log": {
"balanceAfter": 99,
"costPoints": 1,
"featureCode": "ai_generate"
},
"ok": true
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
对接注意事项
- 只有软件收费方式为 points 时会真实扣点。
- requestId 在同一软件同一用户下幂等,重复请求不会重复扣点。
卡密兑换
用户在客户端兑换卡密,获得时长、点数或商品规格权益。
POST/api/client/card/redeem
兑换卡密
兑换卡密
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
code | string | 是 | 第三方登录 Authorization Code,或卡密兑换时的卡密明文,取决于接口上下文。 | AUVVABCDEFGHJKLMNPQRST |
请求示例
{
"code": "AUVVABCDEFGHJKLMNPQRST"
}
成功响应
{
"code": "OK",
"data": {
"entitlement": {
"membershipActive": true,
"points": 130
},
"ok": true
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
商品购买
客户端展示软件商品、创建支付订单,并在支付成功后自动获得会员或点数权益。
GET/api/client/products
获取当前软件可购买商品
获取当前软件可购买商品
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": [
{
"description": "开通 30 天 VIP",
"durationDays": 30,
"id": 1,
"name": "VIP 月会员",
"pointsAmount": 0,
"priceCents": 990,
"productCode": "vip_month",
"productType": "membership"
}
],
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
对接注意事项
- 仅返回当前软件已启用且公开展示的商品。
- 商品支付成功后,服务端会自动发放对应会员时长或点数。
GET/api/client/payment-methods
获取当前软件支付方式
获取当前软件支付方式
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": [
{
"methodCode": "alipay",
"methodName": "支付宝"
},
{
"methodCode": "wxpay",
"methodName": "微信支付"
}
],
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
POST/api/client/product-orders
创建商品购买订单
创建商品购买订单
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
agentCode | string | 否 | 推广码。传入后会尽量建立当前软件下的代理客户归属。 | "" |
paymentMethod | string | 否 | 支付方式编码,例如 alipay、wxpay、qqpay。不传时使用默认方式或收银台。 | alipay |
productId | number/string | 是 | 软件商品 ID,来自当前软件商品列表。 | 1 |
请求示例
{
"agentCode": "",
"paymentMethod": "alipay",
"productId": 1
}
成功响应
{
"code": "OK",
"data": {
"order": {
"amountCents": 990,
"orderNo": "P202606140001",
"status": "pending"
},
"paymentUrl": "https://pay.example",
"product": {
"durationDays": 30,
"name": "VIP 月会员"
}
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
对接注意事项
- productId 必须来自商品列表接口。
- 客户端打开 paymentUrl 引导用户付款。
GET/api/client/product-orders/{orderNo}
查询商品订单与交付状态
查询商品订单与交付状态
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
| Path 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
orderNo | string | 是 | 系统订单号。商品订单通常以 P 开头,应用内购订单通常以 I 开头。 | "" |
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
sync | 0|1 | 否 | sync 可选,传 1 时主动同步支付平台状态 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"entitlement": {
"expiredAt": "2026-07-14T12:00:00+08:00",
"membershipActive": true
},
"order": {
"orderNo": "P202606140001",
"status": "paid"
},
"paid": true,
"payable": false
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
对接注意事项
- paid=true 表示支付和自动交付已完成。
- 客户端应在支付完成后刷新用户权益。
代理归属
客户端传递推广码并查看当前用户在当前软件下的代理归属。
GET/api/client/agent/attribution
查询当前用户代理归属
查询当前用户代理归属
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"agentCode": "QWERTY",
"bindSource": "client_register",
"bound": true,
"boundAt": "2026-06-14T12:00:00+08:00"
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
对接注意事项
- 注册、登录、快捷登录可传 agentCode/ref 建立首次推广归属。
- 只有推广码归属用户是代理时,才会形成代理客户归属并产生代理佣金。
- 普通用户推广码会记录邀请关系,后续按邀请奖励规则处理。
GET/api/client/agent/profile
查询当前用户代理身份
查询当前用户代理身份
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"agent": {
"agentCode": "QWERTY",
"status": "active"
},
"isAgent": true,
"link": "https://example.com/app/demo?ref=QWERTY"
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
POST/api/client/agent/apply
申请成为当前软件代理
申请成为当前软件代理
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"agentCode": "QWERTY",
"status": "active"
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
对接注意事项
- 仅当代理设置中的“启用代理销售”和“允许用户申请”均开启时可调用。
GET/api/client/agent/dashboard
查询代理推广统计
查询代理推广统计
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"customers": 3,
"orders": 5,
"paidOrders": 2,
"salesCents": 19900,
"withdrawableCents": 1200
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
GET/api/client/agent/orders
查询代理推广订单
查询代理推广订单
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": [
{
"amountCents": 990,
"orderNo": "P202606140001",
"status": "paid"
}
],
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
GET/api/client/agent/commissions
查询代理佣金流水
查询代理佣金流水
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": [
{
"commissionCents": 300,
"status": "available"
}
],
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
POST/api/client/agent/withdraw
提交代理提现申请
提交代理提现申请
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
accountName | string | 是 | 提现收款人姓名。 | 张三 |
accountNo | string | 是 | 提现收款账号。 | account@example.com |
accountType | string | 是 | 提现收款账号类型,例如 alipay、wechat、bank。 | alipay |
amountCents | decimal string | 是 | 金额,单位分,例如 1000 表示 10.00 元。 | 1000 |
请求示例
{
"accountName": "张三",
"accountNo": "account@example.com",
"accountType": "alipay",
"amountCents": 1000
}
成功响应
{
"code": "OK",
"data": {
"id": 1,
"status": "pending"
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
GET/api/client/agent/withdraws
查询代理提现记录
查询代理提现记录
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": [
{
"amountCents": 1000,
"status": "pending"
}
],
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
应用内购
客户端发起应用内支付订单,后台记录原因、金额、用户和设备。
POST/api/client/iap/orders
创建应用内购订单
用于客户端在软件内发起支付请求。系统只负责创建订单、支付和记账,不自动发放权益。
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
agentCode | string | 否 | 推广码。传入后会尽量建立当前软件下的代理客户归属。 | QWERTY |
amount | decimal string | 是 | 支付金额,单位元,必须为正数,最多两位小数,例如 9.90。 | 9.90 |
businessType | string | 是 | 业务类型编码,由客户端自定义,例如 custom_feature。 | custom_feature |
description | string | 否 | 支付原因或订单说明,用于后台识别用户为什么付款。 | 用户在软件内发起支付 |
metadata | object | 否 | 业务扩展 JSON,支付成功后原样保存,系统不自动解释。 | {"scene":"pro_feature"} |
paymentMethod | string | 否 | 支付方式编码,例如 alipay、wxpay、qqpay。不传时使用默认方式或收银台。 | alipay |
subject | string | 是 | 订单标题,会显示在支付平台和后台订单列表。 | 购买高级功能 |
请求示例
{
"agentCode": "QWERTY",
"amount": "9.90",
"businessType": "custom_feature",
"description": "用户在软件内发起支付",
"metadata": {
"scene": "pro_feature"
},
"paymentMethod": "alipay",
"subject": "购买高级功能"
}
成功响应
{
"code": "OK",
"data": {
"order": {
"amountCents": 990,
"businessType": "custom_feature",
"orderNo": "I202605180001",
"status": "pending"
},
"paymentUrl": "https://pay.example"
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
对接注意事项
- 应用内购只记录支付状态,不自动发放会员、点数或其他权益。
- 支付成功后客户端查询订单状态并自行处理软件内业务。
GET/api/client/iap/orders/{orderNo}
查询应用内购订单
查询应用内购订单
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
| Path 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
orderNo | string | 是 | 系统订单号。商品订单通常以 P 开头,应用内购订单通常以 I 开头。 | "" |
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
sync | 0|1 | 否 | sync 可选,传 1 时主动同步支付平台状态 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"amountCents": 990,
"businessType": "custom_feature",
"orderNo": "I202605180001",
"paid": true,
"paidAt": "2026-06-05T10:00:00+08:00",
"payable": false,
"paymentMethod": "alipay",
"providerTradeNo": "202606050001",
"serverTime": 1780615200,
"status": "paid",
"subject": "购买高级功能"
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
云变量与云函数
客户端读写云端变量、调用云函数,支持用户级自定义数据。
GET/api/client/cloud/variables
读取客户端可读云变量
读取客户端可读云变量
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": [
{
"key": "feature_flags",
"scope": "app",
"value": {
"enabled": true
}
}
],
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
GET/api/client/cloud/variables/{key}
按变量名读取单个云变量
用于用户级云端变量读写,例如用户签名、偏好设置、自定义资料等。
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
| Path 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
key | string | 是 | 云变量名称,支持字母、数字、下划线、点和短横线,最长 64 位。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"key": "profile",
"scope": "user",
"value": {
"signature": "hello"
}
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
对接注意事项
- 同名变量同时存在软件级和用户级时,优先返回当前用户自己的用户级变量。
POST/api/client/cloud/variables/{key}
创建或写入用户级云变量
用于用户级云端变量读写,例如用户签名、偏好设置、自定义资料等。
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
| Path 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
key | string | 是 | 云变量名称,支持字母、数字、下划线、点和短横线,最长 64 位。 | "" |
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
value | object | 是 | 云变量值,必须是 JSON,可用于保存用户签名、偏好配置等自定义数据。 | {"signature":"hello","theme":"dark"} |
请求示例
{
"value": {
"signature": "hello",
"theme": "dark"
}
}
成功响应
{
"code": "OK",
"data": {
"key": "settings",
"scope": "user"
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
对接注意事项
- key 仅允许字母、数字、下划线、短横线和点,最长 64 位。
- value 必须是 JSON,最大 64KB。
- 每个用户在每个软件下最多 100 个用户级变量。
DELETE/api/client/cloud/variables/{key}
删除当前用户自己的用户级云变量
用于用户级云端变量读写,例如用户签名、偏好设置、自定义资料等。
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
| Path 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
key | string | 是 | 云变量名称,支持字母、数字、下划线、点和短横线,最长 64 位。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"deleted": true,
"key": "settings"
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
POST/api/client/cloud/functions/{functionCode}/invoke
调用云函数
调用云函数
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
| Path 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
functionCode | string | 是 | 云函数编码,对应后台当前软件配置的云函数。 | "" |
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
count | number | 是 | 业务参数。请结合接口说明和请求示例传入。 | 1 |
text | string | 是 | 业务参数。请结合接口说明和请求示例传入。 | hello |
请求示例
{
"count": 1,
"text": "hello"
}
成功响应
{
"code": "OK",
"data": {
"_pointCharge": {
"costPoints": 1,
"duplicate": false,
"featureCode": "ai_generate"
},
"ok": true,
"result": {
"text": "HELLO"
}
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
对接注意事项
- 请求体会作为云函数 input 传入。
- 云函数绑定点数功能时会在执行前扣点,并把扣点信息注入 _pointCharge。
客户端工单
客户端提交反馈工单、查看工单和补充回复。
提交工单
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
category | string | 是 | 工单分类,例如 bug、billing、feedback。 | bug |
clientVersion | string | 否 | 客户端当前版本号,用于版本检查、日志排查和工单定位。 | 1.0.0 |
content | string | 是 | 工单正文或回复内容。 | 错误描述 |
priority | string | 否 | 工单优先级,例如 low、normal、high。 | normal |
title | string | 是 | 工单标题,简要说明问题。 | 无法登录 |
请求示例
{
"category": "bug",
"clientVersion": "1.0.0",
"content": "错误描述",
"priority": "normal",
"title": "无法登录"
}
成功响应
{
"code": "OK",
"data": {
"id": 1,
"status": "open"
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
GET/api/client/tickets
我的工单列表
我的工单列表
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": [
{
"id": 1,
"status": "open",
"title": "无法登录"
}
],
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
GET/api/client/tickets/{id}
工单详情
工单详情
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
| Path 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
id | number/string | 是 | 资源 ID,例如工单 ID。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"replies": [],
"ticket": {
"id": 1
}
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
POST/api/client/tickets/{id}/replies
回复工单
回复工单
请求头
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
X-App-Id | string | 是 | 当前软件的 APPID。每个软件独立,不能跨软件混用。 | "" |
X-Timestamp | int string | 是 | 当前秒级时间戳,用于防止请求被长期重放。 | "" |
X-Nonce | string | 是 | 每次请求唯一随机串,服务端会记录并拒绝重复 nonce。 | "" |
X-Signature | string | 是 | HMAC-SHA256(appId + timestamp + nonce + body, appSecret) 的十六进制结果。 | "" |
X-Encrypt-Mode | string | 是 | 通讯方式。sign 表示只签名;sign_aes 表示 AES-256-GCM 加密请求体后再签名。 | "" |
Authorization | string | 是 | 登录成功后返回的客户端 token,格式为 Bearer <token>。 | Bearer <client_session_token> |
请求参数
| Path 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
id | number/string | 是 | 资源 ID,例如工单 ID。 | "" |
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
content | string | 是 | 工单正文或回复内容。 | 补充说明 |
请求示例
{
"content": "补充说明"
}
成功响应
{
"code": "OK",
"data": {
"id": 2
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
软件首页
软件独立首页使用的注册、登录、商品、下单和支付相关接口。
GET/api/site/bootstrap
加载软件首页配置
加载软件首页配置
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 否 | slug 兜底访问时必填 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"app": {
"billingMode": "time",
"name": "Demo App"
},
"oauth": {
"enabled": true,
"loginTypes": [
"qq",
"google"
]
}
},
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
POST/api/site/auth/verification-code
软件首页发送验证码
软件首页发送验证码
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
channel | string | 是 | 验证码渠道。phone 表示短信验证码,email 表示邮箱验证码。 | email |
purpose | string | 是 | 验证码用途。register 表示注册验证,login 表示验证码登录。 | register |
target | string | 是 | 接收验证码的手机号或邮箱地址。 | demo@example.com |
请求示例
{
"channel": "email",
"purpose": "register",
"target": "demo@example.com"
}
成功响应
{
"code": "OK",
"data": {
"expiresIn": 600,
"sent": true
},
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
POST/api/site/auth/password-reset/request
软件首页请求找回密码
软件首页请求找回密码
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
channel | string | 是 | 验证码渠道。phone 表示短信验证码,email 表示邮箱验证码。 | email |
email | string | 否 | 用户邮箱,可选,用于后台识别或联系用户。 | demo@example.com |
请求示例
{
"channel": "email",
"email": "demo@example.com"
}
成功响应
{
"code": "OK",
"data": {
"expiresIn": 1800,
"sent": true
},
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
POST/api/site/auth/password-reset/confirm
软件首页确认重置密码
软件首页确认重置密码
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
newPassword | string | 是 | 业务参数。请结合接口说明和请求示例传入。 | 123456 |
token | string | 是 | 业务参数。请结合接口说明和请求示例传入。 | rst_xxx |
请求示例
{
"newPassword": "123456",
"token": "rst_xxx"
}
成功响应
{
"code": "OK",
"data": {
"reset": true
},
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
POST/api/site/auth/register
软件首页注册
软件首页注册
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
agentCode | string | 否 | 推广码。传入后会尽量建立当前软件下的代理客户归属。 | QWERTY |
email | string | 否 | 用户邮箱,可选,用于后台识别或联系用户。 | demo@example.com |
emailCode | string | 否 | 邮箱验证码。当前软件开启邮箱注册验证或邮箱验证码登录时需要提交。 | 123456 |
nickname | string | 是 | 业务参数。请结合接口说明和请求示例传入。 | 演示用户 |
password | string | 是 | 用户密码。服务端只保存哈希,不保存明文。 | 123456 |
phone | string | 否 | 手机号,可选。 | 13800138000 |
phoneCode | string | 否 | 短信验证码。当前软件开启手机注册验证或手机验证码登录时需要提交。 | 123456 |
username | string | 是 | 用户账号。账号全局唯一,但会员、点数、设备、订单等权益按软件隔离。 | demo |
请求示例
{
"agentCode": "QWERTY",
"email": "demo@example.com",
"emailCode": "123456",
"nickname": "演示用户",
"password": "123456",
"phone": "13800138000",
"phoneCode": "123456",
"username": "demo"
}
成功响应
{
"code": "OK",
"data": {
"token": "site-jwt"
},
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
POST/api/site/auth/login
软件首页登录
软件首页登录
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
agentCode | string | 否 | 推广码。传入后会尽量建立当前软件下的代理客户归属。 | QWERTY |
code | string | 是 | 第三方登录 Authorization Code,或卡密兑换时的卡密明文,取决于接口上下文。 | 123456 |
email | string | 否 | 用户邮箱,可选,用于后台识别或联系用户。 | demo@example.com |
loginMethod | string | 是 | 登录方式。账号模式可用 password、phone_code、email_code,必须在当前软件允许的登录方式内。 | password |
password | string | 是 | 用户密码。服务端只保存哈希,不保存明文。 | 123456 |
phone | string | 否 | 手机号,可选。 | 13800138000 |
username | string | 是 | 用户账号。账号全局唯一,但会员、点数、设备、订单等权益按软件隔离。 | demo |
请求示例
{
"agentCode": "QWERTY",
"code": "123456",
"email": "demo@example.com",
"loginMethod": "password",
"password": "123456",
"phone": "13800138000",
"username": "demo"
}
成功响应
{
"code": "OK",
"data": {
"token": "site-jwt"
},
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
GET/api/site/auth/oauth/start
获取聚合登录跳转地址
获取聚合登录跳转地址
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
type | string | 是 | 第三方登录方式,目前支持 qq、google。 | "" |
ref | string | 否 | ref 可选推广码 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"qrcode": "",
"type": "qq",
"url": "https://graph.qq.com/oauth2.0/..."
},
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
GET/api/site/auth/oauth/callback
聚合登录回调换取用户信息并登录
聚合登录回调换取用户信息并登录
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
type | string | 是 | 第三方登录方式,目前支持 qq、google。 | "" |
code | string | 是 | 第三方登录 Authorization Code,或卡密兑换时的卡密明文,取决于接口上下文。 | "" |
agentCode | string | 否 | agentCode 可选推广码 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"token": "site-jwt"
},
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
POST/api/site/auth/logout
软件首页退出登录
软件首页退出登录
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"ok": true
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
软件首页当前用户资料
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"entitlement": {
"expiredAt": null,
"membership": null,
"membershipActive": false,
"membershipLevelId": null,
"membershipStatus": "none",
"points": 0,
"startedAt": null
},
"user": {
"avatar": "",
"id": 1,
"username": "demo"
}
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
软件首页编辑当前用户资料
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
avatar | string | 是 | 业务参数。请结合接口说明和请求示例传入。 | https://example.com/avatar.png |
email | string | 否 | 用户邮箱,可选,用于后台识别或联系用户。 | demo@example.com |
nickname | string | 是 | 业务参数。请结合接口说明和请求示例传入。 | 演示用户 |
phone | string | 否 | 手机号,可选。 | 13800138000 |
请求示例
{
"avatar": "https://example.com/avatar.png",
"email": "demo@example.com",
"nickname": "演示用户",
"phone": "13800138000"
}
成功响应
{
"code": "OK",
"data": {
"user": {
"id": 1,
"nickname": "演示用户",
"username": "demo"
}
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
GET/api/site/promotion/profile
软件首页获取当前用户推广资料
软件首页获取当前用户推广资料
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"inviteReward": {
"enabled": true,
"type": "points",
"value": 10
},
"isAgent": false,
"promotionCode": "QWERTY",
"promotionLink": "https://example.com/app/demo?ref=QWERTY",
"rewardMode": "invite_reward"
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
GET/api/site/products
当前软件商品列表
当前软件商品列表
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": [
{
"id": 1,
"name": "VIP 月卡",
"priceCents": 990
}
],
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
GET/api/site/payment-methods
当前软件公开支付方式
当前软件公开支付方式
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": [
{
"methodCode": "alipay",
"methodName": "支付宝"
}
],
"message": "success"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
POST/api/site/orders
创建软件首页商品订单
创建软件首页商品订单
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
agentCode | string | 否 | 推广码。传入后会尽量建立当前软件下的代理客户归属。 | QWERTY |
paymentMethod | string | 否 | 支付方式编码,例如 alipay、wxpay、qqpay。不传时使用默认方式或收银台。 | alipay |
productId | number/string | 是 | 软件商品 ID,来自当前软件商品列表。 | 1 |
请求示例
{
"agentCode": "QWERTY",
"paymentMethod": "alipay",
"productId": 1
}
成功响应
{
"code": "OK",
"data": {
"order": {
"orderNo": "P202605180001",
"status": "pending"
},
"paymentUrl": "https://pay.example"
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
GET/api/site/orders
软件首页我的订单列表
软件首页我的订单列表
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": [
{
"amountCents": 990,
"orderNo": "P202605180001",
"status": "paid"
}
],
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
GET/api/site/orders/{orderNo}
软件首页订单详情
软件首页订单详情
请求参数
| Path 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
orderNo | string | 是 | 系统订单号。商品订单通常以 P 开头,应用内购订单通常以 I 开头。 | "" |
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
sync | 0|1 | 否 | sync 可选,传 1 时主动同步支付平台状态 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"entitlement": {
"expiredAt": null,
"membership": null,
"membershipActive": false,
"membershipLevelId": null,
"membershipStatus": "none",
"points": 0,
"startedAt": null
},
"order": {
"orderNo": "P202605180001",
"status": "paid"
},
"paid": true
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
POST/api/site/orders/{orderNo}/sync-payment
软件首页主动同步订单支付状态
软件首页主动同步订单支付状态
请求参数
| Path 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
orderNo | string | 是 | 系统订单号。商品订单通常以 P 开头,应用内购订单通常以 I 开头。 | "" |
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"orderNo": "P202605180001",
"paid": true,
"status": "paid"
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
GET/api/site/my-membership
软件首页当前会员状态
软件首页当前会员状态
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"membership": {
"expiredAt": "2026-07-14T12:00:00+08:00",
"status": "active"
}
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
GET/api/site/my-points
软件首页当前点数余额
软件首页当前点数余额
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"points": 100
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
代理前台
代理前台使用的申请、推广、订单、佣金和提现接口。
GET/api/site/agent/profile
查询代理身份
查询代理身份
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"isAgent": true,
"link": "https://site/app/demo?ref=QWERTY"
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
POST/api/site/agent/apply
申请成为代理
申请成为代理
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"agentCode": "QWERTY",
"status": "active"
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
GET/api/site/agent/dashboard
代理统计
代理统计
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": {
"customers": 3,
"salesCents": 19900,
"withdrawableCents": 1200
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
GET/api/site/agent/orders
推广订单
推广订单
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": [
{
"orderNo": "P202605180001",
"status": "paid"
}
],
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
GET/api/site/agent/commissions
佣金流水
佣金流水
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": [
{
"commissionCents": 300,
"status": "available"
}
],
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
POST/api/site/agent/withdraw
提交提现申请
提交提现申请
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
accountName | string | 是 | 提现收款人姓名。 | 张三 |
accountNo | string | 是 | 提现收款账号。 | account@example.com |
accountType | string | 是 | 提现收款账号类型,例如 alipay、wechat、bank。 | alipay |
amountCents | decimal string | 是 | 金额,单位分,例如 1000 表示 10.00 元。 | 1000 |
请求示例
{
"accountName": "张三",
"accountNo": "account@example.com",
"accountType": "alipay",
"amountCents": 1000
}
成功响应
{
"code": "OK",
"data": {
"id": 1,
"status": "pending"
},
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
GET/api/site/agent/withdraws
代理提现记录
代理提现记录
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
slug | string | 是 | 软件访问标识。绑定域名访问时可不传,通过 /app/:slug 或 API 兜底访问时传入。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"code": "OK",
"data": [
{
"amountCents": 1000,
"status": "pending"
}
],
"message": "success"
}
失败响应
{
"code": "UNAUTHORIZED",
"data": null,
"message": "missing or invalid token"
}
支付回调
支付平台服务器异步通知接口,用于订单验签和交付。
GET/POST/api/payment/notify/epay
易支付异步回调
易支付异步回调
请求参数
| Body 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
money | decimal string | 是 | 支付平台回调金额,单位元。 | 9.90 |
out_trade_no | string | 是 | 本系统生成的商户订单号。 | P202605180001 |
sign | string | 是 | 支付平台 RSA 签名,服务端用平台公钥验签。 | base64-rsa-signature |
sign_type | string | 是 | 签名类型,当前为 RSA。 | RSA |
timestamp | string | 是 | 支付平台签名时间戳。 | 1721206072 |
trade_no | string | 是 | 支付平台订单号。 | 202605180001 |
trade_status | string | 是 | 支付平台交易状态,成功时应为 TRADE_SUCCESS。 | TRADE_SUCCESS |
请求示例
{
"money": "9.90",
"out_trade_no": "P202605180001",
"sign": "base64-rsa-signature",
"sign_type": "RSA",
"timestamp": "1721206072",
"trade_no": "202605180001",
"trade_status": "TRADE_SUCCESS"
}
成功响应
{
"text": "success"
}
对接注意事项
- 支付平台可能追加字段,验签时会自动忽略 sign 和 sign_type 并按 ASCII 排序。
GET/api/payment/return/epay
易支付页面跳转返回
易支付页面跳转返回
请求参数
| Query 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
out_trade_no | string | 是 | 本系统生成的商户订单号。 | "" |
trade_no | string | 是 | 支付平台订单号。 | "" |
trade_status | string | 是 | 支付平台交易状态,成功时应为 TRADE_SUCCESS。 | "" |
sign_type | string | 是 | 签名类型,当前为 RSA。 | "" |
sign | string | 是 | 支付平台 RSA 签名,服务端用平台公钥验签。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"contentType": "text/html",
"message": "支付结果页"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
对接注意事项
- 该接口由支付平台浏览器跳转调用,返回 HTML 结果页。
- 最终支付状态仍以异步回调或订单查询同步结果为准。
- 签名有效且 trade_status=TRADE_SUCCESS 时会尝试同步订单为已支付。
GET/api/payment/submit/epay/{orderNo}
提交订单到易支付网关
提交订单到易支付网关
请求参数
| Path 参数 | 类型 | 必填 | 说明 | 示例 |
|---|
orderNo | string | 是 | 系统订单号。商品订单通常以 P 开头,应用内购订单通常以 I 开头。 | "" |
该接口没有 JSON Body。仍需按认证方式携带请求头或 Query 参数。
成功响应
{
"contentType": "text/html",
"message": "自动提交支付表单"
}
失败响应
{
"code": "BAD_REQUEST",
"data": null,
"message": "请求参数错误"
}
对接注意事项
- 该接口由系统生成的 paymentUrl 使用,返回自动提交到易支付网关的 HTML 表单。
- 订单必须存在且仍为 pending 状态。
- 客户端或软件首页通常只需打开创建订单接口返回的 paymentUrl。
SDK 示例
示例只封装签名请求,业务接口仍按上面的路径和参数调用。生产环境建议把 appSecret、aesKey 做混淆和保护,不要明文暴露在易反编译的位置。
JavaScript / TypeScript
async function auvvRequest(baseUrl, appId, appSecret, path, payload, token = "") {
const body = JSON.stringify(payload || {});
const timestamp = Math.floor(Date.now() / 1000).toString();
const nonce = crypto.randomUUID().replaceAll("-", "");
const data = new TextEncoder().encode(appId + timestamp + nonce + body);
const key = await crypto.subtle.importKey("raw", new TextEncoder().encode(appSecret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
const sig = await crypto.subtle.sign("HMAC", key, data);
const signature = [...new Uint8Array(sig)].map(b => b.toString(16).padStart(2, "0")).join("");
const res = await fetch(baseUrl + path, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-App-Id": appId,
"X-Timestamp": timestamp,
"X-Nonce": nonce,
"X-Signature": signature,
"X-Encrypt-Mode": "sign",
...(token ? { Authorization: "Bearer " + token } : {})
},
body
});
return await res.json();
}
Go
func AuvvRequest(baseURL, appID, appSecret, path string, payload any, token string) (*http.Response, error) {
body, _ := json.Marshal(payload)
timestamp := strconv.FormatInt(time.Now().Unix(), 10)
nonce := strings.ReplaceAll(uuid.NewString(), "-", "")
mac := hmac.New(sha256.New, []byte(appSecret))
mac.Write([]byte(appID + timestamp + nonce + string(body)))
signature := hex.EncodeToString(mac.Sum(nil))
req, err := http.NewRequest(http.MethodPost, baseURL+path, bytes.NewReader(body))
if err != nil { return nil, err }
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-App-Id", appID)
req.Header.Set("X-Timestamp", timestamp)
req.Header.Set("X-Nonce", nonce)
req.Header.Set("X-Signature", signature)
req.Header.Set("X-Encrypt-Mode", "sign")
if token != "" { req.Header.Set("Authorization", "Bearer "+token) }
return http.DefaultClient.Do(req)
}
PHP
function auvv_request($baseUrl, $appId, $appSecret, $path, $payload, $token = '') {
$body = json_encode($payload, JSON_UNESCAPED_UNICODE);
$timestamp = strval(time());
$nonce = bin2hex(random_bytes(16));
$signature = hash_hmac('sha256', $appId . $timestamp . $nonce . $body, $appSecret);
$headers = [
'Content-Type: application/json',
'X-App-Id: ' . $appId,
'X-Timestamp: ' . $timestamp,
'X-Nonce: ' . $nonce,
'X-Signature: ' . $signature,
'X-Encrypt-Mode: sign'
];
if ($token !== '') $headers[] = 'Authorization: Bearer ' . $token;
$ch = curl_init($baseUrl . $path);
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_HTTPHEADER => $headers, CURLOPT_POSTFIELDS => $body, CURLOPT_RETURNTRANSFER => true]);
$result = curl_exec($ch);
curl_close($ch);
return json_decode($result, true);
}
Python
import time, json, hmac, hashlib, secrets, requests
def auvv_request(base_url, app_id, app_secret, path, payload, token=""):
body = json.dumps(payload or {}, ensure_ascii=False, separators=(",", ":"))
timestamp = str(int(time.time()))
nonce = secrets.token_hex(16)
signature = hmac.new(app_secret.encode(), (app_id + timestamp + nonce + body).encode(), hashlib.sha256).hexdigest()
headers = {
"Content-Type": "application/json",
"X-App-Id": app_id,
"X-Timestamp": timestamp,
"X-Nonce": nonce,
"X-Signature": signature,
"X-Encrypt-Mode": "sign",
}
if token:
headers["Authorization"] = "Bearer " + token
return requests.post(base_url + path, data=body.encode("utf-8"), headers=headers).json()
C#
static async Task<string> AuvvRequest(HttpClient http, string baseUrl, string appId, string appSecret, string path, string body, string token = "") {
var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString();
var nonce = Guid.NewGuid().ToString("N");
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(appSecret));
var bytes = Encoding.UTF8.GetBytes(appId + timestamp + nonce + body);
var signature = Convert.ToHexString(hmac.ComputeHash(bytes)).ToLowerInvariant();
using var req = new HttpRequestMessage(HttpMethod.Post, baseUrl + path);
req.Content = new StringContent(body, Encoding.UTF8, "application/json");
req.Headers.Add("X-App-Id", appId);
req.Headers.Add("X-Timestamp", timestamp);
req.Headers.Add("X-Nonce", nonce);
req.Headers.Add("X-Signature", signature);
req.Headers.Add("X-Encrypt-Mode", "sign");
if (!string.IsNullOrEmpty(token)) req.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
return await (await http.SendAsync(req)).Content.ReadAsStringAsync();
}
Java
public static String auvvRequest(String baseUrl, String appId, String appSecret, String path, String body, String token) throws Exception {
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
String nonce = UUID.randomUUID().toString().replace("-", "");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(appSecret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
byte[] digest = mac.doFinal((appId + timestamp + nonce + body).getBytes(StandardCharsets.UTF_8));
StringBuilder signature = new StringBuilder();
for (byte b : digest) signature.append(String.format("%02x", b));
HttpRequest.Builder builder = HttpRequest.newBuilder()
.uri(URI.create(baseUrl + path))
.POST(HttpRequest.BodyPublishers.ofString(body, StandardCharsets.UTF_8))
.header("Content-Type", "application/json")
.header("X-App-Id", appId)
.header("X-Timestamp", timestamp)
.header("X-Nonce", nonce)
.header("X-Signature", signature.toString())
.header("X-Encrypt-Mode", "sign");
if (token != null && !token.isEmpty()) builder.header("Authorization", "Bearer " + token);
return HttpClient.newHttpClient().send(builder.build(), HttpResponse.BodyHandlers.ofString()).body();
}
C++
// 依赖 OpenSSL 计算 HMAC,HTTP 请求可用 libcurl、cpp-httplib、Qt Network 等库发送。
std::string hmacSha256Hex(const std::string& message, const std::string& secret) {
unsigned char digest[EVP_MAX_MD_SIZE];
unsigned int len = 0;
HMAC(EVP_sha256(), secret.data(), (int)secret.size(),
reinterpret_cast<const unsigned char*>(message.data()), message.size(), digest, &len);
std::ostringstream out;
for (unsigned int i = 0; i < len; ++i) out << std::hex << std::setw(2) << std::setfill('0') << (int)digest[i];
return out.str();
}
Headers buildAuvvHeaders(const std::string& appId, const std::string& appSecret, const std::string& body, const std::string& token) {
std::string timestamp = std::to_string(std::time(nullptr));
std::string nonce = makeRandomHex(16);
std::string signature = hmacSha256Hex(appId + timestamp + nonce + body, appSecret);
Headers headers;
headers["Content-Type"] = "application/json";
headers["X-App-Id"] = appId;
headers["X-Timestamp"] = timestamp;
headers["X-Nonce"] = nonce;
headers["X-Signature"] = signature;
headers["X-Encrypt-Mode"] = "sign";
if (!token.empty()) headers["Authorization"] = "Bearer " + token;
return headers;
}
Rust
use hmac::{Hmac, Mac};
use reqwest::Client;
use serde_json::Value;
use sha2::Sha256;
use uuid::Uuid;
type HmacSha256 = Hmac<Sha256>;
pub async fn auvv_request(base_url: &str, app_id: &str, app_secret: &str, path: &str, payload: Value, token: Option<&str>) -> reqwest::Result<String> {
let body = payload.to_string();
let timestamp = chrono::Utc::now().timestamp().to_string();
let nonce = Uuid::new_v4().simple().to_string();
let mut mac = HmacSha256::new_from_slice(app_secret.as_bytes()).unwrap();
mac.update(format!("{}{}{}{}", app_id, timestamp, nonce, body).as_bytes());
let signature = hex::encode(mac.finalize().into_bytes());
let mut req = Client::new()
.post(format!("{}{}", base_url, path))
.header("Content-Type", "application/json")
.header("X-App-Id", app_id)
.header("X-Timestamp", timestamp)
.header("X-Nonce", nonce)
.header("X-Signature", signature)
.header("X-Encrypt-Mode", "sign")
.body(body);
if let Some(token) = token { req = req.header("Authorization", format!("Bearer {}", token)); }
req.send().await?.text().await
}
易语言
// 伪代码,按你的 HTTP 支持库替换“网页_访问”函数。
body = 到文本 (JSON_生成 (payload))
timestamp = 到文本 (取现行时间戳 ())
nonce = 文本_取随机字符串 (32)
message = appId + timestamp + nonce + body
signature = 编码_HMAC_SHA256_HEX (message, appSecret)
headers = 创建文本字典 ()
headers ["Content-Type"] = "application/json"
headers ["X-App-Id"] = appId
headers ["X-Timestamp"] = timestamp
headers ["X-Nonce"] = nonce
headers ["X-Signature"] = signature
headers ["X-Encrypt-Mode"] = "sign"
如果 (token ≠ "") 则 headers ["Authorization"] = "Bearer " + token
response = 网页_访问 (baseUrl + path, 1, body, headers)
返回 (response)
通用错误码
| 错误码 | 含义 | 客户端处理建议 |
|---|
BAD_REQUEST | 参数错误 | 检查请求参数、金额格式、云变量 key、Body JSON。 |
UNAUTHORIZED | 签名失败、token 缺失或过期 | 重新计算签名或重新登录。 |
FORBIDDEN | 业务规则拒绝 | 检查设备封禁、在线超限、点数不足、会员状态等。 |
NOT_FOUND | 资源不存在 | 检查订单号、工单 ID、云变量 key、云函数编码。 |
CONFLICT | 资源冲突或幂等冲突 | 检查重复注册、重复兑换、重复 requestId。 |
SERVER_ERROR | 服务端异常 | 查看后台日志或联系管理员。 |