网络验证 API 开发文档

A7验证 — 软件授权验证接口规范(v2.0)

目录
概述

A7验证提供 RESTful API 用于软件授权验证。所有接口均使用 HTTP POST,数据以 表单(application/x-www-form-urlencoded) 格式传输,响应统一为 JSON。

接口采用 两步模型:先调用 Init 用 AppId + AppKey 换取本次会话的 ApiPassword(接口密码),再用该密码对后续所有业务请求进行 RC4 加密 + MD5 签名,通过 Handle 接口按 action 分发到具体业务。

项目说明
接口地址https://www.a7p.cn/api/verify
请求方式POST(仅支持 POST,GET 将返回 405)
请求格式application/x-www-form-urlencoded(表单 POST)
加密方式RC4 对称加密(密文转 HEX 大写) + MD5 签名
字符编码UTF-8
认证流程AppId + AppKey → Init 换取 ApiPassword → ApiPassword 签名并加密后续请求
Action 数量共 13 个业务 action,见下方「Action 接口列表」

机器码参数在文档中统一写作 Mac,服务端同时兼容 DeviceId / mac 三种写法,任选其一传入即可。

通信协议

Init 阶段签名

Sign = MD5(AppId + AppKey + TimeStamp + AppKey) // 注意:AppKey 出现两次,分别位于中间与结尾

Handle 阶段签名与加密

Data = RC4(ApiPassword, 明文参数字符串) // 密文字节转 HEX 大写 Sign = MD5(ApiPassword + TimeStamp + Data) // 明文参数格式(& 连接的键值对,action 必须在首位) action=SingleLogin&Card=XXXX-XXXX-XXXX-XXXX&Mac=MAC001

签名注意事项

要点说明
MD5 结果大小写服务端不区分大小写,推荐统一使用小写 32 位
RC4 密文编码必须转为 HEX 大写 字符串后再作为 Data 提交
时间戳Unix 秒级时间戳,服务端允许 ±300 秒 偏差,超出返回 1010
参数顺序明文参数中 action 建议置于首位,其余键值对顺序不影响解析
ApiPassword32 位接口密码,仅在内存中保存,切勿硬编码或明文落盘
Step 1: Init 初始化握手
POSThttps://www.a7p.cn/api/verify

请求参数

参数类型必填说明
AppIdstring必填程序编号,如 150018
AppKeystring必填程序密钥,32位大写字母+数字
TimeStampstring必填Unix 时间戳(秒),有效期 ±300 秒
Signstring必填MD5(AppId + AppKey + TimeStamp + AppKey)

请求示例

POST https://www.a7p.cn/api/verify Content-Type: application/x-www-form-urlencoded AppId=150018&AppKey=YOUR_SECRET&TimeStamp=1780000000&Sign=3f2a...c91b

成功响应

{ "code": 200, "message": "success", "data": { "app_id": "150018", "app_name": "测试版本", "api_password": "A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6", "version": "1.0", "version_name": "新春特别版" } }
字段说明
app_id程序编号,回显校验用
app_name程序名称
api_password32位接口密码,用于后续签名和 RC4 加密,需妥善保管
version最新版本号
version_name版本名称/更新内容

失败响应

{"code":1001,"message":"AppId 不存在","data":null} {"code":1002,"message":"签名验证失败","data":null} {"code":1010,"message":"时间戳过期","data":null} {"code":1013,"message":"参数不完整","data":null}
Step 2: Handle 业务调用
POSThttps://www.a7p.cn/api/verify/{ApiPassword}

所有业务能力(登录、注册、心跳、查询等)都通过此接口调用,URL 路径携带 Init 换取到的 ApiPassword,具体业务由加密后的明文参数中的 action 字段决定。

请求参数

参数类型必填说明
TimeStampstring必填Unix 时间戳(秒),有效期 ±300 秒
Datastring必填RC4(ApiPassword, 明文参数) 加密后转 HEX 大写
Signstring必填MD5(ApiPassword + TimeStamp + Data)

Data 解密后的明文参数格式

// action 指定操作,其余为该操作的业务参数,用 & 连接 action=SingleLogin&Card=XXXX-XXXX-XXXX-XXXX&Mac=MAC001&DeviceName=MyPC

请求示例

POST https://www.a7p.cn/api/verify/A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6 Content-Type: application/x-www-form-urlencoded TimeStamp=1780000000&Sign=8d41...7a2e&Data=1F3B7C90AE...

通用失败响应

{"code":1002,"message":"签名验证失败","data":null} {"code":1010,"message":"时间戳过期","data":null} {"code":1013,"message":"参数不完整","data":null} {"code":1015,"message":"未知操作","data":null}
Action 接口列表 · 共 13 个(点击展开)
SingleLogin卡密登录卡密+机器码验证,首次使用自动激活并绑定设备
action=SingleLogin&Card=XXXX-XXXX-XXXX-XXXX&Mac=MAC001&DeviceName=MyPC
参数必填说明
Card必填卡密密钥,格式 XXXX-XXXX-XXXX-XXXX
Mac必填机器码,可传 MacDeviceID,用于绑定设备
DeviceName可选设备名称,后台展示用
成功响应(时长卡)
{ "code": 200, "message": "success", "data": { "token": "b86fbe17a3e5492f...", "status": "active", "is_times": false, "card_type": "月卡", "expire_at": "2026-06-03" } }
成功响应(按次卡密)
{ "code": 200, "message": "success", "data": { "token": "b86fbe17a3e5492f...", "status": "active", "is_times": true, "card_type": "10次卡", "expire_at": "2036-06-22", "total": 10, "used": 3, "remaining": 7 } }
字段说明
token登录凭证,后续心跳(Type=card)与取消息需携带
statusactive=正常
is_times是否为按次卡密:true=按次 / false=按时长
card_type卡密类型名称,如"月卡""10次卡"
expire_at到期日期(YYYY-MM-DD),永久卡为"永久"
total按次卡总次数(仅 is_times=true 返回)
used已使用次数(仅 is_times=true 返回)
remaining剩余次数,为 0 时卡密失效(仅 is_times=true 返回)
失败响应
{"code":1004,"message":"卡密无效","data":null} {"code":1005,"message":"卡密已过期","data":null} {"code":1006,"message":"卡密已禁用","data":{"remark":"违规使用"}} {"code":1008,"message":"设备不匹配","data":null} {"code":1013,"message":"参数不完整","data":null}
UserLogin用户登录用户名+密码登录,支持卡密续期与 QQ 扫码登录
// 仅登录(不传 Card) action=UserLogin&UserName=testuser01&Password=123456 // 登录 + 续期(传入 Card) action=UserLogin&UserName=testuser01&Password=123456&Card=XXXX-XXXX-XXXX-XXXX // QQ 扫码登录(LoginType=qq,配合扫码返回的 State) action=UserLogin&UserName=testuser01&Password=123456&LoginType=qq&State=8f3c21a5d7
参数必填说明
UserName必填用户名
Password必填密码(明文,已由 RC4 整体加密传输)
Card可选充值卡密,传入则登录成功后给该用户续期
LoginType可选登录方式,传 qq 表示走 QQ 扫码登录校验
State可选QQ 扫码流程返回的 state 值,LoginType=qq 时必须配合传入
仅验证登录(不传 Card)成功
{ "code": 200, "message": "success", "data": { "token": "9c4d2e01f7b8443a...", "username": "testuser01", "device_id": "MAC001", "expire_at": "2026-06-03", "status": "active", "remark": "" } }
传入 Card 续期成功
{ "code": 200, "message": "success", "data": { "token": "9c4d2e01f7b8443a...", "username": "testuser01", "expire_at": "2026-07-02", "added_days": 30, "status": "active" } }
失败响应
{"code":1003,"message":"密码错误","data":null} {"code":1004,"message":"卡密无效","data":null} {"code":1006,"message":"账户已被停封","data":{"remark":"违规"}} {"code":1008,"message":"设备不匹配","data":null} {"code":1016,"message":"用户未注册","data":null}
UserRegin用户注册注册新用户,可同时卡密激活并绑定 QQ
// 仅注册 action=UserRegin&UserName=newuser&Password=123456 // 注册 + 卡密激活 + 绑定设备 action=UserRegin&UserName=newuser&Password=123456&Card=XXXX-XXXX-XXXX-XXXX&Mac=MAC001&DeviceName=MyPC // 注册同时绑定 QQ(BindQQ=1) action=UserRegin&UserName=newuser&Password=123456&BindQQ=1
参数必填说明
UserName必填用户名,3-50 字符,程序内唯一
Password必填密码(明文,已由 RC4 整体加密传输)
Card可选激活卡密,传入则注册同时激活并计算到期时间
BindQQ可选1 表示注册的同时绑定 QQ(用于后续 QQ 扫码登录)
Mac可选机器码,可传 MacDeviceID,用于设备绑定
DeviceName可选设备名称,后台展示用
仅注册(不传 Card)
{"code":200,"message":"success","data":{"username":"newuser","user_id":6}}
注册 + 激活(传 Card)
{ "code": 200, "message": "success", "data": { "username": "newuser", "user_id": 6, "expire_at": "2026-07-02", "status": "active" } }
失败响应
{"code":1004,"message":"卡密无效","data":null} {"code":1013,"message":"参数不完整","data":null} {"code":1017,"message":"用户名已被注册","data":null}
UpdatePwd修改密码校验原密码后修改为新密码
action=UpdatePwd&UserName=testuser01&OldPassword=123456&NewPassword=newpass789
参数必填说明
UserName必填用户名
OldPassword必填原密码
NewPassword必填新密码
成功响应
{"code":200,"message":"success","data":{"username":"testuser01"}}
失败响应
{"code":1003,"message":"原密码错误","data":null} {"code":1013,"message":"参数不完整","data":null} {"code":1016,"message":"用户未注册","data":null}
ChangeBind换绑设备凭卡密将已绑定的旧机器码更换为新机器码
action=ChangeBind&Card=XXXX-XXXX-XXXX-XXXX&Mac=OLD-MAC-001&NewMac=NEW-MAC-002
参数必填说明
Card必填卡密密钥,格式 XXXX-XXXX-XXXX-XXXX
Mac必填当前已绑定的旧机器码,可传 MacDeviceID
NewMac必填要换绑的新机器码
成功响应
{ "code": 200, "message": "success", "data": { "card": "XXXX-XXXX-XXXX-XXXX", "old_device_id": "OLD-MAC-001", "device_id": "NEW-MAC-002", "expire_at": "2026-06-03", "status": "active" } }
失败响应
{"code":1004,"message":"卡密无效","data":null} {"code":1005,"message":"卡密已过期","data":null} {"code":1007,"message":"未绑定,请先登录","data":null} {"code":1008,"message":"设备不匹配(旧机器码与绑定记录不一致)","data":null} {"code":1013,"message":"参数不完整","data":null}
UserHeartbeat心跳检测维持在线状态,建议每 5 分钟调用一次
// 卡密登录(SingleLogin 返回的 token) action=UserHeartbeat&Token=b86fbe17a3e5492f&Type=card // 用户登录(UserLogin 返回的 token) action=UserHeartbeat&Token=9c4d2e01f7b8443a&Type=user
参数必填说明
Token必填登录成功返回的 Token
Type必填card=卡密登录 / user=用户登录

超过 5 分钟 未上报心跳,服务端会将该会话标记为离线,后台在线列表中不再显示。

成功响应(无消息)
{"code":200,"message":"success","data":{"expire_at":"2026-06-03","status":"active","msg":""}}
成功响应(携带后台消息)
{"code":200,"message":"success","data":{"expire_at":"2026-06-03","status":"active","msg":"您的账户即将到期,请及时续费"}}
失败响应
{"code":1005,"message":"已过期","data":null} {"code":1006,"message":"已禁用/停封","data":{"remark":"违规使用"}} {"code":1007,"message":"未绑定,请先登录","data":null} {"code":1013,"message":"参数不完整","data":null}
GetLatestVersion获取版本获取程序最新版本号、更新日志与下载地址
// 无需业务参数 action=GetLatestVersion
参数必填说明
该接口无业务参数,仅需 action 本身
成功响应
{ "code": 200, "message": "success", "data": { "version": "2.1.0", "version_name": "新春特别版", "version_data": "新增登录功能和积分系统", "download_url": "https://xxx.com/update.zip", "version_status": "release", "force": false } }
字段说明
version版本号
version_name版本名称
version_data更新内容/更新日志
download_url下载地址
version_status版本状态:beta=测试版 / release=正式版 / force=强制更新
force是否强制更新:true=是
失败响应
{"code":1015,"message":"未知操作","data":null}
GetBulletin程序公告获取开发者在后台发布的最新公告
// 无需业务参数 action=GetBulletin
参数必填说明
该接口无业务参数,仅需 action 本身
成功响应
{ "code": 200, "message": "success", "data": { "title": "维护通知", "content": "系统将于今晚 23:00 - 24:00 升级,期间验证服务短暂不可用。" } }
无公告时
{"code":200,"message":"success","data":{"title":"","content":""}}
GetVariable获取变量读取云端远程配置变量,可取单个或全部
// 指定变量名 action=GetVariable&Name=app_status // 不传 Name 则返回全部变量 action=GetVariable
参数必填说明
Name可选变量名;不传则返回该程序下的全部变量
成功响应(指定变量)
{"code":200,"message":"success","data":{"value":"approved"}}
成功响应(全部变量)
{ "code": 200, "message": "success", "data": { "variables": { "app_name": "测试", "app_version": "1.0", "app_status": "approved" } } }
失败响应
{"code":1013,"message":"变量不存在或参数不完整","data":null}
GetUserInfo用户信息凭卡密查询绑定用户的详细资料
action=GetUserInfo&Card=XXXX-XXXX-XXXX-XXXX&Mac=MAC001
参数必填说明
Card必填卡密密钥,格式 XXXX-XXXX-XXXX-XXXX
Mac可选机器码,可传 MacDeviceID;传入时会校验设备是否匹配
成功响应
{ "code": 200, "message": "success", "data": { "user_id": 4, "username": "testuser01", "device_id": "MAC001", "device_name": "MyPC", "ip": "192.168.1.1", "expire_at": "2026-06-03", "status": "active" } }
失败响应
{"code":1004,"message":"卡密无效","data":null} {"code":1007,"message":"未绑定,请先登录","data":null} {"code":1008,"message":"设备不匹配","data":null} {"code":1013,"message":"参数不完整","data":null}
GetCardInfo卡密信息查询卡密状态、到期时间与绑定详情
action=GetCardInfo&Card=XXXX-XXXX-XXXX-XXXX
参数必填说明
Card必填要查询的卡密密钥,格式 XXXX-XXXX-XXXX-XXXX
成功响应(时长卡)
{ "code": 200, "message": "success", "data": { "card_status": "active", "card_type": "月卡", "is_times": false, "expire_at": "2026-06-03", "activated_at": "2026-05-03", "device_id": "MAC001", "device_name": "MyPC" } }
成功响应(按次卡密)
{ "code": 200, "message": "success", "data": { "card_status": "active", "card_type": "10次卡", "is_times": true, "expire_at": "2036-06-22", "activated_at": "2026-05-03", "total": 10, "used": 3, "remaining": 7 } }
失败响应
{"code":1004,"message":"卡密无效","data":null} {"code":1005,"message":"卡密已过期","data":null} {"code":1006,"message":"卡密已禁用","data":{"remark":"违规使用"}} {"code":1013,"message":"参数不完整","data":null}
UserRecharge用户续期使用充值卡密为当前用户续期(无需密码)
action=UserRecharge&UserName=testuser01&Card=SEJ8-7BM7-K2UP-6TVE
参数必填说明
UserName必填用户名(登录账号)
Card必填充值卡密(未使用的新卡密),充值后作废

按次卡密不支持充值续期,尝试充值将返回错误码 1024

成功响应
{ "code": 200, "message": "success", "data": { "card": "XXXX-XXXX-XXXX-XXXX", "expire_at": "2026-07-02", "added_days": 30, "status": "active" } }
失败响应
{"code":1004,"message":"充值卡密无效","data":null} {"code":1006,"message":"卡密已禁用","data":{"remark":"违规使用"}} {"code":1013,"message":"参数不完整","data":null} {"code":1024,"message":"按次卡密不能充值","data":null}
错误码参考
Code说明
200成功
1001AppId 不存在
1002签名验证失败
1003密码错误
1004卡密无效
1005已过期
1006已禁用/停封(data.remark 含原因)
1007未绑定,请先登录
1008设备不匹配
1010时间戳过期
1013参数不完整
1015未知操作(action 名称不在支持列表中)
1016用户未注册
1017用户名已被注册
1024按次卡密不能充值
典型业务流程

卡密登录

1
Init
2
SingleLogin
3
缓存Token
4
UserHeartbeat

用户注册 + 登录 + 续期

1
Init
2
UserRegin
3
UserLogin
4
UserHeartbeat

换机 / 续期

1
Init
2
GetCardInfo
3
ChangeBind
4
UserRecharge
SDK 示例

Python

import hashlib, time, urllib.request, json BASE = "https://www.a7p.cn/api/verify" APP_ID = "150018" APP_KEY = "YOUR_SECRET" # RC4 加密,返回 HEX 大写 def rc4(key, data): S = list(range(256)); j = 0 for i in range(256): j = (j + S[i] + key[i % len(key)]) % 256 S[i], S[j] = S[j], S[i] i = j = 0; result = [] for b in data.encode(): i = (i + 1) % 256; j = (j + S[i]) % 256 S[i], S[j] = S[j], S[i] result.append(b ^ S[(S[i] + S[j]) % 256]) return bytes(result).hex().upper() # 1. Init 握手,换取 ApiPassword ts = int(time.time()) sign = hashlib.md5(f"{APP_ID}{APP_KEY}{ts}{APP_KEY}".encode()).hexdigest() body = f"AppId={APP_ID}&AppKey={APP_KEY}&TimeStamp={ts}&Sign={sign}".encode() r = json.loads(urllib.request.urlopen(urllib.request.Request( BASE, data=body, headers={"Content-Type": "application/x-www-form-urlencoded"} ), timeout=10).read().decode()) API_PW = r["data"]["api_password"] # 2. Handle 调用 SingleLogin ts2 = int(time.time()) plain = "action=SingleLogin&Card=XXXX-XXXX-XXXX-XXXX&Mac=MAC001&DeviceName=MyPC" enc = rc4(API_PW.encode(), plain) sign2 = hashlib.md5(f"{API_PW}{ts2}{enc}".encode()).hexdigest() r2 = json.loads(urllib.request.urlopen(urllib.request.Request( f"{BASE}/{API_PW}", data=f"TimeStamp={ts2}&Sign={sign2}&Data={enc}".encode(), headers={"Content-Type": "application/x-www-form-urlencoded"} ), timeout=10).read().decode()) print(r2)复制

易语言

.版本 2 .程序集 窗口程序集 .子程序 登录验证 .局部变量 AppId, 文本型 .局部变量 AppKey, 文本型 .局部变量 TimeStamp, 文本型 .局部变量 Sign, 文本型 .局部变量 ApiPassword, 文本型 .局部变量 加密参数, 文本型 .局部变量 返回文本, 文本型 AppId = "150018" AppKey = "程序密钥" ' 1. Init 初始化,换取 ApiPassword TimeStamp = 到文本 (时间_取现行时间戳 ()) Sign = 取数据摘要 (到字节集 (AppId + AppKey + TimeStamp + AppKey)) 返回文本 = 到文本 (网页_访问 ("https://www.a7p.cn/api/verify", 1, "AppId=" + AppId + "&AppKey=" + AppKey + "&TimeStamp=" + TimeStamp + "&Sign=" + Sign)) ApiPassword = JSON_解析 (返回文本, "data.api_password") ' 2. Handle 调用 SingleLogin TimeStamp = 到文本 (时间_取现行时间戳 ()) 加密参数 = RC4加密 (ApiPassword, "action=SingleLogin&Card=" + 卡密 + "&Mac=" + 机器码) Sign = 取数据摘要 (到字节集 (ApiPassword + TimeStamp + 加密参数)) 返回文本 = 到文本 (网页_访问 ("https://www.a7p.cn/api/verify/" + ApiPassword, 1, "TimeStamp=" + TimeStamp + "&Sign=" + Sign + "&Data=" + 加密参数))复制
相关阅读