本页是 得搜软件 软件网络验证服务的接入说明,任何支持 HTTP POST 的语言都能对接。 协议分三层:业务参数打成 JSON → 用安全码做 RC4 加密 → 再按 MD5 规则算签名。 读完这一页就能把你的软件接到授权系统上。
https://www.andsoo.com/UserApi Content-Type: application/x-www-form-urlencoded; charset=GBK你的 appid 你的安全码 — 加密请求数据 + 参与签名
你的自定义码 — 解密服务端返回的数据POST 到接口地址,表单参数如下:
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| appid | 整数 | 是 | 软件 ID,在后台软件列表查看 |
| timestamp | 长整数 | 是 | 毫秒级时间戳,与服务端相差不得超过容差秒数 |
| data | 文本 | 是 | 业务参数 JSON 经 RC4 加密后的 HEX(大写) |
| sign | 文本 | 是 | 参数签名,见下方算法 |
| token | 文本 | 否 | 登录后拿到的会话 token;与 cookie 二选一,共存时以 token 为准 |
data 的明文是一个 JSON 对象,采用标准 RC4 流加密,密钥是字符串:
四段直接首尾相连,中间不加任何分隔符。注意要用加密之后的 data 密文参与计算。
data 解密后的业务 JSON:
status 是否等于 1;等于 1 再解密 data,
再看内层 code 是否等于 200。两层都不通过时优先报外层(多为客户端配置问题)。
试用方式由管理员在后台按软件配置,两种方式互斥,只能启用其中一种。客户端不要写死逻辑,
先读 Initialize 返回的 trialMode,再按模式走对应分支。
trialTimes = 每台设备可试用的次数trialTurnDays = 1)trialLeft = trialTimes - 1expireAtcode = 220trialDays = 每台设备可试用的天数trialLeft = 剩余天数(按剩余时间向上取整)code = 220(试用期已结束)| 字段 | times 按次数 | days 按天 |
|---|---|---|
| trialEnabled | 1 开启 / 0 关闭 | 1 开启 / 0 关闭 |
| trialMode | "times" | "days" |
| trialTimes | N(次数) | 0 |
| trialDays | 0 | N(天数) |
| trialTurnDays | 1(每次给几天) | 0 |
| trialLeft | 剩余次数 | 剩余天数(向上取整) |
| trialTotal | 总次数 | 总天数 |
只读当前模式的那个字段。另一个恒为 0,不要拿 0 当「不限次数」来用。
machineCode 必传,不传返回 225;
② 试用会话的 user_type = trial,不能拿来调 Recharge / UnBind / ModifyPassword;
③ trialEnabled = 0 时调用 Trial 直接返回 221,客户端应把「试用」按钮置灰。
兼容说明:旧版本还有 trialHours(每次几小时)字段。为不弄坏已发出去的客户端,
Initialize 仍会返回它(按天模式 = 天数 × 24,按次数模式 = 24),但已废弃,新客户端一律改用
trialMode + trialDays / trialTimes。
| 值 | 含义 |
|---|---|
| 1 | 成功 |
| 0 | 未知错误 |
| -1 | appid 不存在或已被删除 |
| -2 | 签名校验失败 |
| -3 | 请求已过期(时间戳超出容差) |
| -4 | 数据包解密失败(安全码不匹配或明文非法) |
| -5 | 缺少必要参数 |
| -6 | 软件已被停用 |
| -7 | 该接口未开放 |
| -8 | 请求过于频繁 |
| -9 | IP 不在白名单内 |
| -10 | 系统维护中 |
| -11 | 请求方式错误(需 POST) |
| -12 | 重放请求(该签名已被使用过) |
| 值 | 含义 |
|---|---|
| 200 | 成功 |
| 201 | 帐号不存在 |
| 202 | 密码错误 |
| 203 | 帐号已被禁用 |
| 204 | 帐号已被封停 |
| 205 | 帐号已绑定其他机器 |
| 206 | 机器码不匹配 |
| 207 | 机器码未绑定,请先登录一次 |
| 208 | 帐号已过期! |
| 209 | 卡密不存在 |
| 210 | 卡密已被使用 |
| 211 | 卡密已过期 |
| 212 | 卡密已被禁用 |
| 213 | 卡密与当前软件不匹配 |
| 214 | 卡密需要密码,请填写密码 |
| 215 | 卡密密码错误 |
| 216 | 用户名已存在 |
| 217 | 用户名不存在或格式不正确 |
| 218 | 验证码错误或已失效 |
| 219 | 旧密码错误 |
| 220 | 试用已到期或次数已用完 |
| 221 | 试用功能已关闭 |
| 222 | 单码登录不支持该操作 |
| 223 | 未登录或登录已失效 |
| 224 | 解绑次数已用完 |
| 225 | 参数错误 |
| 226 | 充值失败 |
| 227 | 远程函数不存在 |
| 228 | 账号点数不足 |
| 229 | 操作过于频繁 |
| 230 | 用户数据不存在 |
| 231 | 机器码被锁定 |
| 232 | 该账号已在线(不允许重复登录) |
| 500 | 服务端处理异常 |
客户端启动时先调用,拿到 token 与软件配置(版本、公告、试用策略、心跳间隔)。
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| machineCode | 文本 | 否 | 机器码,建议提供,便于后续绑定校验 |
| version | 文本 | 否 | 客户端版本号,服务端据此判定是否强制更新 |
用户名 + 密码登录,返回 token 与账号信息。首次登录会自动绑定机器码。
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| userName | 文本 | 是 | 账号 |
| password | 文本 | 是 | 密码 |
| machineCode | 文本 | 建议 | 机器码;不传则不校验机器 |
| verifyCode | 文本 | 否 | 图形验证码,与 machineCode 配对校验 |
直接用卡密登录(单码登录)。首次使用时自动激活并绑定机器码,按卡密天数计算有效期。
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| cardNo | 文本 | 是 | 卡密,例如 AS7K2M-9F4Q-8XZP |
| cardPass | 文本 | 否 | 卡密密码(后台生成时设置了才需要) |
| machineCode | 文本 | 建议 | 机器码 |
按机器码试用。每款软件只能有一种试用方式:按次数(每次 1 天)或按天(N 天,期内不限次数)。具体看 Initialize 返回的 trialMode。
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| machineCode | 文本 | 是 | 机器码,试用按机器码计数,必须提供 |
注册新账号。若同时传 cardNo,则注册后立即用该卡密充值。
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| userName | 文本 | 是 | 账号,3-32 位字母/数字/下划线 |
| password | 文本 | 是 | 密码,至少 6 位 |
| machineCode | 文本 | 否 | 机器码 |
| verifyCode | 文本 | 否 | 验证码 |
| 文本 | 否 | 邮箱 | |
| 文本 | 否 | ||
| cardNo | 文本 | 否 | 注册同时充值用的卡密 |
| cardPass | 文本 | 否 | 卡密密码 |
用卡密给账号增加时长或点数。时长卡从当前有效期顺延。
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| cardNo | 文本 | 是 | 卡密 |
| cardPass | 文本 | 否 | 卡密密码 |
| token | 文本 | 二选一 | 登录后拿到的 token |
| userName | 文本 | 二选一 | 账号(与 password 配对使用) |
| password | 文本 | 二选一 | 密码 |
修改账号密码,成功后该账号所有会话失效,需要重新登录。
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| newPassword | 文本 | 是 | 新密码,至少 6 位 |
| password | 文本 | 是 | 旧密码 |
| userName | 文本 | 二选一 | 账号 |
| token | 文本 | 二选一 | 登录 token |
清除账号绑定的机器码并扣除一次解绑次数,之后可在新机器登录。
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| token | 文本 | 二选一 | 登录 token |
| userName | 文本 | 二选一 | 账号 |
| password | 文本 | 二选一 | 密码 |
客户端按服务端下发的心跳间隔定时调用,维持在线状态。返回剩余秒数,被踢或被封会返回对应错误码。
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| token | 文本 | 是 | 登录 token(也可用 cookie) |
按名字调用后台配置的远程函数,返回值由服务端决定,客户端拿不到实现。
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| funName | 文本 | 是 | 函数名,在后台「远程函数」里配置 |
| token | 文本 | 否 | 登录 token,用于占位符替换 |
生成一次性验证码(5 分钟有效),客户端可自绘成图片,注册/登录时回填校验。
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| machineCode | 文本 | 是 | 机器码 |
不登录也能查:账号是否存在/是否有效、卡密是否可用。适合做"激活前预检"。
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| userName | 文本 | 二选一 | 要查询的账号 |
| cardNo | 文本 | 二选一 | 要查询的卡密 |
| machineCode | 文本 | 否 | 用于判断机器是否匹配 |
读取当前登录用户存在服务端的自定义数据(可整套读,也可按 key 读)。
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| token | 文本 | 是 | 登录 token |
| key | 文本 | 否 | 要读取的键名,留空则返回全部 |
把客户端数据存在服务端(云端配置、试用标记、统计等)。value 传空字符串表示删除该键。
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| token | 文本 | 是 | 登录 token |
| key | 文本 | 是 | 键名 |
| value | 文本 | 否 | 值;传空表示删除 |
销毁会话并标记离线。客户端"退出账号"时应调用。
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| token | 文本 | 是 | 登录 token |
易语言的字符串本身就是 GBK 字节串,所以不需要额外转码,直接用「到字节集」即可对上服务端。 这也是协议当初选择 GBK 的原因之一。
status = -2(签名校验失败)
九成是 sign 拼错。检查顺序必须是 appid + 安全码 + timestamp + data密文,
中间不能加分隔符,且要用加密后的 data。另外注意 appid 要当字符串拼,不要带小数点。
status = -3(请求已过期)
客户端机器时间不准。可用 Initialize 返回的 serverTime 校准本地时钟偏移,
或把后台「时间戳容差」调大一些。
status = -4(数据包解密失败)
安全码不匹配,或明文不是合法 JSON。注意明文必须是 GBK 编码后再加密。
status = -12(重放请求)
同一个数据包发了两遍。每次请求都要重新生成 timestamp 与 data(timestamp 变了密文自然不同)。
中文乱码
两种可能:① 明文没有用 GBK 编码;② HTTP 头没写 charset=GBK。
本服务端在解密后会自动做 GBK→UTF-8 修正,所以多数情况是客户端侧没按 GBK 发送。
试用还剩几次 / 几天,该读哪个字段?
只看 trialLeft,单位由 trialMode 决定:times 是次数,
days 是天数。trialTimes 与 trialDays 里有一个恒为 0,
那是「当前模式没用到」,不是「不限」。
为什么试用期到了再点试用也没反应?
按天模式只开一次窗,重复调用不会续期(否则改天再点一下就能永久试用)。
这时服务端返回 code = 220,客户端应引导用户去购买卡密。
客户端怎么知道该调用哪个接口?
用 data.api 传编号(见上方接口明细),或用 data.func 传接口名,
两种方式等价,推荐用编号更省流量。