当前接口状态 · 正常
卡密登录2.0升级版
接口地址: https://yz.jilicun.com/api.php?api=kmlogon2
备用接口: https://yz1.jilicun.com/api.php?api=kmlogon2
海外接口: https://www.ban365.com/api.php?api=kmlogon2
返回格式: JSON
请求方式: GET
请求示例: https://yz.jilicun.com/api.php?api=kmlogon2&app=10000 复制示例 跳转示例
请求参数说明:
| 名称 | 变量 | 必填 | 类型 | 说明 |
|---|---|---|---|---|
| 接口 | api | 是 | GET | 填写kmlogon |
| 应用 | app | 是 | GET | 填写后台应用APPID |
| 卡密 | kami | 是 | GET/POST | 填写提交的卡密 |
| 私有数据 | private | 否(卡密设置默认关闭) | GET/POST | 填写提交的数组遍历,0是获取全部,1,2以此类推 |
| 用户昵称 | user_nickname | 否 | GET/POST | 填写提交的修改用户昵称,不提交参数只获取用户昵称 |
| 设备码 | markcode | 是 | GET/POST | 如果开启了[验证设备]需提交此项 |
| 时间戳 | t | 否 | GET/POST | 如果开启了[时间差效验]需提交此项 |
| 数据签名 | sign | 否 | GET/POST | 如果开启了[数据签名]需提交此项 |
返回参数说明:
| 名称 | 类型 | 说明 |
|---|---|---|
| code | String | 返回状态 |
| kami | String | 提交的卡密 |
| vip | String | 卡密到期时长 |
| ff_svip | String | 应用订阅标识 |
| private | String | 私有数据 |
| ip | String | 本次请求IP |
| user_nickname | String | 用户昵称 |
返回示例:
{
"code":"200",
"msg":{
"kami":"cefUniU3n6",
"vip":"1755887989",
"private":["测试1",
"测试2","测试3"],
"ff_svip":"测试会员",
"user_nickname":"用户昵称",
"ip":"127.0.0.1"
},
"time":1755878283,
"check":"7f0c19c9ce3f79bc80cbb54089f4ee9c"
}
错误码格式说明:
| 名称 | 类型 | 说明 |
|---|---|---|
| 101 | String | 应用不存在 |
| 102 | String | 应用已关闭 |
| 171 | String | 接口维护中 |
| 172 | String | 接口未添加或不存在 |
| 104 | String | 签名为空 |
| 105 | String | 数据过期 |
| 106 | String | 签名有误 |
| 148 | String | 卡密为空 |
| 149 | String | 卡密不存在 |
| 151 | String | 卡密禁用 |
| 169 | String | IP不一致 |
| 201 | String | 卡密已到期 |
代码示例:
.版本 2
.子程序 卡密登录, 文本型, 公开, 单码卡密登录,官网开发文档:https://yz.jilicun.com/doc.php?act=kmlogon2
.参数 卡密, 文本型, , 卡密
.参数 用户账号, 文本型, 可空, VIP充值卡或积分充值卡密则需提交此应用下已注册的用户账号
.参数 数据传输, 整数型, 可空, 留空或填写0默认全局数据传输方式,填写1则数据传输独立设置RC4加密,填写2则数据传输独立设置不加密
.参数 独立秘钥, 文本型, 可空, 默认全局RC4KEY初始秘钥,填写则独立配置RC4KEY
.局部变量 yun_VALUE, 文本型
.局部变量 yun_DATA, 文本型
.局部变量 登录, 文本型
.局部变量 KEY, 文本型
.局部变量 code, 文本型
.局部变量 签名SIGN, 文本型
' APPID_yz_jilicun_com为全局变量---应用后台APPID秘钥
' APPKEY_yz_jilicun_com为全局变量---应用后台APPKEY秘钥
' RC4KEY_yz_jilicun_com为全局变量---应用后台数据传输RC4秘钥
KEY = RC4KEY_yz_jilicun_com
.如果真 (独立秘钥 ≠ “”)
KEY = 独立秘钥
.如果真结束
.如果真 (卡密 = “”)
返回 (“卡密为空”)
.如果真结束
签名SIGN = 校验_取md5_文本 (“kami=” + 卡密 + “&user=” + 用户账号 + “&markcode=” + 校验_取md5_文本 (系统_取CPU型号 () + 系统_取CPU制造商 () + 系统_取CPU序列号 (), 真) + “&t=” + 到文本 (时间_到时间戳 (, 真, 真)) + “&” + APPKEY_yz_jilicun_com, 真)
yun_VALUE = 到文本 (取随机数 (1000, 99999)) + 到文本 (时间_到时间戳 (, , ))
yun_DATA = “kami=” + 卡密 + “&user=” + 用户账号 + “&markcode=” + 校验_取md5_文本 (系统_取CPU型号 () + 系统_取CPU制造商 () + 系统_取CPU序列号 (), 真) + “&t=” + 到文本 (时间_到时间戳 (, 真, 真)) + “&sign=” + 签名SIGN + “&value=” + yun_VALUE
.如果 (数据传输 = 0)
.如果真 (数据加密_yz_jilicun_com = 1)
yun_DATA = “data=” + RC4加密 (yun_DATA, KEY)
.如果真结束
.否则
.如果真 (数据传输 = 1)
yun_DATA = “data=” + RC4加密 (yun_DATA, KEY)
.如果真结束
.如果结束
登录 = 删除空字符 (UTF8到文本 (网页_访问 (#URL + “/api.php?api=kmlogon2&app=” + APPID_yz_jilicun_com + “&user=” + 用户账号 + “&” + yun_DATA, 0, , , , , , , , , , , , )))
.如果 (数据传输 = 0)
.如果真 (数据加密_yz_jilicun_com = 1)
登录 = RC4解密 (登录, KEY)
.如果真结束
.否则
.如果真 (数据传输 = 1)
登录 = RC4解密 (登录, KEY)
.如果真结束
.如果结束
成功登录卡密 = 卡密
返回 (登录)
一、数据加密(后台:应用安全配置 → 数据加密类型)
开启后,请求参数与返回数据都按该算法处理。加密模式下业务参数不再直接放在 URL 上,而是整体加密后作为 data 参数提交;api 与 app 仍放在 URL 上。
| 类型值 | 算法 | 需要的密钥(后台配置项) |
|---|---|---|
| 0 | 不加密(明文) | 无 |
| 1 | RC4(E4A 系列,GBK 编码) | rc4_key |
| 2 | BASE64 | 无 |
| 3 | RC4-2(十六进制字符串) | rc4_key |
| 4 | AES-GCM | rc4_key |
| 5 | sig 修改器加密(BASE64) | 无 |
| 6 | AES-256-CBC(独立 IV) | aes_key + aes_iv |
| 7 | DES-ECB | rc4_key(8 字节) |
| 8 | DES-CBC | rc4_key(8 字节) |
| 9 | 3DES-ECB | rc4_key(24 字节) |
| 10 | 3DES-CBC | rc4_key(24 字节) |
| 11 | AES-256-CBC | rc4_key |
| 12 | AES-256-ECB | rc4_key |
| 13 | RSA 非对称加密 | rsa_public_key / rsa_private_key |
| 14 | SM4(国密) | 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 |
提示 以上错误响应本身也会按当前加密类型加密,接口返回的是一串密文,请先用相同算法解密再查看具体内容。
签名对不上时的排查清单
t 是本次请求的时间戳(若开启了时间差效验)= 与 &(否则字段会被丢弃)