当前接口状态 · 正常
用于api进行进行生成卡密,无需在管理后台进行操作,快速操作!
接口地址: https://yz.jilicun.com/api.php?api=generatekami
备用接口: https://yz1.jilicun.com/api.php?api=generatekami
海外接口: https://www.ban365.com/api.php?api=generatekami
返回格式: JSON
请求方式: GET/POST
请求示例: https://yz.jilicun.com/api.php?api=generatekami&app=10000 复制示例 跳转示例
请求参数说明:
| 名称 | 变量 | 必填 | 类型 | 说明 |
|---|---|---|---|---|
| 接口 | api | 是 | GET | 填写generatekami |
| 应用 | app | 是 | GET | 填写后台应用APPID |
| 卡密类型 | type | 是 | GET/POST | code(单码卡密)、single(次数卡密)、vip(会员兑换卡)、fen(积分兑换卡)、svipcard(至尊卡) |
| 卡密数值 | amount | 是 | GET/POST | 根据类型不同含义不同:单码卡密为时长、次数卡密为次数、会员卡为天数、积分卡为积分数 |
| 时长类型 | km_time | 条件必填 | GET/POST | type=code时必填,可选值:hour(小时)、day(天)、week(周)、month(月)、season(季)、year(年)、longuse(永久)、vipcard(贵宾) |
| 生成数量 | km_num | 否 | GET/POST | 默认1,最大100 |
| 卡密长度 | km_length | 否 | GET/POST | 默认10,范围6-32 |
| 卡密前缀 | km_prefix | 否 | GET/POST | 自定义前缀,最长10个字符 |
| 卡密结构 | km_structure | 否 | GET/POST | 0=默认,1=大小写混合,2=小写,3=大写,4=数字,5=小写+数字,6=大写+数字,7=国际标准(混合),8=国际标准(大写) |
| 代理UID | agent_uid | 否 | GET/POST | 传入后启用代理模式,代理UID |
| 支付方式 | paytype | 否 | GET/POST | 代理模式使用,1=账户余额(默认),2=充值余额 |
| 时间戳 | t | 否 | GET/POST | 如果开启了[时间差效验]需提交此项 |
| 数据签名 | sign | 否 | GET/POST | 如果开启了[数据签名]需提交此项 |
返回参数说明:
| 名称 | 类型 | 说明 |
|---|---|---|
| code | String | 返回状态 |
| success_count | Int | 成功生成的卡密数量 |
| failed_count | Int | 生成失败的数量 |
| total_count | Int | 请求生成的总数量 |
| deducted | Int | 本次扣除的卡密额度 |
| remaining | Int | 扣费后剩余的卡密额度 |
| kamis | Array | 生成的卡密列表 |
返回示例:
{
"code": 200,
"msg": {
"success_count": 10,
"failed_count": 0,
"total_count": 10,
"deducted": 10,
"remaining": 990,
"kamis": [
"JLC_A1B2C3D4E5F6",
"JLC_G7H8I9J0K1L2",
"JLC_M3N4O5P6Q7R8",
"JLC_S9T0U1V2W3X4",
"JLC_Y5Z6A7B8C9D0",
"JLC_E1F2G3H4I5J6",
"JLC_K7L8M9N0O1P2",
"JLC_Q3R4S5T6U7V8",
"JLC_W9X0Y1Z2A3B4",
"JLC_C5D6E7F8G9H0"
]
},
"time": 1735545600,
"check": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"
}
错误码格式说明:
| 名称 | 类型 | 说明 |
|---|---|---|
| 101 | String | 应用不存在 |
| 102 | String | 应用已关闭 |
| 171 | String | 接口维护中 |
| 172 | String | 接口未添加或不存在 |
| 100 | String | 应用配置未加载 |
| 104 | String | 签名为空 |
| 105 | String | 数据过期 |
| 106 | String | 签名有误 |
| 148 | String | 参数为空或缺失 |
| 163 | String | 参数格式错误或不支持 |
| 201 | String | 生成卡密失败 |
| 201 | String | 卡密额度不足 |
代码示例:
.版本 2
.子程序 生成卡密, 文本型, 公开, 批量生成卡密,官网开发文档:https://yz.jilicun.com/doc.php?act=generatekami
.参数 卡密类型, 文本型, , code(单码卡密)、single(次数卡密)、vip(会员兑换卡)、fen(积分兑换卡)、svipcard(至尊卡)
.参数 卡密数值, 整数型, , 根据类型不同含义不同
.参数 时长类型, 文本型, 可空, type=code时必填,可选值:hour、day、week、month、season、year、longuse、vipcard
.参数 生成数量, 整数型, 可空, 默认1,最大100
.参数 卡密长度, 整数型, 可空, 默认10,范围6-32
.参数 卡密前缀, 文本型, 可空, 自定义前缀,最长10个字符
.参数 数据传输, 整数型, 可空, 留空或填写0默认全局数据传输方式,填写1则数据传输独立设置RC4加密,填写2则数据传输独立设置不加密
.参数 独立秘钥, 文本型, 可空, 默认全局RC4KEY初始秘钥,填写则独立配置RC4KEY
.局部变量 yun_VALUE, 文本型
.局部变量 yun_DATA, 文本型
.局部变量 结果, 文本型
.局部变量 KEY, 文本型
.局部变量 签名SIGN, 文本型
' APPID_yz_jilicun_com为全局变量---应用后台APPID秘钥
' APPKEY_yz_jilicun_com为全局变量---应用后台APPKEY秘钥
' RC4KEY_yz_jilicun_com为全局变量---应用后台数据传输RC4秘钥
KEY = RC4KEY_yz_jilicun_com
.如果真 (独立秘钥 ≠ "")
KEY = 独立秘钥
.如果真结束
.如果真 (卡密类型 = "")
返回 ("卡密类型为空")
.如果真结束
.如果真 (生成数量 = 0)
生成数量 = 1
.如果真结束
.如果真 (卡密长度 = 0)
卡密长度 = 10
.如果真结束
签名SIGN = 校验_取md5_文本 ("type=" + 卡密类型 + "&amount=" + 到文本 (卡密数值) + "&km_time=" + 时长类型 + "&km_num=" + 到文本 (生成数量) + "&km_length=" + 到文本 (卡密长度) + "&km_prefix=" + 卡密前缀 + "&t=" + 到文本 (时间_到时间戳 (, 真, 真)) + "&" + APPKEY_yz_jilicun_com, 真)
yun_VALUE = 到文本 (取随机数 (1000, 99999)) + 到文本 (时间_到时间戳 (, , ))
yun_DATA = "type=" + 卡密类型 + "&amount=" + 到文本 (卡密数值) + "&km_time=" + 时长类型 + "&km_num=" + 到文本 (生成数量) + "&km_length=" + 到文本 (卡密长度) + "&km_prefix=" + 卡密前缀 + "&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=generatekami&app=" + APPID_yz_jilicun_com + "&" + yun_DATA, 0, , , , , , , , , , , , )))
.如果 (数据传输 = 0)
.如果真 (数据加密_yz_jilicun_com = 1)
结果 = RC4解密 (结果, KEY)
.如果真结束
.否则
.如果真 (数据传输 = 1)
结果 = RC4解密 (结果, KEY)
.如果真结束
.如果结束
返回 (结果)
' 使用示例1:生成10张天卡
' 结果 = 生成卡密("code", 1, "day", 10, 12, "JLC_", 0, "")
' 使用示例2:生成5张次数卡(100次)
' 结果 = 生成卡密("single", 100, "", 5, 10, "", 0, "")
' 使用示例3:生成1张至尊卡
' 结果 = 生成卡密("svipcard", 999999999, "", 1, 16, "VIP_", 0, "")
一、数据加密(后台:应用安全配置 → 数据加密类型)
开启后,请求参数与返回数据都按该算法处理。加密模式下业务参数不再直接放在 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 是本次请求的时间戳(若开启了时间差效验)= 与 &(否则字段会被丢弃)