v1.0 · 现在开始接入
多姿态聚合登录平台 API 文档
一套 API 连接 50+ 主流 OAuth 登录平台。完善的 RESTful 接口设计, 支持多语言 SDK, 5 分钟即可完成接入。
快速开始
5 分钟完成 OAuth 登录接入
1
创建账号和应用
注册 多姿态聚合登录平台 账号,进入「控制台 → 我的应用」创建一个新应用,获取
API Key 和 API Secret。2
发起 OAuth 授权
调用 OAuth 授权接口,将用户重定向到第三方平台进行授权。
3
处理回调
用户授权后,第三方平台会携带
code 参数跳转到您设置的回调地址,用 code 换取用户信息。4
完成登录
获取到用户信息后,将其关联到您的系统用户,完成登录流程。
login.php
$baseUrl = 'https://login.duozitai.com';
$params = [
'act' => 'login',
'appid' => 'YOUR_API_KEY',
'appkey' => 'YOUR_API_SECRET',
'type' => 'qq',
'redirect_uri' => 'https://your-domain.com/callback.php',
'state' => bin2hex(random_bytes(16))
];
$url = $baseUrl . '/connect.php?' . http_build_query($params);
$result = json_decode(file_get_contents($url), true);
if ($result['code'] == 0) {
header('Location: ' . $result['url']);
exit;
}
login.py
import requests
import secrets
BASE_URL = 'https://login.duozitai.com'
params = {
'act': 'login',
'appid': 'YOUR_API_KEY',
'appkey': 'YOUR_API_SECRET',
'type': 'qq',
'redirect_uri': 'https://your-domain.com/callback',
'state': secrets.token_hex(16)
}
resp = requests.get(f'{BASE_URL}/connect.php', params=params).json()
if resp['code'] == 0:
# 重定向用户到授权页面
print(resp['url'])
server.js (Express)
const axios = require('axios');
const BASE_URL = 'https://login.duozitai.com';
// 发起登录
app.get('/oauth/:platform', async (req, res) => {
const { platform } = req.params;
const params = {
act: 'login',
appid: process.env.API_KEY,
appkey: process.env.API_SECRET,
type: platform,
redirect_uri: 'https://your-domain.com/callback',
state: crypto.randomBytes(16).toString('hex')
};
const { data } = await axios.get(`${BASE_URL}/connect.php`, { params });
if (data.code === 0) res.redirect(data.url);
else res.status(400).send(data.msg);
});
Terminal
# 发起 OAuth 登录
curl -s "https://login.duozitai.com/connect.php?act=login&appid=YOUR_API_KEY&appkey=YOUR_API_SECRET&type=qq&redirect_uri=https%3A%2F%2Fyour-domain.com%2Fcallback"
# 用 code 换取用户信息
curl -s "https://login.duozitai.com/connect.php?act=callback&appid=YOUR_API_KEY&appkey=YOUR_API_SECRET&code=CALLBACK_CODE"
API 概述
基础信息、认证方式、请求与响应格式
Base URL:
https://login.duozitai.com
请求方式
GET / POST(OAuth 接口支持 GET,管理接口支持 POST)
返回格式
统一 JSON 格式响应
字符编码
UTF-8
HTTPS
生产环境强制 HTTPS 加密传输
认证方式
管理 API 认证:所有
/api/v1/* 接口需要在请求头中携带 Authorization: Bearer {api_key},或通过 POST/GET 参数传递 api_key 和 api_secret。
统一响应格式
Response Format
// 成功响应
{
"code": 0,
"msg": "success",
"data": { ... }
}
// 错误响应
{
"code": 401,
"msg": "认证失败",
"errcode": 40101
}
支持的平台
50+ 主流 OAuth 登录平台,持续新增中
QQ 登录
type=qq
微信登录
type=wx
支付宝
type=alipay
微博
type=sina
百度
type=baidu
GitHub
type=github
Gitee
type=gitee
Google
type=google
Microsoft
type=microsoft
华为
type=huawei
小米
type=xiaomi
哔哩哔哩
type=bilibili
钉钉
type=dingtalk
飞书
type=feishu
企业微信
type=wecom
抖音
type=douyin
访问 平台列表接口 可获取完整的实时平台列表及图标资源。
创建应用
POST /api/v1/app/create
POST
/api/v1/app/create
创建一个新的 OAuth 应用,系统将自动分配 API Key 和 API Secret。
请求参数
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
name | 是 | string | 应用名称,最长 50 字符 |
description | 否 | string | 应用描述 |
callback_url | 否 | string | 授权回调地址 |
成功响应
{
"code": 0,
"msg": "success",
"data": {
"id": 1,
"api_key": "1234567890123456",
"api_secret": "abcdef1234567890abcdef1234567890"
}
}
更新应用
POST /api/v1/app/update
POST
/api/v1/app/update
更新指定应用的信息(名称、描述、回调地址)。
请求参数
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
id | 是 | int | 应用 ID |
name | 否 | string | 新应用名称 |
description | 否 | string | 新描述 |
callback_url | 否 | string | 新回调地址 |
只需传入需要更新的字段,未传入的字段将保持原值不变。
删除应用
POST /api/v1/app/delete
POST
/api/v1/app/delete
删除指定应用,删除后该应用的所有配置和密钥将立即失效。
请求参数
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
id | 是 | int | 应用 ID |
警告:此操作不可逆。删除后使用该应用的所有登录请求将立即停止工作。
应用列表
GET /api/v1/app/list
GET
/api/v1/app/list
分页获取当前账号下的所有应用列表。
请求参数
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
page | 否 | int | 页码,默认 1 |
per_page | 否 | int | 每页条数,默认 20,最大 100 |
成功响应
{
"code": 0,
"msg": "success",
"data": {
"total": 10,
"per_page": 20,
"current_page": 1,
"last_page": 1,
"data": [
{
"id": 1,
"name": "我的应用",
"description": "应用描述",
"api_key": "1234567890123456",
"callback_url": "https://example.com/callback",
"status": 1,
"created_at": "2024-01-01 00:00:00"
}
]
}
}
应用详情
GET /api/v1/app/info
GET
/api/v1/app/info
获取指定应用的详细信息。
请求参数
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
id | 是 | int | 应用 ID |
平台列表
GET /api/v1/platforms
GET
/api/v1/platforms
获取当前所有已启用的 OAuth 登录平台列表,包含平台名称、图标、type 值等信息。此接口无需认证。
成功响应
{
"code": 0,
"msg": "success",
"data": [
{
"id": 1,
"name": "qq",
"platform": "QQ登录",
"icon": "/assets/icon/qq.svg",
"enabled": 1,
"sort": 1
}
]
}
OAuth 授权
GET /oauth/{platform} 或 GET /connect.php?act=login
GET
/oauth/{platform}
发起 OAuth 授权流程。系统将生成第三方授权 URL,您需要将用户重定向到此 URL。
请求参数
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
platform | 是 | string | 路径参数,平台标识如 qq、wx 等 |
appid | 是 | string | 应用 API Key |
appkey | 是 | string | 应用 API Secret |
redirect_uri | 是 | string | 回调地址,需 URL 编码 |
state | 否 | string | 自定义状态参数,用于防止 CSRF |
成功响应
{
"code": 0,
"msg": "success",
"type": "qq",
"url": "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=xxx&redirect_uri=xxx&state=xxx"
}
回调处理
GET /connect.php?act=callback
GET
/connect.php?act=callback
用户在第三方平台授权成功后,会携带 code 参数跳转到回调地址。调用此接口用 code 换取用户信息。
请求参数
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
act | 是 | string | 固定值 callback |
appid | 是 | string | 应用 API Key |
appkey | 是 | string | 应用 API Secret |
code | 是 | string | 授权码,5 分钟内有效,仅可使用一次 |
成功响应
{
"code": 0,
"msg": "success",
"type": "qq",
"social_uid": "ABCD1234567890",
"nickname": "用户昵称",
"faceimg": "https://thirdqq.qlogo.cn/g?b=oidb&k=xxx",
"gender": 1,
"location": "广东 深圳",
"ip": "113.89.xxx.xxx"
}
重要:
social_uid 是用户唯一标识,建议存储到数据库;每个 code 只能使用一次。
代码示例
PHP / Python / Node.js 完整接入代码
PHP 完整回调示例
callback.php
$apiurl = 'https://login.duozitai.com/connect.php';
$appid = 'YOUR_API_KEY';
$appkey = 'YOUR_API_SECRET';
$code = $_GET['code'] ?? '';
if ($code) {
$url = $apiurl.'?'.http_build_query([
'act'=>'callback','appid'=>$appid,
'appkey'=>$appkey,'code'=>$code
]);
$result = json_decode(file_get_contents($url), true);
if ($result['code']==0) {
echo '登录成功:'.$result['nickname'];
}
}
Python Flask 示例
app.py
import requests
from flask import Flask, redirect, request
app = Flask(__name__)
BASE='https://login.duozitai.com'
@app.route('/login/<p>')
def login(p):
d=requests.get(f'{BASE}/connect.php',
params={'act':'login','appid':'YOUR_KEY',
'appkey':'YOUR_SECRET','type':p,
'redirect_uri':f'{BASE}/callback'}).json()
return redirect(d['url'])
@app.route('/callback')
def callback():
d=requests.get(f'{BASE}/connect.php',
params={'act':'callback','appid':'YOUR_KEY',
'appkey':'YOUR_SECRET',
'code':request.args.get('code')}).json()
return f"登录成功:{d['nickname']}" if d['code']==0 else d['msg']
Node.js Express 示例
server.js
const express=require('express');
const axios=require('axios');
const app=express();
const BASE='https://login.duozitai.com';
app.get('/login/:p',async(req,res)=>{
const {data}=await axios.get(`${BASE}/connect.php`,{
params:{act:'login',appid:process.env.API_KEY,
appkey:process.env.API_SECRET,type:req.params.p,
redirect_uri:`${BASE}/callback`}});
data.code===0?res.redirect(data.url):res.status(400).send(data.msg);
});
app.get('/callback',async(req,res)=>{
const {data}=await axios.get(`${BASE}/connect.php`,{
params:{act:'callback',appid:process.env.API_KEY,
appkey:process.env.API_SECRET,code:req.query.code}});
data.code===0?res.send(`登录成功:${data.nickname}`):res.status(400).send(data.msg);
});
错误码说明
API 统一错误码及处理建议
| 错误码 | HTTP 状态 | 说明 | 处理建议 |
|---|---|---|---|
0 | 200 | 请求成功 | 正常处理业务逻辑 |
-1 | 200 | 通用错误 | 查看 msg 字段获取详细信息 |
101 | 401 | 参数错误 | 检查必填参数是否完整 |
102 | 401 | 应用不存在或已禁用 | 确认 API Key 和应用状态 |
103 | 401 | API Secret 错误 | 检查密钥是否正确 |
201 | 400 | 授权码无效 | code 仅可用一次,请重新授权 |
202 | 400 | 授权码过期 | code 有效期 5 分钟 |
301 | 429 | 请求频率过高 | 降低请求频率 |
401 | 401 | 未认证 | 检查 Authorization 头 |
403 | 403 | 无权限 | 确认套餐权限 |
500 | 500 | 服务器错误 | 稍后重试或联系支持 |
OAuth 2.0 授权流程
标准授权码模式完整流程
用户访问您的网站
用户点击"第三方登录"按钮,服务端调用
/connect.php?act=login生成授权 URL
返回第三方授权 URL,您将用户 302 重定向
用户在第三方授权
用户同意授权后,平台携带
code 重定向到回调地址用 code 换取信息
调用
/connect.php?act=callback&code=xxx 获取用户信息完成登录
获取
social_uid、nickname 等信息,关联本地用户流程示意图
用户 → 您的网站 → 聚合登录
↘
第三方平台 → 回调地址 → 数据库
常见问题
FAQ 与故障排除
回调地址必须与应用配置中设置的授权域名完全匹配,包括协议、域名、路径。
OAuth code 只能使用一次,有效期 5 分钟。获取后请立即调用 callback 接口。
免费版每秒 5 次,基础版每秒 20 次,企业版可按需定制。建议添加缓存和重试机制。
请勿在前端暴露 API Key/Secret,所有调用应在服务端发起。如泄露请立即重新生成。
部分平台支持 HTTP 本地调试。建议使用 ngrok 等工具将本地服务暴露为 HTTPS 地址进行开发。
通过网站联系表单提交工单,或购买企业版套餐享受优先技术支持服务。