UserRegin 用户注册
账号授权模式的注册入口:用用户名 + 密码创建一个账号。可选传入卡密在注册时直接激活,也可传 BindQQ=1 走 QQ 扫码注册流程。
| 项目 | 值 |
|---|---|
| action | UserRegin |
| 入口 | Handle POST https://www.a7p.cn/api/verify/{ApiPassword} |
| 是否计入验证统计 | 否 |
| 后续动作 | 注册后调用 UserLogin 登录 |
调用步骤
- 完成 Init 握手,拿到
ApiPassword。 - 采集机器码
Mac(建议传,作为账号初始绑定设备)。 - 拼接明文:
action=UserRegin&UserName=账号&Password=密码;如需注册即激活,追加&Card=卡密。 - RC4 加密 + MD5 签名,POST 到 Handle 接口。
code == 200→ 若传了卡密会返回data.token,可据此直接登录。
请求参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
action | string | 是 | 固定值 UserRegin |
UserName | string | 是 | 用户名(同一程序下唯一)。等价别名:username |
Password | string | 是 | 密码(明文,已由 RC4 整体加密)。等价别名:pwd、Pwd |
Card | string | 否 | 注册即激活的卡密。等价别名:card |
Mac | string | 否 | 机器码,作为账号初始绑定设备。等价别名:mac、DeviceId |
DeviceName | string | 否 | 设备名称/备注。等价别名:Device |
BindQQ | string | 否 | 传 1 时进入 QQ 扫码注册流程(此时无需 Password,但 UserName 仍必填) |
明文示例:
text
# 仅注册(不激活)
action=UserRegin&UserName=testuser01&Password=123456&Mac=MAC001
# 注册并同时用卡密激活
action=UserRegin&UserName=testuser01&Password=123456&Card=6PCG-ZRSZ-EX83-YBEH&Mac=MAC001QQ 扫码注册(BindQQ=1)
传 BindQQ=1 时,后端不会立即创建账号,而是缓存注册信息并返回 QQ 扫码链接;用户扫码完成后才真正创建账号。
text
action=UserRegin&UserName=testuser01&BindQQ=1&Mac=MAC001返回:
json
{
"code": 200,
"message": "请扫码绑定QQ",
"data": { "url": "https://graph.qq.com/oauth2.0/authorize?..." }
}业务规则
- 用户名必唯一:同一程序下已存在该用户名返回
1017。 - 每 IP 注册数限制:若产品开启了「每 IP 最大注册数」,超过上限返回
1019。 - 无卡密注册:账号照常创建,但激活记录标记为
expired(过期),登录会返回1005,需补卡续期。 - 带卡密注册:卡密直接激活账号并返回
data.token。按次卡密不能用于注册,会返回1024。 - QQ 扫码注册:扫码前不会占用用户名,扫码成功后才落库。
请求示例
python
# 复用 /api/handle 页面中的 handle() 与 rc4() 函数
API_PW = "A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6"
plain = "action=UserRegin&UserName=testuser01&Password=123456&Card=6PCG-ZRSZ-EX83-YBEH&Mac=MAC001"
result = handle(API_PW, plain)
code = result["code"]
if code == 200:
data = result.get("data") or {}
print(f"注册成功,到期 {data.get('expire_at')}")
if "token" in data:
print(f"已激活,token={data['token']}")
elif code == 1017:
print("用户名已被注册")
elif code == 1019:
print("该 IP 注册数已达上限")
else:
print(f"注册失败 {code}: {result['message']}")csharp
// 复用 /api/handle 页面中的 A7Client
var client = new A7Client(apiPassword);
string plain = "action=UserRegin&UserName=testuser01&Password=123456&Card=6PCG-ZRSZ-EX83-YBEH&Mac=MAC001";
JsonElement result = await client.HandleAsync(plain);
int code = result.GetProperty("code").GetInt32();
switch (code)
{
case 200:
JsonElement data = result.GetProperty("data");
Console.WriteLine($"注册成功,到期 {data.GetProperty("expire_at").GetString()}");
break;
case 1017:
Console.WriteLine("用户名已被注册");
break;
case 1019:
Console.WriteLine("该 IP 注册数已达上限");
break;
default:
Console.WriteLine($"注册失败 {code}: {result.GetProperty("message").GetString()}");
break;
}javascript
// 复用 /sdk/nodejs 中的 A7Client
const client = new A7Client({ appId: '150018', appKey: 'YOUR_APP_KEY' })
await client.init()
const result = await client.call('UserRegin', {
UserName: 'testuser01',
Password: '123456',
Card: '6PCG-ZRSZ-EX83-YBEH',
Mac: 'MAC001',
})
if (result.code === 200) {
console.log('注册成功,到期', result.data.expire_at)
} else if (result.code === 1017) {
console.log('用户名已被注册')
} else {
console.error(`注册失败 ${result.code}: ${result.message}`)
}text
.版本 2
.子程序 A7_用户注册, 逻辑型
.参数 ApiPassword, 文本型
.参数 账号, 文本型
.参数 密码, 文本型
.局部变量 TimeStamp, 文本型
.局部变量 加密参数, 文本型
.局部变量 Sign, 文本型
.局部变量 返回文本, 文本型
.局部变量 状态码, 文本型
TimeStamp = 到文本 (时间_取现行时间戳 ())
加密参数 = RC4加密 (ApiPassword, "action=UserRegin&UserName=" + 账号 + "&Password=" + 密码 + "&Mac=" + 取机器码 ())
Sign = 取数据摘要 (到字节集 (ApiPassword + TimeStamp + 加密参数))
返回文本 = 到文本 (网页_访问 ("https://www.a7p.cn/api/verify/" + ApiPassword, 1, "TimeStamp=" + TimeStamp + "&Sign=" + Sign + "&Data=" + 加密参数))
状态码 = JSON_解析 (返回文本, "code")
.判断开始 (状态码 = "200")
返回 (真)
.判断 (状态码 = "1017")
信息框 ("用户名已被注册", 0, )
.默认
信息框 ("注册失败:" + JSON_解析 (返回文本, "message"), 0, )
.判断结束
返回 (假)成功响应
仅注册(不传 Card)
json
{
"code": 200,
"message": "success",
"data": {
"username": "testuser01",
"user_id": 1024,
"expire_at": "2026-08-02 23:50:00"
}
}| 字段 | 类型 | 说明 |
|---|---|---|
username | string | 注册的用户名 |
user_id | int | 账号 ID |
expire_at | string | 账号激活到期时间;无卡密注册时为注册当下时间(已过期状态) |
注册 + 卡密激活(传 Card)
json
{
"code": 200,
"message": "success",
"data": {
"username": "testuser01",
"user_id": 1024,
"token": "9c4d2e01f7b8443a...",
"expire_at": "2026-09-01 12:00:00",
"status": "active"
}
}| 字段 | 类型 | 说明 |
|---|---|---|
username | string | 用户名 |
user_id | int | 账号 ID |
token | string | 卡密激活后发放的登录凭证(40 位随机串) |
expire_at | string | 激活到期时间 |
status | string | active = 正常 |
QQ 扫码注册
json
{
"code": 200,
"message": "请扫码绑定QQ",
"data": { "url": "https://graph.qq.com/oauth2.0/authorize?..." }
}失败响应
json
{ "code": 1013, "message": "参数不完整: UserName, Password 必填", "data": null }json
{ "code": 1017, "message": "用户名已被注册", "data": null }json
{ "code": 1019, "message": "该IP注册数已达上限,每IP最大注册数: 3", "data": null }json
{ "code": 1024, "message": "按次卡密不能用于用户注册,请使用卡密登录方式", "data": null }错误码
| 错误码 | 含义 | 解决方案 |
|---|---|---|
1013 | 参数不完整 | UserName 与 Password 必填 |
1017 | 用户名已被注册 | 换一个用户名,或改走 UserLogin |
1019 | 该 IP 注册数已达上限 | 到后台调高限额,或引导用户换网络环境 |
1004 | 卡密无效 | Card 不存在或不属于当前产品 |
1024 | 按次卡密不能注册 | 按次卡请走 SingleLogin |
1005 | 卡密已过期 | 卡密已过期,换一张 |
完整列表见错误码对照表。
相关文档
- UserLogin 用户登录 —— 注册后登录
- UserRecharge 用户续期 —— 无卡注册后的补激活
- SingleLogin 卡密登录 —— 按次卡只能走这里
- SDK 实现:易语言 · C# · Python · Node.js