接口地址: httpss://dzzg.club/api.php?api=heartbeat

返回格式:

请求方式:

请求示例:

请求参数说明:

名称 变量 必填 类型 说明
接口名称 api GET 填写:heartbeat
应用ID app GET 填写后台应用的APPID,例如:&app=10001
卡密(二选一) kami 条件必填 GET/POST 卡密登录时必填,与kmlogon登录提交的卡密保持一致
应用账号(二选一) appuser 条件必填 GET/POST 应用用户登录时必填,与userlogon的user保持一致
设备码 markcode GET/POST 必填,与登录时提交的设备码一致,用于唯一标识会话
时间戳 t GET/POST 如果开启了[时间差效验]需提交当前时间戳
数据签名 sign GET/POST 如果开启了[数据签名]需提交签名,计算方式同其他接口
加密数据 data GET/POST 当应用开启了RC4/BASE64/RSA加密时提交的加密数据

说明:

  1. kami 和 appuser 必须提交其中一个(根据你的登录方式选择),不能两个同时为空
  2. markcode 必须与登录时一致,否则会当成新会话,导致在线人数虚高
  3. 心跳频率建议使用返回的 interval 值,默认60秒,不要低于10秒(过于频繁会被封IP)
  4. 如果接口返回code非200,请根据错误码进行处理(如过期则提示用户)
  5. 客户端程序退出前可不主动登出,超过timeout时间(默认180秒)未心跳服务器自动判定为离线

返回参数说明:

名称 类型 说明
字段名 类型 说明
code Int 状态码,200=成功,其他=失败(详见错误码表)
msg Object/String 成功时为心跳返回数据对象,失败时为错误描述字符串
time Int 服务器当前Unix时间戳(秒)
check String 二次校验值:MD5(time + appkey + value),客户端可校验防返回数据伪造

msg 对象字段 (code=200时):

字段名类型说明
interval Int 建议下次心跳间隔(秒),客户端请按此值设置定时器,默认60秒
timeout Int 心跳超时时间(秒),超过此时间未收到心跳服务器视为离线,默认180秒
server_time Int 服务器时间戳(秒),可用于客户端校时
online_count Int 当前应用实时在线人数,客户端可显示在UI上
next_heartbeat Int 建议下次心跳的绝对时间戳,server_time + interval

返回示例:

重要提示

开始前请先完成:
1. 在站点根目录执行 install_heartbeat.sql 导入数据表和配置
2. 进入管理员后台 → 系统设置 → 心跳配置(set.php?mod=heartbeat)确认已启用
3. 在应用管理中确认应用的"心跳开关"已开启(默认开启)

接口调用示例(易语言 / 火山 / Lua通用逻辑)

' ================================================
' 步骤1:先正常登录(kmlogon 或 userlogon)
' ================================================
登录结果 = 登录("kmlogon", 应用ID, 卡密, 机器码)
如果 登录结果.code ≠ 200 则 
    提示("登录失败:" + 登录结果.msg)
    结束程序
结束如果
VIP时间 = 登录结果.msg.vip  ' 保存卡密到期时间

' ================================================
' 步骤2:启动心跳定时器(建议首次登录后立即发一次心跳)
' ================================================
子程序 心跳_执行()
    变量 参数 = "api=heartbeat&app=" + 到文本(应用ID)
    变量 提交 = "kami=" + 卡密 + "&markcode=" + 机器码
    变量 返回值 = HTTP访问("https://你的域名/api.php?" + 参数, 提交, 方法_POST)
    变量 结果 = JSON解析(返回值)
    
    如果 结果.code = 200 则
        ' 心跳成功:根据服务器返回值动态调整下次心跳间隔
        下次间隔 = 结果.msg.interval  ' 建议使用服务器返回的interval值
        在线人数 = 结果.msg.online_count
        下次心跳时间 = 结果.msg.next_heartbeat
        UI.显示("在线:" + 到文本(在线人数) + "人")
    否则
        ' 心跳失败:根据错误码处理
        判断 结果.code
            201: 提示("卡密已过期,程序即将退出"); 结束程序
            151: 提示("卡密已被禁用"); 结束程序
            169: 提示("IP不一致,已被踢出"); 结束程序
            180: 提示("服务端未启用心跳"); 停止定时器 ' 不影响使用
            默认:  日志("心跳失败 code=" + 到文本(结果.code) + " " + 结果.msg)
        结束判断
    结束如果
结束子程序

' ================================================
' 步骤3:定时器设置
' ================================================
首次调用(心跳_执行)  ' 登录后立刻执行1次,确保进入在线列表
设置定时器(心跳_执行, 下次间隔 * 1000)  ' 毫秒,默认60秒

' ================================================
' 步骤4(可选):程序退出时可以最后发送一个离线提示
' ================================================
' 实际无需调用登出接口,超过timeout服务器自动判离线,
' 但是你可以把定时器间隔在程序退出时取消,避免后台残留请求。

CURL命令行测试示例

curl -X POST "https://你的域名/api.php?api=heartbeat&app=10001" \
  -d "kami=MoamXBeiChen&markcode=test-machine-code-001"

Python 调用示例

import time
import requests
import hashlib

API_BASE = "https://你的域名/api.php"
APPID = 10001
KAMI = "你的卡密"
MARKCODE = "测试设备码001"

def heartbeat():
    """发送一次心跳,返回 (是否成功, 建议下次间隔秒数, 错误信息)"""
    params = {"api": "heartbeat", "app": APPID}
    data = {"kami": KAMI, "markcode": MARKCODE}
    try:
        r = requests.post(API_BASE, params=params, data=data, timeout=8)
        j = r.json()
        if j["code"] == 200:
            return True, j["msg"]["interval"], None, j["msg"]["online_count"]
        else:
            return False, 60, f"code={j['code']} {j['msg']}", 0
    except Exception as e:
        return False, 60, f"网络异常:{str(e)}", 0

if __name__ == "__main__":
    print("[BC云验证] 心跳测试")
    while True:
        ok, interval, err, online = heartbeat()
        if ok:
            print(f"✅ 心跳OK | 下次{interval}s后 | 当前在线:{online}人")
        else:
            print(f"❌ 心跳失败: {err}")
            if "卡密已到期" in err or "禁用" in err:
                break  # 致命错误退出
        time.sleep(interval)

错误码格式说明:

名称 类型 说明
101 String 应用不存在
102 String 应用已关闭
171 String 接口维护中
172 String 接口未添加或不存在
错误码类型中文描述 / 处理建议
200 成功 心跳成功,按返回的 interval 值设置下次心跳时间
100 参数 应用配置未加载,请确保 GET 参数 app 和 api 正确传递
101 参数 应用不存在(appid错误),请检查&app=后面的数值
102 配置 应用已被关闭,请联系应用开启者开启
112 参数 markcode 为空,心跳接口必须传设备码,用于唯一标识会话
180 配置 心跳验证机制未启用,请站长在 [后台→设置→心跳配置] 中开启总开关,或应用开启独立心跳
181 参数 缺少kami或appuser参数,必须传登录类型标识(二选一)
148 卡密 卡密为空
149 卡密 卡密不存在(不属于当前应用),请核对kami
150 卡密 卡密已绑定其他设备(如果开启了单设备登录)
151 卡密 卡密已禁用,建议直接退出程序提示用户联系客服
169 网络 IP不一致(若开启IP一致性校验),移动网络慎用此功能
122 账号 应用账号不存在(appuser登录时)
114 账号 应用账号被禁用(appuser登录时)
201 过期 卡密已到期 / 次数用尽,建议退出程序或跳到充值页
104 签名 签名为空,应用开启了数据签名请传sign
105 时间 时间戳过期,请同步客户端时间
106 签名 签名有误,签名算法请参考文档首页的Sign计算示例
对接建议:
  • code=200 以外只要不是180/网络错误,基本都可以按「登录失效」处理,建议弹窗提示+退出(或跳登录页)
  • 建议重试策略:1次失败不要立即退出,间隔30秒重试,连续失败≥3次再判定为真掉线
  • 对于非致命错误(如104、105、106),请先检查你的签名和加密代码,而不是提示用户
  • online_count 可以显示在软件「关于」或状态栏中,有效提升用户信任感

代码示例:

心跳成功返回示例 (code=200)
{
    "code": 200,
    "msg": {
        "interval": 60,
        "timeout": 180,
        "server_time": 1756502400,
        "online_count": 128,
        "next_heartbeat": 1756502460
    },
    "time": 1756502400,
    "check": "9a9f8d6e3f1c2a4b5c7d8e9f0a1b2c3d"
}

卡密已过期返回示例 (code=201)
{
    "code": 201,
    "msg": "卡密已到期",
    "time": 1756502400,
    "check": "0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e"
}

心跳机制未启用 (code=180)
{
    "code": 180,
    "msg": "心跳验证机制未启用",
    "time": 1756502400,
    "check": "1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a"
}