Skip to content

UserHeartbeat 心跳检测

账号/卡密登录后的保活入口:客户端定时(建议每 5 分钟)用登录时拿到的 Token 上报在线状态。后端会刷新心跳时间、并检查是否有后台下发消息(msg)。

项目
actionUserHeartbeat
入口Handle POST https://www.a7p.cn/api/verify/{ApiPassword}
是否计入验证统计

调用步骤

  1. 完成 Init 握手 并完成登录,拿到 Token
  2. 拼接明文:action=UserHeartbeat&Token=登录token&Type=card(卡密登录)或 &Type=user(账号登录)。
  3. RC4 加密 + MD5 签名,POST 到 Handle 接口。
  4. code == 200 → 读取 data.expire_atdata.msg(后台消息,为空时忽略)。
  5. Token 失效返回 1007,需重新登录。

请求参数

字段类型必填说明
actionstring固定值 UserHeartbeat
Tokenstring登录返回的 40 位 token。等价别名:token
Typestringcard(卡密登录)或 user(账号登录)。等价别名:type
IPstring客户端 IP(可选,用于记录)

明文示例:

text
# 卡密登录心跳
action=UserHeartbeat&Token=9c4d2e01f7b8443a...&Type=card

# 账号登录心跳
action=UserHeartbeat&Token=0f2b9c...&Type=user

业务规则

  • TokenType 缺一不可,缺失返回 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_atstring当前到期时间 YYYY-MM-DD HH:mm:ss
statusstringactive = 正常
msgstring后台下发的消息,无消息时为空字符串(读取后由后端清空)

失败响应

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 }

错误码

错误码含义解决方案
1007Token 无效,请重新登录重新走登录流程拿新 Token
1006已封停 / 已禁用读取 data.remark 展示原因,联系开发者解封
1005已过期引导用户用卡密续期
1013参数不完整 / Type 无效TokenType 必填,且 Type 只能是 carduser

完整列表见错误码对照表

相关文档

A7验证 · 软件授权与网络验证平台