UserHeartbeat 心跳检测
账号/卡密登录后的保活入口:客户端定时(建议每 5 分钟)用登录时拿到的 Token 上报在线状态。后端会刷新心跳时间、并检查是否有后台下发消息(msg)。
| 项目 | 值 |
|---|---|
| action | UserHeartbeat |
| 入口 | Handle POST https://www.a7p.cn/api/verify/{ApiPassword} |
| 是否计入验证统计 | 否 |
调用步骤
- 完成 Init 握手 并完成登录,拿到
Token。 - 拼接明文:
action=UserHeartbeat&Token=登录token&Type=card(卡密登录)或&Type=user(账号登录)。 - RC4 加密 + MD5 签名,POST 到 Handle 接口。
code == 200→ 读取data.expire_at与data.msg(后台消息,为空时忽略)。- 若
Token失效返回1007,需重新登录。
请求参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
action | string | 是 | 固定值 UserHeartbeat |
Token | string | 是 | 登录返回的 40 位 token。等价别名:token |
Type | string | 是 | card(卡密登录)或 user(账号登录)。等价别名:type |
IP | string | 否 | 客户端 IP(可选,用于记录) |
明文示例:
text
# 卡密登录心跳
action=UserHeartbeat&Token=9c4d2e01f7b8443a...&Type=card
# 账号登录心跳
action=UserHeartbeat&Token=0f2b9c...&Type=user业务规则
Token与Type缺一不可,缺失返回1013。Type只支持card/user,其它值返回1013。- 卡密心跳(
card):Token找不到会话返回1007;会话被禁用返回1006;已过期返回1005。 - 账号心跳(
user):Token找不到账号返回1007;同时刷新最近一条激活记录的心跳时间。 - 后台通过
remark下发的消息会在心跳时一并返回到data.msg,读取后由后端清空(每条消息只返回一次)。
请求示例
python
# 复用 /api/handle 页面中的 handle() 与 rc4() 函数
API_PW = "A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6"
def heartbeat(token, typ):
plain = f"action=UserHeartbeat&Token={token}&Type={typ}"
result = handle(API_PW, plain)
code = result["code"]
if code == 200:
data = result.get("data") or {}
msg = data.get("msg", "")
if msg:
print(f"收到后台消息: {msg}")
print(f"在线,到期 {data.get('expire_at')}")
elif code == 1007:
print("Token 失效,请重新登录")
elif code == 1005:
print("已过期")
else:
print(f"心跳失败 {code}: {result['message']}")
# 每 5 分钟调用一次
heartbeat("9c4d2e01f7b8443a...", "card")csharp
// 复用 /api/handle 页面中的 A7Client
var client = new A7Client(apiPassword);
string plain = "action=UserHeartbeat&Token=9c4d2e01f7b8443a...&Type=card";
JsonElement result = await client.HandleAsync(plain);
int code = result.GetProperty("code").GetInt32();
switch (code)
{
case 200:
JsonElement data = result.GetProperty("data");
string msg = data.TryGetProperty("msg", out var m) ? m.GetString() : "";
if (!string.IsNullOrEmpty(msg)) Console.WriteLine($"收到后台消息: {msg}");
Console.WriteLine($"在线,到期 {data.GetProperty("expire_at").GetString()}");
break;
case 1007:
Console.WriteLine("Token 失效,请重新登录");
break;
case 1005:
Console.WriteLine("已过期");
break;
default:
Console.WriteLine($"心跳失败 {code}: {result.GetProperty("message").GetString()}");
break;
}javascript
// 复用 /sdk/nodejs 中的 A7Client
const client = new A7Client({ appId: '150018', appKey: 'YOUR_APP_KEY' })
await client.init()
const result = await client.call('UserHeartbeat', {
Token: '9c4d2e01f7b8443a...',
Type: 'card',
})
if (result.code === 200) {
if (result.data.msg) console.log('收到后台消息:', result.data.msg)
console.log('在线,到期', result.data.expire_at)
} else if (result.code === 1007) {
console.log('Token 失效,请重新登录')
} else {
console.error(`心跳失败 ${result.code}: ${result.message}`)
}text
.版本 2
.子程序 A7_心跳, 逻辑型
.参数 ApiPassword, 文本型
.参数 Token, 文本型
.参数 类型, 文本型
.局部变量 TimeStamp, 文本型
.局部变量 加密参数, 文本型
.局部变量 Sign, 文本型
.局部变量 返回文本, 文本型
.局部变量 状态码, 文本型
TimeStamp = 到文本 (时间_取现行时间戳 ())
加密参数 = RC4加密 (ApiPassword, "action=UserHeartbeat&Token=" + Token + "&Type=" + 类型)
Sign = 取数据摘要 (到字节集 (ApiPassword + TimeStamp + 加密参数))
返回文本 = 到文本 (网页_访问 ("https://www.a7p.cn/api/verify/" + ApiPassword, 1, "TimeStamp=" + TimeStamp + "&Sign=" + Sign + "&Data=" + 加密参数))
状态码 = JSON_解析 (返回文本, "code")
.判断开始 (状态码 = "200")
.如果 (JSON_解析 (返回文本, "data.msg") ≠ "")
信息框 ("收到后台消息:" + JSON_解析 (返回文本, "data.msg"), 0, )
.如果结束
返回 (真)
.判断 (状态码 = "1007")
信息框 ("Token 失效,请重新登录", 0, )
.默认
信息框 ("心跳失败:" + JSON_解析 (返回文本, "message"), 0, )
.判断结束
返回 (假)成功响应
json
{
"code": 200,
"message": "success",
"data": {
"expire_at": "2026-09-01 12:00:00",
"status": "active",
"msg": ""
}
}| 字段 | 类型 | 说明 |
|---|---|---|
expire_at | string | 当前到期时间 YYYY-MM-DD HH:mm:ss |
status | string | active = 正常 |
msg | string | 后台下发的消息,无消息时为空字符串(读取后由后端清空) |
失败响应
json
{ "code": 1007, "message": "Token无效,请重新登录", "data": null }json
{ "code": 1006, "message": "已封停", "data": { "remark": "违规" } }json
{ "code": 1005, "message": "已过期", "data": null }json
{ "code": 1013, "message": "参数不完整: Token 和 Type 必填", "data": null }json
{ "code": 1013, "message": "Type 无效,只支持 card 或 user", "data": null }错误码
| 错误码 | 含义 | 解决方案 |
|---|---|---|
1007 | Token 无效,请重新登录 | 重新走登录流程拿新 Token |
1006 | 已封停 / 已禁用 | 读取 data.remark 展示原因,联系开发者解封 |
1005 | 已过期 | 引导用户用卡密续期 |
1013 | 参数不完整 / Type 无效 | Token 与 Type 必填,且 Type 只能是 card 或 user |
完整列表见错误码对照表。
相关文档
- SingleLogin 卡密登录 —— 卡密登录拿
Token - UserLogin 用户登录 —— 账号登录拿
Token - SDK 实现:易语言 · C# · Python · Node.js