获取 AppID 与 API 密钥
A7验证的接入涉及三个凭据:AppId、AppKey、ApiPassword。搞清楚三者的区别,是正确接入的前提。
调用步骤
- 登录 开发者控制台。
- 进入「API 信息」页面(
/dev/apiinfo.html)。 - 在顶部的程序下拉框中选择你要接入的程序。
- 页面会显示该程序的
AppId、AppKey(程序密钥)与当前ApiPassword。 - 点击复制按钮把
AppId和AppKey复制到你的项目配置里。 ApiPassword不需要手工复制,运行时由 Init 接口下发。
三个凭据对照
| 凭据 | 长度 / 格式 | 来源 | 用途 | 是否随请求发送 |
|---|---|---|---|---|
AppId | 数字串,如 150018 | 创建程序时自动分配 | 标识是哪个程序 | 仅 Init 阶段发送 |
AppKey | 32 位大写字母 + 数字 | 创建程序时自动生成 | Init 阶段参与签名 | 仅 Init 阶段发送 |
ApiPassword | 32 位大写字母 + 数字 | Init 接口返回 | Handle 阶段的 RC4 密钥 + 签名密钥 | Handle 阶段通过请求头/表单/路径传递 |
为什么要分成两层
如果直接用 AppKey 加密每一次业务请求,那么 AppKey 会反复出现在网络流量中,一旦被逆向或抓包就永久泄露。
A7验证的做法是:
AppKey只在 Init 握手时用一次,参与MD5(AppId + AppKey + TimeStamp + AppKey)计算,不直接暴露明文用途。- Init 返回
ApiPassword,之后所有业务请求都用ApiPassword做 RC4 加密和签名。 ApiPassword是程序级的接口密码,可以在后台重置;重置后老客户端重新 Init 即可拿到新值。
AppKey 的安全存储
AppKey 会被编译进客户端,理论上一定可以被逆向出来。请务必做到:
- 不要把
AppKey明文写进配置文件、注册表、日志。 - 在客户端中至少做一次字符串混淆 / 分段拼接,抬高逆向成本。
- 桌面软件建议配合代码混淆(.NET 用 ConfuserEx、易语言用静态编译 + 加壳)。
- 一旦发现泄露,立刻在控制台重置 AppKey,老版本客户端将无法通过 Init。
绝对不要做的事
不要把 AppKey 放在你自己的公开 Git 仓库、CDN 上的 JS 文件、或者任何 Web 前端页面里。A7验证的 API 设计前提是 AppKey 只存在于你的客户端二进制中。
ApiPassword 的生命周期
- 由 Init 接口返回,保存在内存变量中即可。
- 不需要每次业务请求前都重新 Init;一次 Init 拿到后可以在整个进程生命周期内复用。
- 当 Handle 返回
1001 程序不存在时,说明ApiPassword已失效(后台重置过),重新调用一次 Init 即可。 - 切勿把
ApiPassword写进磁盘文件或日志。
推荐的健壮写法(伪代码):
text
函数 调用业务(action, 参数):
如果 内存中的 ApiPassword 为空:
执行 Init()
结果 = Handle(ApiPassword, action, 参数)
如果 结果.code == 1001: // ApiPassword 失效
执行 Init() // 重新握手
结果 = Handle(ApiPassword, action, 参数) // 重试一次
返回 结果传递 ApiPassword 的三种方式
服务端按以下优先级读取:
| 优先级 | 方式 | 示例 | 建议 |
|---|---|---|---|
| 1 | 请求头 | X-Api-Password: A1B2...P6 | ✅ 推荐,不会落进访问日志 |
| 2 | 表单字段 | ApiPassword=A1B2...P6 | 可用 |
| 3 | URL 路径 | POST /api/verify/A1B2...P6 | 兼容旧客户端,明文进访问日志 |
路径传递的风险
把 ApiPassword 写在 URL 路径里,会被 nginx 访问日志、代理服务器、浏览器历史完整记录。新项目请优先使用 X-Api-Password 请求头。
接口地址
| 环境 | Init | Handle |
|---|---|---|
| 推荐 | https://api.a7p.cn/api/verify | https://api.a7p.cn/api/verify/{ApiPassword} |
| 兼容 | https://www.a7p.cn/api/verify | https://www.a7p.cn/api/verify/{ApiPassword} |
两个域名指向同一套后端,新接入统一使用 api.a7p.cn。