易语言 SDK(EPL)
这是 易语言开发者专属 的接入参考。易语言标准库不含 RC4 / MD5,下面提供手写实现,再配合 网页访问 () 完成 Init + Handle 两步模型。全站只有本页提供易语言代码,其它语言见 SDK 总览。
编码说明
易语言源文件使用 GBK 编码,字符串函数按字节处理。下面所有「到字节集 / 取字节集数据」均基于 GBK(到字节集 (文本) 默认 GBK)。
一、核心算法:RC4 与 MD5
把下面两个子程序放进你的模块。
RC4 加密(返回大写十六进制文本)
.版本 2
.子程序 RC4加密, 文本型
.参数 密钥, 文本型
.参数 明文, 文本型
.局部变量 s, 整数型, , "256"
.局部变量 k, 字节集
.局部变量 p, 字节集
.局部变量 i, 整数型
.局部变量 j, 整数型
.局部变量 x, 整数型
.局部变量 y, 整数型
.局部变量 t, 整数型
.局部变量 out, 字节集
.局部变量 结果, 文本型
.局部变量 b, 字节型
k = 到字节集 (密钥)
p = 到字节集 (明文)
变量循环首 (i = 0, i < 256, 1, i)
s [i + 1] = i
变量循环尾 ()
j = 0
变量循环首 (i = 0, i < 256, 1, i)
j = (j + s [i + 1] + k [(i % 取字节集长度 (k)) + 1]) % 256
t = s [i + 1]
s [i + 1] = s [j + 1]
s [j + 1] = t
变量循环尾 ()
out = 取空白字节集 (取字节集长度 (p))
x = 0
y = 0
变量循环首 (i = 0, i < 取字节集长度 (p), 1, i)
x = (x + 1) % 256
y = (y + s [x + 1]) % 256
t = s [x + 1]
s [x + 1] = s [y + 1]
s [y + 1] = t
b = 位异或 (p [i + 1], s [(s [x + 1] + s [y + 1]) % 256 + 1])
out [i + 1] = b
变量循环尾 ()
结果 = ""
变量循环首 (i = 0, i < 取字节集长度 (out), 1, i)
结果 = 结果 + 取十六进制文本 (out [i + 1])
变量循环尾 ()
返回 (结果)十六进制大写
易语言 取十六进制文本 () 返回小写,服务端大小写均可识别,可不必转换。若需大写,对结果逐字符大小写转换即可。
MD5 签名(小写 32 位)
.版本 2
.子程序 MD5签名, 文本型
.参数 原文, 文本型
返回 (取数据摘要 (到字节集 (原文)))取数据摘要 即 MD5
易语言自带的 取数据摘要 () 就是标准 MD5,返回 32 位小写十六进制文本,与服务端比对一致。
二、A7Client 模块
.版本 2
.程序集 A7Client
.局部变量 AppId, 文本型
.局部变量 AppKey, 文本型
.局部变量 ApiPassword, 文本型
.子程序 初始化
.参数 程序编号, 文本型
.参数 程序密钥, 文本型
AppId = 程序编号
AppKey = 程序密钥
ApiPassword = ""
.子程序 Init握手
.局部变量 ts, 文本型
.局部变量 sign, 文本型
.局部变量 body, 文本型
.局部变量 resp, 文本型
.局部变量 json, 类_json
ts = 到文本 (取秒级时间戳 ())
sign = MD5签名 (AppId + AppKey + ts + AppKey)
body = "AppId=" + AppId + "&AppKey=" + AppKey + "&TimeStamp=" + ts + "&Sign=" + sign
resp = 网页访问 ("https://api.a7p.cn/api/verify", 1, body, , , , , , , , , , , )
json.解析 (resp)
ApiPassword = json.取通用属性 ("data.api_password")
.子程序 调用, 文本型
.参数 action, 文本型
.参数 明文参数, 文本型
.局部变量 ts, 文本型
.局部变量 data, 文本型
.局部变量 sign, 文本型
.局部变量 body, 文本型
.局部变量 header, 文本型
.如果 (ApiPassword = "")
Init握手 ()
.如果结束
ts = 到文本 (取秒级时间戳 ())
data = RC4加密 (ApiPassword, "action=" + action + "&" + 明文参数)
sign = MD5签名 (ApiPassword + ts + data)
body = "TimeStamp=" + ts + "&Data=" + data + "&Sign=" + sign
header = "X-Api-Password: " + ApiPassword
返回 (网页访问 ("https://api.a7p.cn/api/verify", 1, body, , , , , , , , , , , header))取秒级时间戳
易语言无原生时间戳函数,可用 取启动时间 () 近似,或调用 API timeGetTime / GetTickCount 自行实现 Unix 秒级时间戳。务必保证与服务端偏差在 ±300 秒内,否则返回 1014。
三、完整示例:卡密登录 + 心跳
.版本 2
.子程序 _按钮登录_被单击
.局部变量 mac, 文本型
.局部变量 plain, 文本型
.局部变量 resp, 文本型
.局部变量 json, 类_json
.局部变量 token, 文本型
' 1) 初始化并握手
初始化 ("150018", "YOUR_APP_KEY")
Init握手 ()
' 2) 采集机器码(见下方 取机器码)
mac = 取机器码 ()
' 3) 拼接明文参数并调用
plain = "Card=UTDE-7TCX-N5AT-ZDSP&Mac=" + mac + "&DeviceName=MyPC"
resp = 调用 ("SingleLogin", plain)
json.解析 (resp)
.如果 (json.取属性 ("code").取数值 () = 200)
token = json.取通用属性 ("data.token")
调试输出 ("登录成功,Token=", token)
' 启动心跳定时器,每 5 分钟调用一次
启动心跳 (token)
.否则
调试输出 ("登录失败", json.取通用属性 ("message"))
.如果结束机器码采集(简化版)
.版本 2
.子程序 取机器码, 文本型
' 真实项目请综合 CPU ID / 硬盘序列号 / MAC 地址,下面用 MAC 近似
.局部变量 mac, 文本型
mac = 取网卡MAC地址 () ' 自行用 WMI 或 ipconfig 解析
返回 (mac)四、JSON 解析
易语言标准库无 类_json,请使用以下任一方式:
- 精易模块 的
类_json(推荐,本页示例均按此编写) - 鱼刺类模块 / LIB 库
- 自己用
文本_取出中间文本 ()取data.token等字段
只有 12 个 action
后端当前仅支持 12 个 action(见 API 概述)。传入列表之外的 action(例如旧文档里曾出现的取消息接口)会返回 1015 未知操作,请勿调用。
注意事项
ApiPassword仅存于模块成员变量,切勿写入文件或注册表。- 明文参数值含
&=时需先做 URL 编码(易语言可用编码_URL编码 ())。 - 更多接口参数与错误码见 API 参考 与 错误码对照表。