Skip to content

易语言 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 参考错误码对照表

相关链接

A7验证 · 软件授权与网络验证平台