开发文档

快速了解如何接入第三方登录,详细的API说明与使用指南

概述

零度聚合 是一款社会化账号聚合登录系统,基于 OAuth2.0 协议,为网站提供统一、便捷的第三方登录服务。 开发者只需简单的几步操作,即可在自己的网站上集成 QQ、微信、支付宝、微博、GitHub 等多种第三方登录方式。

核心优势

  • 统一接口 -- 一套 API 对接多个平台,无需重复开发
  • 简化开发 -- 无需单独对接每个平台的复杂授权流程
  • 协议标准 -- 基于 OAuth2.0 标准协议,安全可靠
  • 语言无关 -- 纯 HTTP 接口,支持任何能发送 HTTP 请求的编程语言

整体流程

聚合登录的完整流程如下图所示:

1
您的网站
发起登录请求(API)
GET /connect.php?act=login
2
聚合登录服务端
验证参数,返回跳转 URL
返回授权 URL
3
第三方平台
用户在 QQ / 微信等平台完成授权
授权完成,自动回调
4
您的网站 · 回调页
接收 type + code 参数
GET /connect.php?act=callback
5
聚合登录服务端
用 code 换取用户信息
code=2 时需轮询重试
6
登录完成
使用 social_uid 绑定本地用户
获取 nickname / faceimg 等信息
前提条件
  • 已注册 零度聚合 账号并登录用户中心
  • 已创建应用并获取 AppID 和 AppKey
  • 您的网站支持 PHP 或其他能发起 HTTP 请求的语言环境
  • 已在应用设置中配置回调授权域名

支持平台

目前共支持 25 种第三方登录平台,以下是各平台对应的 type 参数值:

type 值平台名称type 值平台名称
qqQQwx微信
alipay支付宝sina微博
baidu百度githubGitHub
giteeGiteegoogleGoogle
facebookFacebooktwitterTwitter
microsoftMicrosoftdingtalk钉钉
feishu飞书douyin抖音
huawei华为xiaomi小米
douban豆瓣gitlabGitLab
giteaGiteagitcodeGitCode
jihulab极狐GitLabopenatomOpenAtom
wework企业微信oschinaOSChina
aliyun阿里云
提示

各平台是否可用取决于管理员是否在后台开启并配置了对应的密钥。微信(wx)和支付宝(alipay)额外支持扫码登录模式。

快速开始

只需 4 步即可完成第三方登录接入:

1

注册并创建应用

访问用户中心注册账号,进入应用管理创建您的应用,获取 AppID 和 AppKey。

2

配置回调地址

在应用设置中填写您网站的回调地址(如 https://yourdomain.com/callback.php),并添加授权域名。

3

发起登录请求

在您的网站登录页面,通过 API 获取登录跳转地址,引导用户跳转至第三方授权页面。

4

处理回调并获取用户信息

用户授权后,系统会回调至您设置的地址,您通过回调接口即可直接获取用户信息。

示例代码

以下是一个简单的 PHP 接入示例:

PHP - 发起登录
<?php
// 配置信息
$appid  = '您的AppID';
$appkey = '您的AppKey';
$callback = 'https://yourdomain.com/callback.php';

// 发起登录 - 以QQ为例
$loginUrl = "https://您的域名/connect.php?act=login"
          . "&appid={$appid}"
          . "&appkey={$appkey}"
          . "&type=qq"
          . "&redirect_uri=" . urlencode($callback);

// 请求API获取跳转地址
$result = json_decode(file_get_contents($loginUrl), true);

if ($result['code'] == 0) {
    // 跳转到第三方授权页面
    header('Location: ' . $result['url']);
    exit;
} else {
    echo '登录发起失败:' . $result['msg'];
}
?>
PHP - 回调处理(基础版)
<?php
// callback.php - 处理登录回调
$appid  = '您的AppID';
$appkey = '您的AppKey';

if (isset($_GET['type']) && isset($_GET['code'])) {
    $type = $_GET['type'];
    $code = $_GET['code'];

    // 通过回调接口直接获取用户信息
    $apiUrl = "https://您的域名/connect.php"
            . "?act=callback"
            . "&appid={$appid}"
            . "&appkey={$appkey}"
            . "&type={$type}"
            . "&code={$code}";

    $response = file_get_contents($apiUrl);
    $data = json_decode($response, true);

    if ($data['code'] == 2) {
        // 用户尚未完成登录,需要等待重试
        echo '登录尚未完成,请稍后...';
    } elseif ($data['code'] == 0) {
        // 登录成功,获取用户信息
        echo '用户昵称:' . $data['nickname'] . '<br>';
        echo '用户头像:' . $data['faceimg'] . '<br>';
        echo '唯一标识:' . $data['social_uid'] . '<br>';
        // 请使用 social_uid 作为用户唯一标识进行绑定
    } else {
        echo '登录失败:' . $data['msg'];
    }
}
?>

完整示例(含轮询重试)

实际生产环境中,建议在收到 code=2 时进行轮询重试,直到获取到最终结果:

PHP - 回调处理(生产版,含轮询)
<?php
// callback.php - 生产环境推荐写法
$appid  = '您的AppID';
$appkey = '您的AppKey';
$apiBase = 'https://您的域名';

if (!isset($_GET['type']) || !isset($_GET['code'])) {
    die('缺少必要参数');
}

$type = $_GET['type'];
$code = $_GET['code'];
$maxRetry = 10;        // 最大重试次数
$interval = 2000000;   // 重试间隔 2 秒(微秒)

for ($i = 0; $i < $maxRetry; $i++) {
    $apiUrl = "{$apiBase}/connect.php?act=callback"
            . "&appid={$appid}&appkey={$appkey}"
            . "&type={$type}&code={$code}";

    $response = file_get_contents($apiUrl);
    $data = json_decode($response, true);

    if ($data['code'] == 0) {
        // 登录成功
        // 使用 social_uid 查找或创建本地用户
        $user = findOrCreateUser($data['type'], $data['social_uid']);
        $user->nickname = $data['nickname'];
        $user->avatar   = $data['faceimg'];
        $user->save();

        // 设置登录 Session
        $_SESSION['user_id'] = $user->id;
        header('Location: /dashboard.php');
        exit;
    } elseif ($data['code'] == 2) {
        // 用户尚未完成授权,等待后重试
        usleep($interval);
        continue;
    } else {
        // 登录失败
        die('登录失败[' . $data['errcode'] . ']:' . $data['msg']);
    }
}
die('登录超时,请重试');
?>

前后端分离示例

对于 Vue/React 等前后端分离项目,后端只需提供两个代理接口即可:

Node.js (Express) - 后端代理示例
const express = require('express');
const axios = require('axios');
const app = express();

const APPID = '您的AppID';
const APPKEY = '您的AppKey';
const API_BASE = 'https://您的域名';

// 1. 前端调用此接口获取登录跳转URL
app.get('/api/login', async (req, res) => {
    const { type, redirect_uri } = req.query;
    const url = `${API_BASE}/connect.php?act=login`
        + `&appid=${APPID}&appkey=${APPKEY}`
        + `&type=${type}&redirect_uri=${encodeURIComponent(redirect_uri)}`;

    const { data } = await axios.get(url);
    if (data.code === 0) {
        res.json({ success: true, url: data.url });
    } else {
        res.json({ success: false, msg: data.msg });
    }
});

// 2. 前端回调后调用此接口获取用户信息
app.get('/api/callback', async (req, res) => {
    const { type, code } = req.query;
    const url = `${API_BASE}/connect.php?act=callback`
        + `&appid=${APPID}&appkey=${APPKEY}`
        + `&type=${type}&code=${code}`;

    const { data } = await axios.get(url);
    if (data.code === 0) {
        // data.social_uid / data.nickname / data.faceimg
        res.json({ success: true, user: data });
    } else if (data.code === 2) {
        res.json({ success: false, pending: true, msg: '登录中...' });
    } else {
        res.json({ success: false, msg: data.msg });
    }
});

回调地址说明

回调地址(Redirect URI)是用户完成第三方平台授权后,系统将用户重定向回您网站的地址。该地址会携带授权码 code 参数。

注意事项
  • 回调地址必须以 http://https:// 开头
  • 回调域名必须在用户中心的应用设置中提前配置授权域名
  • 建议使用 HTTPS 协议以确保数据传输安全
  • 授权码(code)有效期较短,收到回调后请尽快处理

回调参数

登录成功后,系统会重定向到您设置的回调地址,并附加以下参数:

参数 类型 必返回 说明
type String 登录类型,如 qq、wx、alipay 等
code String 授权码,用于通过回调接口获取用户信息
state String 自定义状态参数,原样返回,用于防止CSRF攻击

回调示例:https://yourdomain.com/callback.php?type=qq&code=520DD95263C1CFEA0870&state=your_state

接口文档

1. 发起登录

通过此接口获取第三方平台的登录跳转地址,引导用户前往授权。

GET /connect.php?act=login
获取第三方登录跳转 URL,成功时返回 JSON 数据(需在服务端请求)。

请求参数

参数类型必填说明
act String 固定值:login
appid String 应用的 AppID
appkey String 应用的 AppKey(请勿在前端暴露)
type String 登录类型:qq、wx、alipay、sina、github 等
redirect_uri String 授权回调地址,需 URL 编码
state String 自定义状态参数,回调时原样返回,建议传递以防止 CSRF 攻击

成功返回示例

JSON Response - 成功
{
    "code": 0,
    "msg": "succ",
    "type": "qq",
    "url": "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=xxx&redirect_uri=xxx&state=xxx"
}

微信(wx)和支付宝(alipay)登录时,还会额外返回 qrcode 字段,可用于生成扫码登录二维码。

失败返回示例

JSON Response - 失败
{
    "code": -1,
    "errcode": 103,
    "msg": "回调域名未授权"
}

2. 登录回调(获取用户信息)

用户完成第三方授权后,使用回调收到的 code 直接换取用户信息。无需分两步获取 Token,一步即可拿到完整的用户数据。

GET /connect.php?act=callback
通过授权码 code 换取用户信息,成功时直接返回用户完整数据。

请求参数

参数类型必填说明
act String 固定值:callback
appid String 应用的 AppID
appkey String 应用的 AppKey
type String 登录类型,与发起登录时一致
code String 回调时收到的授权码

成功返回示例

JSON Response - 成功
{
    "code": 0,
    "msg": "succ",
    "type": "qq",
    "access_token": "89DC9691E274D6B596FFCB8D43368234",
    "social_uid": "AD3F5033279C8187CBCBB29235D5F827",
    "faceimg": "https://thirdqq.qlogo.cn/g?b=oidb&k=...",
    "nickname": "用户昵称",
    "location": "北京市",
    "gender": "男",
    "ip": "1.12.3.40"
}

重要:返回 code: 2 表示用户尚未完成第三方登录授权,建议间隔 2 秒后重试。

返回 code=2 示例(未完成登录)

JSON Response - 未完成
{
    "code": 2,
    "msg": "登录中"
}

返回失败示例

JSON Response - 失败
{
    "code": -1,
    "errcode": 102,
    "msg": "记录不存在"
}

返回参数说明

参数类型说明
code Int 状态码:0=成功,2=未完成登录,-1=失败
msg String 状态信息
type String 登录方式
social_uid String 第三方用户唯一标识(请以此字段绑定用户)
access_token String 第三方登录 Token
nickname String 用户昵称
faceimg String 用户头像 URL
gender String 用户性别(男/女)
location String 用户所在地(部分平台返回)
ip String 用户登录 IP

3. 查询用户信息

在用户登录后的任意时间,可以使用此接口再次查询该用户的详细信息。

GET /connect.php?act=query
通过 social_uid 查询已登录用户的最新信息。

请求参数

参数类型必填说明
act String 固定值:query
appid String 应用的 AppID
appkey String 应用的 AppKey
type String 登录方式
social_uid String 第三方用户唯一标识

成功返回示例

JSON Response
{
    "code": 0,
    "msg": "succ",
    "type": "qq",
    "social_uid": "AD3F5033279C8187CBCBB29235D5F827",
    "access_token": "89DC9691E274D6B596FFCB8D43368234",
    "nickname": "用户昵称",
    "faceimg": "https://thirdqq.qlogo.cn/g?...",
    "location": "北京市",
    "gender": "男",
    "ip": "1.12.3.40"
}

查询失败返回示例

JSON Response - 用户不存在
{
    "code": -1,
    "msg": "none"
}

返回参数说明

参数类型说明
code Int 状态码:0=成功,-1=用户不存在
msg String succ=成功,none=用户不存在
social_uid String 第三方用户唯一标识
access_token String 第三方登录 Token
nickname String 用户昵称
faceimg String 用户头像 URL
gender String 用户性别(男/女)
location String 用户所在地(部分平台返回)
ip String 用户登录 IP

错误码说明

所有接口在请求失败时,统一返回 {"code": -1, "errcode": xxx, "msg": "错误描述"} 格式。

codeerrcode说明解决方案
0 - 请求成功 -
2 - 用户尚未完成第三方登录 间隔 2 秒后重新请求回调接口
-1 101 缺少必要参数 检查 act、appid、appkey 等必填参数是否传递
-1 102 应用不存在 / 应用已关闭 / 应用审核中 / 应用审核未通过 / 授权记录不存在或已失效 检查 AppID 是否正确,确认应用状态正常,或重新发起登录
-1 103 AppKey 不正确 / 回调域名未授权 / 该登录方式无法使用 / 用户被封禁 检查 AppKey 是否正确;在应用设置中添加回调授权域名
-1 104 登录方式未开启或未配置 / 未知登录方式 确认该登录方式已启用并正确配置了密钥
-1 201 数据库错误 联系管理员排查
-1 301 第三方平台返回错误 查看 msg 中的具体错误信息,检查第三方平台密钥配置

安全说明

安全注意事项
  • AppKey 保密:AppKey 是应用的重要凭证,绝不能在前端 HTML/JavaScript 中暴露,所有涉及 AppKey 的请求必须在服务端发起。
  • 域名授权:系统支持域名白名单校验,开启后只有预先配置的域名才能使用该应用的登录功能,有效防止 AppKey 被盗用。
  • HTTPS:强烈建议您的网站使用 HTTPS 协议,确保传输过程中数据的安全性。
  • state 参数:建议在发起登录时传递 state 参数,回调时验证其值是否与发送时一致,以防止 CSRF 攻击。
  • social_uid:请使用 social_uid(而非 nickname)作为用户的唯一标识进行账号绑定,因为用户昵称可能变更。

最佳实践

1. 使用 cURL 替代 file_get_contents

生产环境中,推荐使用 cURL 发起 HTTP 请求,它支持超时控制、SSL 验证等关键特性:

PHP - cURL 封装函数
<?php
function httpGet($url, $timeout = 10) {
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL            => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => $timeout,
        CURLOPT_CONNECTTIMEOUT => $timeout,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_FOLLOWLOCATION => true,
    ]);
    $response = curl_exec($ch);
    $errno = curl_errno($ch);
    curl_close($ch);

    if ($errno) {
        return ['error' => true, 'msg' => curl_error($ch)];
    }
    return json_decode($response, true);
}

// 使用示例
$result = httpGet("https://您的域名/connect.php?act=login&appid={$appid}&appkey={$appkey}&type=qq&redirect_uri=" . urlencode($callback));
if ($result['code'] == 0) {
    header('Location: ' . $result['url']);
    exit;
}
?>

2. 轮询策略优化

收到 code=2 时,推荐使用递增间隔的轮询策略,避免频繁请求:

PHP - 递增间隔轮询
<?php
$maxRetry = 15;
$intervals = [2, 2, 2, 3, 3, 3, 5, 5, 5, 5, 5, 8, 8, 8, 10]; // 递增间隔(秒)

for ($i = 0; $i < $maxRetry; $i++) {
    $data = httpGet($apiUrl);

    if ($data['code'] == 0) {
        // 登录成功,处理用户信息
        break;
    } elseif ($data['code'] == 2) {
        sleep($intervals[$i]);
        continue;
    } else {
        die('登录失败: ' . $data['msg']);
    }
}
die('登录超时');
?>

3. 用户绑定建议

推荐使用 type + social_uid 的组合键作为用户唯一标识,建表建议:

SQL - 用户绑定表结构参考
CREATE TABLE `user_oauth` (
  `id`          INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  `user_id`     INT UNSIGNED NOT NULL,
  `type`        VARCHAR(20)  NOT NULL COMMENT '登录方式: qq/wx/alipay等',
  `social_uid`  VARCHAR(64)  NOT NULL COMMENT '第三方用户唯一标识',
  `nickname`    VARCHAR(100) DEFAULT NULL,
  `avatar`      VARCHAR(500) DEFAULT NULL,
  `created_at`  DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at`  DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  UNIQUE KEY `uk_type_social` (`type`, `social_uid`),
  KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

4. 错误处理最佳实践

  • 始终检查返回值中的 code 字段,不要只判断是否为 0
  • 记录 errcodemsg 到日志系统,便于排查问题
  • code=2 设置最大重试次数,避免无限轮询
  • 请求接口时设置合理的超时时间(建议 10-15 秒)
  • 对接口返回的用户数据进行校验,特别是 social_uid 不能为空

5. 前端集成建议

  • 不要在前端暴露 AppKey:所有涉及 AppKey 的请求必须由后端代理
  • SPA 项目:后端提供代理接口,前端通过 AJAX 调用后端代理
  • 微信/支付宝扫码:使用 qrcode 字段生成二维码,配合轮询完成登录
  • state 参数:建议生成随机字符串存入 Session,回调时校验一致性

SDK 下载

我们提供了完整的 SDK 开发包,包含示例代码和详细说明,帮助您快速接入聚合登录。

SDK v1.0
包含完整示例代码和集成说明,支持 PHP 等多种语言。
立即下载 SDK

常见问题

如何获取 AppID 和 AppKey?

注册并登录用户中心,在「应用管理」中创建应用即可获取。

回调提示"回调域名未授权"怎么办?

请在用户中心的应用设置中添加您网站的域名到授权域名列表。例如您的回调地址是 https://www.example.com/callback.php,则需要添加域名 www.example.com

支持哪些第三方登录平台?

目前支持 QQ、微信、支付宝、微博、百度、GitHub、Google、Facebook、Gitee、Twitter、Microsoft、钉钉、飞书、抖音、华为、小米、豆瓣、GitLab、Gitea、GitCode、极狐GitLab、OpenAtom、企业微信、OSChina、阿里云等 25 种平台。

回调接口返回 code=2 是什么意思?

code=2 表示用户在第三方平台的授权尚未完成。建议在收到此返回后,间隔 2 秒重新请求回调接口,直到返回 code=0(成功)或 code=-1(失败)。

是否支持前后端分离项目?

支持。所有接口均为标准的 HTTP GET API,返回 JSON 格式数据,任何能发送 HTTP 请求的语言和框架都可以使用。

如何处理登录失败的情况?

登录失败时接口会返回 {"code": -1, "errcode": xxx, "msg": "错误描述"},请根据 errcode 和 msg 进行排查处理。常见原因包括:AppID/AppKey 错误、回调域名未授权、登录方式未配置等。

为什么微信和支付宝返回了 qrcode 字段?

微信和支付宝支持扫码登录。发起登录接口成功时,除了返回跳转 URL 外,还会额外返回 qrcode 字段。您可以将此 URL 生成二维码展示给用户扫码登录,适用于 PC 端场景。

用户昵称/头像能否作为唯一标识?

不能。用户可能修改昵称或更换头像,请务必使用 social_uid 作为用户唯一标识进行账号绑定。

是否支持自定义登录页面?

支持。您可以根据自己的需求自定义登录页面样式和流程,只需按照 API 文档的要求发起登录请求并处理回调即可。

授权码(code)有效期是多久?

授权码自生成后 10 分钟内有效。超过此时间后再次使用 code 请求回调接口,将返回 {"code":-1,"errcode":102,"msg":"记录不存在"},需要引导用户重新发起登录。

同一个用户多次登录,social_uid 会变吗?

不会。social_uid 是由第三方平台的用户 ID 经加密处理后的固定值,只要同一个第三方账号,无论何时登录,social_uid 始终相同。

如何实现微信扫码登录?

发起登录接口(act=login)在 type=wx 时会额外返回 qrcode 字段。您可以将此 URL 使用 QRCode 库生成二维码图片展示给用户扫码,扫码成功后用户页面会自动跳转到回调地址。

回调地址的查询参数会被覆盖吗?

如果您的回调地址本身已包含 type 参数,系统会自动检测并避免重复添加。其他参数则正常追加在回调地址后面。

接口有请求频率限制吗?

系统没有硬性的频率限制,但建议合理控制轮询频率(建议间隔 2 秒以上),避免对服务端造成过大压力。同时请设置最大重试次数(推荐 10-15 次)。

access_token 有有效期吗?

第三方平台的 access_token 有效期由各平台自行决定,通常在 30 天到永久不等。聚合登录系统会尽可能保持 token 的有效性,但如果用户在第三方平台取消了授权,token 可能会失效。建议每次用户登录时更新本地存储的 token。

如何实现"记住登录"功能?

在用户首次通过第三方登录成功后,使用 social_uid 在您的数据库中创建或匹配本地用户账号,然后生成您自己的 Session 或 JWT Token 返回给前端。之后前端每次请求时携带该 Token 即可,无需重复走第三方授权流程。

同一用户通过不同平台登录,如何关联到同一账号?

系统返回的 social_uid 仅在同平台内唯一。如需跨平台关联,需要您自行实现账号绑定逻辑。推荐方案:首次登录时自动创建新账号,后续提供"账号合并"功能让用户手动绑定。

file_get_contents 请求接口超时怎么办?

file_get_contents 默认没有超时控制,在生产环境中不建议使用。推荐改用 cURL 并设置 CURLOPT_TIMEOUT 参数(建议 10 秒)。具体写法请参考上方「最佳实践」章节的 cURL 封装函数。