当前接口状态 · 正常

账号登录使用的一个心跳检测api

  • API文档
  • 错误码参照
  • 示例代码
  • 加密与签名

接口地址: https://yz.jilicun.com/api.php?api=userheartbeat

备用接口: https://yz1.jilicun.com/api.php?api=userheartbeat

海外接口: https://www.ban365.com/api.php?api=userheartbeat

返回格式: JSON

请求方式: GET/POST

请求示例: https://yz.jilicun.com/api.php?api=userheartbeat&app=10000 复制示例 跳转示例

请求参数说明:

名称 变量 必填 类型 说明
接口 api 是 GET 填写 userheartbeat
应用 app 是 GET 填写后台应用APPID
账号 user 是 GET/POST 账号登录的用户名(与 userlogon 接口保持一致)
密码 password 是 GET/POST 账号密码(与 userlogon 接口保持一致,用于心跳时再次验证账号密码)
时间戳 t 否 GET/POST 如果开启了[时间差效验]需提交此项
数据签名 sign 否 GET/POST 如果开启了[数据签名]需提交此项(算法与其他接口一致,详见Sign说明)

返回参数说明:

名称 类型 说明
code String 返回状态码,200 表示心跳成功,其它为错误码
msg Mixed 当 code!=200 时为错误提示字符串;
当 code=200 时为账号信息对象,主要字段:user(账号)、qq、name(昵称)、vip(VIP到期时间)、ban(账号到期时间)、ban_notice(封禁提示)、pic(头像地址)、fen(积分)、rmb(余额)
time String 服务器当前时间戳,秒级,10 位
check String 二次效验值,与其他接口保持一致(算法说明见 Sign 说明)

返回示例:

    // 心跳正常
    {
        "code": 200,
        "msg": {
            "user": "test_user",
            "qq": "123456",
            "name": "测试用户",
            "vip": "2026-12-31 23:59:59",
            "ban": "2030-01-01 00:00:00",
            "ban_notice": "",
            "pic": "https://example.com/avatar.png",
            "fen": "100",
            "rmb": "10.00"
        },
        "time": 1761200000,
        "check": "40c61b5c845ce218122a0e4309d6b72e"
    }

    
// 心跳间隔超时(超过 heartbeat_timeout 秒) { "code": 153, "msg": "心跳间隔超时(超过300秒),连接已失效,请重新登录", "time": 1761200300, "check": "dc3b764154ec4e7977c3d451947b05d4" }
// 账号被封禁 { "code": 114, "msg": "账号已被封禁,请联系管理员", "time": 1761200400, "check": "a83e3b51d1b1c1633fcca53a9b220b03" }
// VIP 已到期 { "code": 175, "msg": "VIP已到期", "time": 1761200500, "check": "8562d8fd7d841b4271a9e420f0eb3a2c" }
// 账号已到期 { "code": 176, "msg": "账号已到期", "time": 1761200600, "check": "a58c19f1d60ab53a6e51dd41efff58b1" }
// 积分为 0(在应用开启积分校验时) { "code": 177, "msg": "积分为0", "time": 1761200700, "check": "00ec3bfa0b472ea190384891f5a0b6c0" }

错误码格式说明:

名称 类型 说明
101 String 应用不存在
102 String 应用已关闭
171 String 接口维护中
172 String 接口未添加或不存在
100 String 应用配置未加载
110 String 账号为空(user 未提交)
111 String 密码为空
113 String 账号或密码错误
114 String 账号被封禁,返回后台设置的封禁提示
122 String 账号不存在
153 String 心跳间隔超时,连接已失效,需要重新登录
175 String VIP 已到期
176 String 账号已到期
177 String 积分为 0(在应用开启积分校验时)

代码示例:

// 账号心跳请求示例(伪代码说明)
{
    // 接口地址:
    // https://你的域名/api.php?api=userheartbeat&app=应用ID
    //
    // 按账号心跳(与 userlogon 一致):
    // 提交参数:user=账号 & password=密码
    //
    // 如开启时间差效验:
    // 额外提交:t=当前时间戳
    //
    // 如开启数据签名:
    // 按照“将所有 POST 提交参数拼接后 + &APPKEY 取 MD5 值”的规则计算 sign,并一同提交
}

一、数据加密(后台:应用安全配置 → 数据加密类型)

开启后,请求参数与返回数据都按该算法处理。加密模式下业务参数不再直接放在 URL 上,而是整体加密后作为 data 参数提交;api 与 app 仍放在 URL 上。

类型值算法需要的密钥(后台配置项)
0不加密(明文)无
1RC4(E4A 系列,GBK 编码)rc4_key
2BASE64无
3RC4-2(十六进制字符串)rc4_key
4AES-GCMrc4_key
5sig 修改器加密(BASE64)无
6AES-256-CBC(独立 IV)aes_key + aes_iv
7DES-ECBrc4_key(8 字节)
8DES-CBCrc4_key(8 字节)
93DES-ECBrc4_key(24 字节)
103DES-CBCrc4_key(24 字节)
11AES-256-CBCrc4_key
12AES-256-ECBrc4_key
13RSA 非对称加密rsa_public_key / rsa_private_key
14SM4(国密)rc4_key(16 字节)

二、加密模式下的提交方式(重点)

把业务参数按顺序拼成 k=v&k2=v2 的字符串,整体加密后做 Base64,作为 data 提交:

// 以 kmlogon 为例(字段名与顺序请以本页「示例代码」标签页为准)

// ① 先拼出「参与签名」的参数串
signStr = "kami=" + 卡密 + "&user=" + 用户账号 + "&markcode=" + 机器码 + "&t=" + 时间戳
//   实际形态:kami=AAAA-BBBB-CCCC-DDDD&user=&markcode=00000000000000000000000000000000&t=1789800447

// ② 算出 sign(算法见第三节),连同随机值 value 一起拼进载荷
sign    = MD5( signStr + "&" + APPKEY )
payload = signStr + "&sign=" + sign + "&value=" + 随机值
//   实际形态:kami=AAAA-BBBB-CCCC-DDDD&user=&markcode=00000000000000000000000000000000&t=1789800447&sign=6f1ed002ab5595859014ebf0951522d9&value=32768

// ③ 整体加密后做 URL 编码,作为 data 提交
data = URL编码( Base64( 用配置的算法加密( payload ) ) )
请求  = api.php?api=kmlogon&app=APPID&user=用户账号&data=data
//   实际形态:api.php?api=kmlogon&app=10001&user=&data=j8KdR2mQ9vT1...

重要 每个接口的载荷字段都不一样,上例只是 kmlogon 的形态;请以本页「示例代码」标签页中该接口的拼接方式为准。

注意 user 要同时作为 URL 参数提交(见上例第 ③ 步,官方示例代码也是这么写的)。因为 fen(积分卡)、vip(会员卡)这两类卡密是从 URL 参数读取用户账号的,只放进加密载荷会返回 110 请填写账号。其余业务参数只出现在载荷里即可。

说明 上例是把 sign 一起放进载荷再整体加密(即后台「签名放DATA里」开启,这也是官方示例代码的做法)。若该项关闭,则 sign 不拼进载荷,改为作为独立参数提交:api.php?api=kmlogon&app=你的应用ID&data=加密结果&sign=签名值。

注意点说明
data 必须 URL 编码 Base64 里的 + 在 URL 中会被解析成空格并被服务端安全过滤删除,导致解密失败(返回 107)。请把 + 转成 %2B、/ 转成 %2F、= 转成 %3D。
载荷的值不能含 = 和 & 服务端按 & 分段、按 = 拆键值且要求恰好切成两段,值里出现这两个字符会导致该字段被静默丢弃。
URL 上的业务参数会被忽略 加密模式下只认解密出来的载荷内容,URL 上再写 kami / markcode 无效。
键的书写顺序 载荷中键的顺序会影响签名结果,请在整个项目里保持稳定。

三、数据签名(后台:数据签名开关 / 签名放DATA里)

签名算法为 32 位小写 MD5,签名对象是加密前载荷中的业务参数串(即上例第 ① 步的 signStr,不含 sign 与 value 本身;注意不是 URL 上的参数):

sign = MD5( signStr + "&" + APPKEY )
// signStr 即上例第 ① 步拼出的 "kami=...&user=...&markcode=...&t=..."
// APPKEY 是该应用的 appkey(注意:不是 rc4_key)
// 参与签名的只有 signStr 里的字段,sign 与 value 自身不参与

// 承接上例:
// MD5("kami=AAAA-BBBB-CCCC-DDDD&user=&markcode=00000000000000000000000000000000&t=1789800447"
//     + "&" + APPKEY)
配置客户端做法
签名放DATA里 = 关闭 把 sign 作为独立参数提交:api.php?api=xx&app=yy&data=zz&sign=计算值(GET / POST 均可)
签名放DATA里 = 开启 把 sign 放进载荷里再整体加密:kami=xx&markcode=yy&t=zz&sign=计算值;服务端计算签名时会自动剔除 sign 本身

要点 签名串只包含本次接口用到的键,多带任何参数都会导致 106;服务端比较时会统一转为小写,所以 sign 传大写也能通过。

易错 值为空的参数同样参与签名。例如上例中的 user= 虽然是空值,也会被拼进签名串;漏掉任何一个已提交的字段都会返回 106。

明文模式注意 当加密类型为「不加密」时,服务端参与签名的参数值经过了一层安全过滤,若参数里含 &、'、"、<、> 等字符,签名将对不上。建议加密模式 + 数据签名配合使用。

四、时间差效验

项目说明
校验规则必须提交 t,且 | 服务器时间 - t | ≤ 时间差效验值(双向校验,填未来时间同样会被拒绝)
填 0不校验,t 可以为空
重要因为 t 在密文内部,开启后每次请求都必须重新加密生成 data,不能缓存复用
建议取值60 ~ 300 秒,同时要求客户端设备时间准确

五、调试模式(排查签名专用)

开启后,服务端会把它自己计算签名的原始字符串(尚未 MD5)直接明文输出并中断请求,用于和客户端拼串逐字符比对:

// 开启调试模式后,发任意一次请求(即使不带 sign)
// 服务端直接返回签名原串(下方为示意,实际按本接口载荷字段拼接):
kami=你的卡密&markcode=你的机器码&t=当前时间戳&你的APPKEY

注意 开启期间所有请求都会停在这一步,排查完请立即关闭。输出内容为明文,与加密设置无关。

六、RSA 非对称加密(加密类型 = 13)

方向做法
请求(客户端 → 服务端)客户端用 公钥 加密载荷 → 服务端用私钥解密
响应(服务端 → 客户端)服务端用 私钥 加密 → 客户端用 公钥 解密

密钥对在后台「应用安全配置」中一键生成,客户端只需内置 公钥。分块规则:明文每 117 字节为一段,每段独立加密后拼接,再整体 Base64;1024 位密钥下每段密文为 128 字节。

安全性说明 响应方向使用「私钥加密」在数学上属于签名而非加密 —— 任何持有公钥的人(即任何拿到客户端的人)都能解开响应,因此该方向只保证完整性与来源,不保证机密性;真正保密的只有请求方向。

七、接口独立配置的优先级

「卡密管理 → 接口列表 → 独立配置」中若开启了安全配置,则该接口的 加密类型 / 数据签名 / 签名放DATA里 / 时间差效验 / rc4_key 以接口级为准,会覆盖应用级设置;密钥类字段(aes_key、aes_iv、RSA 公私钥)与调试模式只有应用级,不受接口配置影响。排查加密异常时请先确认该接口的独立配置状态。

八、常见错误与排查

现象原因与处理
107 数据为空未提交 data,或 data 解密失败。检查 data 是否做了 URL 编码、载荷格式是否为 k=v&k2=v2
104 签名为空开启了数据签名但没带 sign;或「签名放DATA里」开启时 sign 没放进载荷
106 签名有误见下方排查清单
105 时间差超限t 与服务器时间偏差超过「时间差效验」值,或客户端设备时间不准
108 未发现时间变量开启了时间差效验但没有提交 t

提示 以上错误响应本身也会按当前加密类型加密,接口返回的是一串密文,请先用相同算法解密再查看具体内容。

签名对不上时的排查清单

  1. 开启「调试模式」,拿到服务端签名原串,与客户端拼串逐字符比对
  2. 确认参与签名的键只有本次接口用到的那几个,没有多带参数
  3. 确认键的顺序与加密前的载荷完全一致
  4. 确认用的是应用 appkey,而不是 rc4_key
  5. 确认 t 是本次请求的时间戳(若开启了时间差效验)
  6. 确认载荷中的值不含 = 与 &(否则字段会被丢弃)
  7. 确认接口没有开启「独立配置」覆盖掉应用级的加密/签名设置

点我进群