平台概述

统一身份认证中心 开放 API 提供标准化的统一身份认证能力,帮助第三方应用快速接入用户体系,实现单点登录、用户管理、安全审计等功能。

60+

开放 API 接口

4

语言 SDK 支持

99.9%

服务可用性

<100ms

平均响应时间

核心能力

能力说明适用场景
SSO 单点登录OAuth2.0 简化模式,一次登录处处通行多应用统一登录态
用户管理注册、登录、改密、资料修改、设备管理独立站用户体系
安全风控图形验证码、设备绑定、登录历史审计账号安全防护
应用接入AppID / AppSecret 管理,回调白名单第三方应用接入

快速接入

1. 创建应用

登录 管理后台,进入「应用管理」模块,点击「创建应用」获取 AppID 和 AppSecret。

安全提示:AppSecret 相当于应用私钥,请勿暴露在前端代码或公开仓库中。生产环境建议使用环境变量或密钥管理服务存储。

2. 配置回调地址

在应用详情页配置授权回调地址(如 http://your-app.local/callback),用户授权后将跳转至此地址并携带 ticket 参数。

3. 接入 SDK

选择适合您技术栈的 SDK,参照对应语言的快速开始指南接入:

PHP SDK JavaScript SDK Python SDK Go SDK

4. 测试连通性

POST https://open.heicat.com/api/index.php?m=sso&a=test

使用 AppID 和 AppSecret 调用测试接口,验证网络连通与凭证正确性。

认证流程

SSO 单点登录流程

1
跳转授权页
→
2
用户授权
→
3
回调获取 Ticket
→
4
换取 Token
→
5
获取用户信息

Step 1: 构建授权 URL

GET https://open.heicat.com/index.php?c=sso&a=authorize&app_id={APP_ID}&redirect={CALLBACK}&state={STATE}
参数类型必填说明
app_idstring必填应用唯一标识
redirectstring必填授权回调地址(需与应用配置一致)
statestring可选防 CSRF 随机串,回调时原样返回

Step 2: 换取 Token

POST https://open.heicat.com/api/index.php?m=sso&a=exchange
参数类型必填说明
ticketstring必填授权回调获取的一次性票据
app_idstring必填应用 ID
app_secretstring必填应用密钥

响应示例

{
  "code": 0,
  "message": "ok",
  "data": {
    "ok": true,
    "token": "3f2a9c...e17b",
    "expires_in": 604800,
    "uid": 18,
    "username": "zhangsan"
  }
}

当前版本不返回 refresh_token;Token 过期后需重新引导用户授权。 示例中的 expires_in 取后台 sso.token_ttl 配置,默认 604800 秒(7 天)。

API 参考 - 认证接口

SSO 相关

sso.authorize - 发起授权(浏览器跳转)

GET https://open.heicat.com/index.php?c=sso&a=authorize

由浏览器发起。已登录则 302 重定向到回调地址并附带 ticket;未登录返回 401 并在 data 中给出 login_url。

参数类型必填说明
app_idstring必填应用 ID
redirectstring可选回调地址,须在应用回调白名单内;留空取应用首个回调(也接受 callback 作为别名)

sso.test - 通信测试

POST https://open.heicat.com/api/index.php?m=sso&a=test

验证应用凭证与网络连通性。

参数类型必填说明
app_idstring必填应用 ID
app_secretstring必填应用密钥
// 成功响应
{
  "code": 0,
  "message": "ok",
  "data": {
    "ok": true,
    "message": "通信正常",
    "data": {
      "app_name": "我的应用",
      "status": 1,
      "sso_enabled": 1,
      "callbacks": ["https://app.example.com/callback"],
      "ticket_test": "ok",
      "server_time": 1789878021
    }
  }
}

sso.exchange - 换取 Token

POST https://open.heicat.com/api/index.php?m=sso&a=exchange

用授权回调获取的 ticket 换取访问令牌。ticket 一次性且有效期很短,换取后立即失效。

参数类型必填说明
ticketstring必填授权回调带回的票据
app_idstring必填应用 ID
app_secretstring必填应用密钥
// 成功响应(注意:当前版本不返回 refresh_token)
{
  "code": 0,
  "message": "ok",
  "data": {
    "ok": true,
    "token": "3f2a9c...e17b",
    "expires_in": 604800,
    "uid": 18,
    "username": "zhangsan"
  }
}

sso.userinfo - 获取用户信息

POST https://open.heicat.com/api/index.php?m=sso&a=userinfo
参数类型必填说明
tokenstring必填访问令牌;也可通过请求头 Authorization: Bearer <token> 传递
app_idstring可选应用 ID,传入时校验 token 归属该应用
{
  "code": 0,
  "message": "ok",
  "data": {
    "ok": true,
    "user": {
      "uid": 18,
      "username": "zhangsan",
      "nickname": "张三",
      "avatar": "https://.../avatar.png",
      "email": "z@example.com",
      "mobile": "13800000000",
      "gender": 0,
      "birthday": "",
      "bio": "",
      "status": "normal"
    }
  }
}

sso.logout - 单点退出

POST https://open.heicat.com/api/index.php?m=sso&a=logout

吊销该 token 对应的登录态(仅影响当前令牌)。

参数类型必填说明
tokenstring必填访问令牌;也可通过 Authorization: Bearer 传递
app_idstring可选应用 ID

API 参考 - 用户接口

以下接口需要用户已登录(携带会话 Cookie)或通过 Token 认证。

user.register - 用户注册

POST https://open.heicat.com/api/index.php?m=user&a=register
参数类型必填说明
usernamestring必填用户名(3-20位字母数字下划线)
passwordstring必填密码
confirmstring可选确认密码;留空时默认等于 password
emailstring可选邮箱;留空时系统自动生成占位邮箱
mobilestring可选手机号
nicknamestring可选昵称,留空取用户名
genderint可选性别(数值,默认 0)
auto_loginstring可选注册后自动登录(1/0,默认 1)
{
  "code": 0, "message": "注册成功",
  "data": { "ok": true, "uid": 18, "sid": "a1b2c3...", "placeholder_email": false }
}

user.login - 用户登录

POST https://open.heicat.com/api/index.php?m=user&a=login
参数类型必填说明
accountstring必填用户名/邮箱/手机号(也接受 username 作为别名)
passwordstring必填密码
rememberstring可选记住登录态(1/0,默认 0)
app_idstring可选SSO 场景下发起授权的应用 ID
captcha_tokenstring可选图形验证码票据(后台开启登录验证码时必填)
captcha_answerstring可选图形验证码答案
{
  "code": 0, "message": "ok",
  "data": { "ok": true, "uid": 18, "username": "zhangsan", "sid": "a1b2c3..." }
}

user.info - 获取用户信息

POST https://open.heicat.com/api/index.php?m=user&a=info

无请求参数,需已登录。

{
  "code": 0, "message": "ok",
  "data": {
    "uid": 18, "username": "zhangsan", "nickname": "张三",
    "email": "z@example.com", "email_bound": true,
    "mobile": "13800000000", "avatar": "https://.../a.png",
    "gender": 0, "gender_text": "未知", "birthday": "", "bio": "",
    "register_text": "2026-09-20 10:00", "last_login_text": "刚刚",
    "last_login_ip": "127.0.0.1", "status": "normal", "status_text": "正常",
    "source": "UCenter"
  }
}

user.security - 账号安全(设备与登录历史)

POST https://open.heicat.com/api/index.php?m=user&a=security

无请求参数。返回 devices(当前在线设备)与 history(最近 50 条登录/退出记录)。

user.logout / user.logoutall - 退出登录

POST https://open.heicat.com/api/index.php?m=user&a=logout
POST https://open.heicat.com/api/index.php?m=user&a=logoutall
参数类型必填说明
sidstring可选仅 logout:指定会话,留空退出当前会话

logoutall 返回 { ok: true, revoked: n },n 为被撤销的会话数。

user.device_kill - 踢掉指定设备

POST https://open.heicat.com/api/index.php?m=user&a=device_kill
参数类型必填说明
sidstring必填目标会话 ID,必须为当前登录用户自己的会话

user.check - 账号唯一性检查

POST https://open.heicat.com/api/index.php?m=user&a=check
参数类型必填说明
fieldstring可选检查字段:username(默认)/ email / mobile
valuestring必填待检查的值
{ "code": 0, "message": "ok", "data": { "ok": true, "available": true, "code": 1, "message": "可以注册" } }

user.password - 修改密码

POST https://open.heicat.com/api/index.php?m=user&a=password
参数类型必填说明
old_passwordstring必填原密码
new_passwordstring必填新密码
confirmstring必填确认新密码

成功后返回 { ok: true, relogin: true },修改后其他设备会被注销。

user.profile - 修改资料

POST https://open.heicat.com/api/index.php?m=user&a=profile
参数类型必填说明
nicknamestring可选昵称
emailstring可选邮箱(变更会同步 UCenter)
mobilestring可选手机号
genderint可选性别(数值)
birthdaystring可选生日
biostring可选个人简介
avatarstring可选头像 URL

user.findpwd_send - 发送找回密码验证码

POST https://open.heicat.com/api/index.php?m=user&a=findpwd_send
参数类型必填说明
targetstring必填已绑定的邮箱或手机号
captcha_tokenstring可选图形验证码票据(开启时必填)
captcha_answerstring可选图形验证码答案

仅在 debug 开启时响应会附带 debug_code 便于本地联调;生产环境请务必关闭 debug。

user.findpwd_reset - 用验证码重置密码

POST https://open.heicat.com/api/index.php?m=user&a=findpwd_reset
参数类型必填说明
targetstring必填接收验证码的邮箱或手机号
codestring必填收到的验证码
new_passwordstring必填新密码
confirmstring必填确认新密码

user.oauth_unbind - 解除第三方绑定

POST https://open.heicat.com/api/index.php?m=user&a=oauth_unbind
参数类型必填说明
providerstring必填平台标识:qq / wechat / baidu / alipay / github / google / microsoft / huawei / xiaomi / hbuilder / weibo

user.deletion_request - 提交账号注销申请

POST https://open.heicat.com/api/index.php?m=user&a=deletion_request
参数类型必填说明
reasonstring可选注销原因(最多 500 字)

提交后进入后台审核,审核通过后账号停用并移入回收站。

API 参考 - 验证码接口

无需登录即可调用。

captcha.issue - 获取验证码

POST https://open.heicat.com/api/index.php?m=captcha&a=issue
参数类型必填说明
stylestring可选slide(滑动拼图)/ click(文字点选)/ icon(图标选择)/ passive(无感验证)/ digits(纯数字)/ mixed(数字+字母);留空取后台 captcha_style 配置,缺省为 slide
// slide 样式
{
  "code": 0, "message": "ok",
  "data": {
    "token": "8f3c...a91d", "style": "slide",
    "bg": "data:image/png;base64,...",     // 背景图(带缺口)
    "piece": "data:image/png;base64,...",  // 待拖动的拼图块
    "mime": "image/png",
    "size": 50, "width": 300, "height": 150,
    "hole_x": 137, "hole_y": 62            // 缺口左边缘坐标,用于定位拼图块
  }
}

// digits / mixed 样式
{
  "code": 0, "message": "ok",
  "data": { "token": "8f3c...a91d", "style": "digits", "image": "data:image/png;base64,...", "mime": "image/png" }
}

滑块对接说明:slider 取值范围为 [0, width],提交值为拼图块左边缘的横坐标; 将拼图块定位到 left = 值 / width × 100%、top = hole_y / height × 100% 即可与缺口对齐, 服务端容差 SLIDE_TOL = 10px。

captcha.verify - 校验验证码

POST https://open.heicat.com/api/index.php?m=captcha&a=verify
参数类型必填说明
tokenstring必填验证码票据(issue 接口返回)
answerstring必填用户输入的验证码答案(滑块为横坐标数字串)

重要:校验通过后该 token 会被标记为 used(一次性)。 因此不要在登录前先调用本接口预校验,否则随后的 user.login / admin.login 会因"验证码已使用"而失败。正确做法是直接把 captcha_token + captcha_answer 随登录请求提交。

API 参考 - 管理接口

权限要求:以下接口需要管理员权限,调用时需携带管理员会话。

鉴权:所有管理接口均需先登录管理后台(携带管理员会话),并具备对应 RBAC 权限点, 权限不足返回 403。角色矩阵:super_admin 全部;admin 为 manage:users/apps/sessions + 全部 view:*; auditor 仅 5 个 view:*(只读)。

admin.user_list - 用户列表

POST https://open.heicat.com/api/index.php?m=admin&a=user_list

权限点:view:users

参数类型必填说明
kwstring可选搜索关键词(用户名/邮箱/手机号)
pageint可选页码,默认 1
sizeint可选每页数量,默认 20
{
  "code": 0, "message": "ok",
  "data": {
    "total": 128,
    "rows": [{ "uid": 18, "username": "zhangsan", "email": "z@example.com", "nickname": "张三",
               "mobile": "13800000000", "gender_text": "未知", "sync_status": 1, "uc_ok": 1 }],
    "page": 1, "size": 20
  }
}

admin.session_list - 会话列表

POST https://open.heicat.com/api/index.php?m=admin&a=session_list

权限点:view:sessions

参数类型必填说明
kwstring可选搜索关键词
pageint可选页码,默认 1
sizeint可选每页数量,默认 20,服务端钳制在 10~50

admin.log_list - 系统日志

POST https://open.heicat.com/api/index.php?m=admin&a=log_list

权限点:view:logs

参数类型必填说明
typestring可选日志类型:login / logout / register / password / profile / sso / api / ucenter / admin / app
levelstring可选级别:info / warn / error
uidint可选按用户 UID 过滤
app_idstring可选按应用 ID 过滤
kwstring可选关键词
page / sizeint可选分页,默认 1 / 20

管理接口速查表(RBAC 权限点)

接口权限点关键参数说明
admin.stats(仅需登录)无控制台概览统计
admin.user_actionmanage:usersuid, act(disable/enable/kick)禁用/启用/踢用户
admin.user_deletemanage:usersuid永久删除用户
admin.app_listview:apps无应用列表(含 app_secret,请妥善保管)
admin.app_savemanage:appsid(0=新增), name, description, home_url, callbacks, status, sso_enabled, app_id新增/编辑应用
admin.app_reset_secretmanage:appsid重置应用密钥
admin.app_toggle / app_delete / app_testmanage:apps / view:appsid[, status]启停 / 删除 / 连通性测试
admin.uc_config / uc_save / uc_test / uc_callmanage:ucenter详见后台 UCenter 配置UCenter 配置、体检与接口调试
admin.uc_notify / uc_notify_save / uc_notify_test / uc_notify_clearmanage:ucenteruc_notify_* 系列UCenter 通知接收配置
admin.oauth_save / oauth_save_globalmanage:systemprovider, enabled, appid, secret, private_key / auto_register第三方登录配置
admin.site_savemanage:systemsite_* 系列(站点名/备案号/联系方式/页脚)站点信息设置
admin.settings / settings_savemanage:systemgroup / data系统配置读写
admin.deletion_listview:usersstatus(pending/all), page注销申请列表
admin.deletion_reviewview:usersid, approve(0/1), remark注销审核(通过则停用并移入回收站)
admin.session_kill / session_kick_usermanage:sessionssid / uid踢指定会话 / 踢某用户全部会话
admin.log_clearmanage:logsdays(默认 90)清理历史日志
admin.uc_callsview:logs无UCenter 调用记录(最近 50 条)
admin.audit_statsview:audit无安全审计概览
admin.admin_list / admin_save / admin_toggle / admin_deletemanage:adminsid, username, password, realname, role, status管理员管理(内置 id=1 不可改角色/禁用/删除)
admin.change_pwd / admin_password(仅需登录)old_password, new_password修改当前管理员密码
admin.totp_status / totp_setup / totp_enable / totp_disable(仅需登录)code(启用/停用时必填)TOTP 二步验证绑定
admin.login / admin_logout无需登录态username, password[, captcha_*, totp_code]后台登录/退出

SDK 下载中心

完整 SDK 压缩包由系统后台统一维护,上传后自动同步到本页面,点击即可下载。

名称版本简介大小更新时间操作
UIC 开放平台完整源码包
UIC_OpenAPI_v1.1.0.zip
v1.1.0 app/public/config/sdk 完整可部署源码 + 文档集 + 可运行示例 1.76 MB 2026-10-15 01:30 下载
UIC SDK 全语言开发包
UIC_SDK_v1.1.0.zip
v1.1.0 PHP/Python/JS/Go/Java/C 客户端 SDK + 示例 0.36 MB 2026-10-15 01:30 下载
UIC SDK(旧版本号包)
UIC_SDK_v1.0.0.zip
v1.0.0 内容与 v1.1.0 一致,建议优先使用 v1.1.0 0.36 MB 2026-10-15 01:30 下载
应用管理模块 SDK 源码
应用管理模块SDK源码.zip
v1.1.0 应用管理 / SSO 接入 SDK(多语言)+ 示例 0.36 MB 2026-10-15 01:30 下载
需要上传新的 SDK 压缩包?联系站点管理员在「后台 → 系统 → SDK 包管理」中上传。

PHP SDK

v1.1.0 稳定版
composer.json UicSdk.php

安装

# 本地集成:将 sdk 目录放入项目,并在 composer.json 中配置:
"repositories": [
    { "type": "path", "url": "./sdk" }
],
"require": { "uic/sdk": "*" }
# 然后执行:composer require uic/sdk

快速开始

<?php
require_once 'vendor/autoload.php';

use UIC\SDK\Client;

$client = new Client([
    'base_url'   => 'http://127.0.0.5',
    'app_id'     => 'your_app_id',
    'app_secret' => 'your_app_secret',
]);

// 获取授权 URL
$authUrl = $client->auth()->getAuthorizeUrl(
    'http://your-app.local/callback',
    bin2hex(random_bytes(16))
);

// 换取 Token(在回调页面执行)
$tokenData = $client->auth()->exchangeToken($_GET['ticket']);

// 获取用户信息
$user = $client->auth()->getUserInfo();
echo "欢迎," . $user['nickname'];
?>

完整功能示例

认证
用户
验证码
// 通信测试
$ok = $client->auth()->testConnect();

// 获取授权 URL
$url = $client->auth()->getAuthorizeUrl($callback, $state);

// 换取 Token
$tokens = $client->auth()->exchangeToken($ticket);

// 获取用户信息
$user = $client->auth()->getUserInfo();

// 单点退出
$client->auth()->logout();
// 用户注册
$user = $client->user()->register([
    'username' => 'newuser',
    'password' => 'Password123',
    'confirm'  => 'Password123',
    'email'    => 'user@example.com',
], true);

// 用户登录
$client->user()->login('username', 'password', true);

// 获取信息
$info = $client->user()->getInfo();

// 修改密码
$client->user()->changePassword('old123', 'new123', 'new123');

// 修改资料
$client->user()->updateProfile(['nickname' => '新昵称']);

// 检查用户名是否可用
$available = $client->user()->checkUnique('username', 'testname');
// 获取验证码
$captcha = $client->captcha()->issue('digits');
echo "Token: " . $captcha['token'];

// 校验验证码
$ok = $client->captcha()->verify($captcha['token'], '1234');

JavaScript SDK

v1.0.0 Beta
package.json

安装

# 本地使用:将 sdk/js 目录放入项目,或通过 npm link 引入
npm install ./sdk/js
# 或
yarn add ./sdk/js

浏览器环境

引入方式:SDK 文件不在站点公开目录下,不能直接用 /sdk/js/dist/uic-sdk.js 引用。 请从下方「SDK 下载」获取 js/dist/uic-sdk.js 后自行托管,再按实际路径引入:

<!-- 自托管后按实际路径引入 -->
<script src="/your-static/uic-sdk.js"></script>
<script>
const client = new UIC.Client({
    baseUrl: 'https://open.heicat.com',
    appId: 'your_app_id',
    appSecret: 'your_app_secret' // 仅限服务端使用
});

// 跳转到授权页(同步返回 URL 字符串)
const url = client.auth.getAuthorizeUrl('http://your-app.local/callback');
window.location.href = url;
</script>

Node.js 环境

const { Client } = require('uic-sdk');

const client = new Client({
    baseUrl: 'https://open.heicat.com',
    appId: 'your_app_id',
    appSecret: 'your_app_secret'
});

async function main() {
    // 换取 Token
    const tokens = await client.auth.exchangeToken(req.query.ticket);

    // 获取用户信息
    const user = await client.auth.getUserInfo(tokens.token);
    console.log(user);
}

main();

安全提示:浏览器环境中请勿暴露 AppSecret,授权回调处理应在服务端完成。

Python SDK

v1.0.0 Beta
setup.py

安装

pip install uic-sdk

同步调用

from uic_sdk import Client

client = Client(
    base_url='http://127.0.0.5',
    app_id='your_app_id',
    app_secret='your_app_secret'
)

# 获取授权 URL
auth_url = client.auth.get_authorize_url(
    callback='http://your-app.local/callback',
    state='random_state_string'
)

# 换取 Token
tokens = client.auth.exchange_ticket(ticket='ticket_from_callback')

# 获取用户信息
user = client.auth.get_user_info(token=tokens['token'])
print(f"欢迎,{user['nickname']}")

异步调用(asyncio)

import asyncio
from uic_sdk import AsyncClient

async def main():
    client = AsyncClient(
        base_url='https://open.heicat.com',
        app_id='your_app_id',
        app_secret='your_app_secret'
    )
    try:
        # 换取 Token
        tokens = await client.auth.exchange_ticket('ticket_from_callback')

        # 获取用户信息
        user = await client.auth.get_user_info(token=tokens['token'])
        print(user)
    finally:
        await client.close()  # 关闭底层连接池

asyncio.run(main())

Flask 集成示例

from flask import Flask, request, redirect
from uic_sdk import Client

app = Flask(__name__)
client = Client(base_url='...', app_id='...', app_secret='...')

@app.route('/login')
def login():
    url = client.auth.get_authorize_url('http://your-app.local/callback')
    return redirect(url)

@app.route('/callback')
def callback():
    ticket = request.args.get('ticket')
    tokens = client.auth.exchange_ticket(ticket)
    session['token'] = tokens['token']
    return '登录成功'

Go SDK

v1.0.0 Beta
go.mod

安装

# 方式一:本地集成(推荐,SDK 无外部依赖,仅用标准库)
# 将 sdk/go 目录复制到项目,在 go.mod 中引用:
replace github.com/uic/sdk-go => ./sdk/go

# 方式二:复制源码后直接作为本地包使用(demo 目录即此方式)
go run ./demo

快速开始

package main

import (
    "context"
    "fmt"
    "log"
    "time"

    uicsdk "github.com/uic/sdk-go"
)

func main() {
    // 初始化客户端(选项式配置:超时 / 日志 / 重试 / context)
    client := uicsdk.NewClient(
        "https://open.heicat.com",
        uicsdk.WithTimeout(10*time.Second),
        uicsdk.WithRetry(3, 100*time.Millisecond, 2*time.Second),
        uicsdk.WithContext(context.Background()),
    )
    client.SetAppCredentials("your_app_id", "your_app_secret")

    // 获取授权 URL
    authURL := client.AuthorizeURL("your_app_id", "http://your-app.local/callback")
    fmt.Println("授权URL:", authURL)

    // 换取 Token(在服务端回调中执行)
    tokens, err := client.Exchange("ticket_from_callback", "", "")
    if err != nil {
        log.Fatal(err)
    }

    // 获取用户信息
    user, err := client.Userinfo(tokens["token"].(string), "")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("欢迎,%s\n", user["nickname"])
}

Gin 框架集成

package main

import (
    "net/http"
    "time"

    "github.com/gin-gonic/gin"
    uicsdk "github.com/uic/sdk-go"
)

func main() {
    r := gin.Default()
    client := uicsdk.NewClient(
        "https://open.heicat.com",
        uicsdk.WithTimeout(10*time.Second),
        uicsdk.WithRetry(3, 100*time.Millisecond, 2*time.Second),
    )
    client.SetAppCredentials("your_app_id", "your_app_secret")

    r.GET("/login", func(c *gin.Context) {
        url := client.AuthorizeURL("your_app_id", "http://your-app.local/callback")
        c.Redirect(http.StatusFound, url)
    })

    r.GET("/callback", func(c *gin.Context) {
        ticket := c.Query("ticket")
        tokens, err := client.Exchange(ticket, "", "")
        if err != nil {
            c.JSON(400, gin.H{"error": err.Error()})
            return
        }
        c.JSON(200, tokens)
    })

    r.Run(":8080")
}

错误码表

重要约定:本平台所有接口的 HTTP 状态码恒为 200(含业务错误), 真正的成功/失败请判断响应体中的 code 字段。code = 0 即成功,非 0 为业务错误。 请勿用 HTTP 状态码判断业务结果。

业务码含义处理建议
0成功正常处理 data
1通用业务失败直接展示 message 给使用者;未显式指定码的错误均返回 1
400请求参数错误 / 业务前置条件不满足检查参数与业务状态(如重复申请注销)
401未登录、会话过期或 Token 无效引导用户重新登录或重新授权
403权限不足,或被 IP 访问策略拒绝检查管理员角色权限点 / 服务器出口 IP 白名单
404接口不存在,或目标资源不存在检查 m/a 路径,或账号是否已被 UCenter 删除
406图形验证码错误 / 已失效 / 已使用 / 尝试次数过多重新调用 captcha.issue 获取新验证码
500服务端内部错误记录 message 并联系技术支持
501UCenter 未实现该接口多见于用户删除,需升级 UCenter 服务端

UCenter / 业务子码(出现在 data.code 或 message 中)

子码含义处理建议
-1用户名/密码不合法,或用户不存在校验输入
-2包含不允许注册的词语,或密码错误更换用户名 / 核对密码
-3用户名已被占用换一个用户名
-4Email 格式有误校验邮箱格式
-6Email 已被注册换邮箱或直接登录
-7未做修改 / 接口未实现属正常,无需处理
-8该用户受保护,无权限更改联系管理员

通用响应格式

// 成功(message 成功时默认为 "ok")
{
  "code": 0,
  "message": "ok",
  "data": { ... },
  "time": 1789878021
}

// 错误(HTTP 状态码仍为 200)
{
  "code": 401,
  "message": "请先登录",
  "data": null,
  "time": 1789878021
}

高级功能:重试 · 批量 · 连接池

SDK v1.1.0 起内置生产可用级的容错能力。各语言实现程度如下:

能力PHPJavaScriptPythonGo
指数退避重试✔ 可配置——✔ 可配置
批量操作✔ batchInfo / batchRegister———
连接池 / 会话复用—(curl 复用)—✔(Session / aiohttp 池)✔(MaxIdleConns)
超时控制✔✔(AbortSignal)✔✔(WithTimeout / context)
取消上下文———✔(WithContext)

① PHP SDK:配置指数退避重试

// 创建客户端时传入重试配置(默认关闭)
$client = new UIC\SDK\Client([
    'base_url'   => 'https://open.heicat.com',
    'app_id'     => 'your_app_id',
    'app_secret' => 'your_app_secret',
    // 重试策略:false 关闭(默认);数组开启
    'retry' => [
        'max_retries'   => 3,   // 最大重试次数
        'base_delay_ms' => 100, // 初始退避 100ms(指数增长)
        'max_delay_ms'  => 5000,// 最大退避 5s
    ],
]);

// 仅对可重试错误重试:网络错误、HTTP 429/500/502/503/504
// 业务错误码(如 401 参数错误)不会重试,避免无效放大请求量

② PHP SDK:批量操作(单条失败不中断)

// 批量查询多个 Token 对应的用户信息
$result = $client->user()->batchInfo(
    ['token_a', 'token_b', 'token_c'],
    5 // 并发数,默认 5
);
foreach ($result['items'] as $item) {
    if (!empty($item['_error'])) {
        echo "失败: " . $item['_error'] . "\n";
    } else {
        echo $item['user']['nickname'] . "\n";
    }
}

// 批量注册用户
$result = $client->user()->batchRegister([
    ['username' => 'u1', 'password' => 'Passw0rd!', 'confirm' => 'Passw0rd!'],
    ['username' => 'u2', 'password' => 'Passw0rd!', 'confirm' => 'Passw0rd!'],
]);
echo "成功 {$result['ok']} 条,失败 {$result['fail']} 条";

③ Go SDK:重试 + context 取消 + 连接池

client := uicsdk.NewClient(
    "https://open.heicat.com",
    uicsdk.WithTimeout(10*time.Second),
    uicsdk.WithRetry(3, 100*time.Millisecond, 2*time.Second), // 指数退避 + 抖动
    uicsdk.WithContext(ctx),  // 全局取消上下文,传入即生效
)
// 连接池:默认 MaxIdleConns=100、MaxIdleConnsPerHost=10,自动复用 keep-alive 连接

④ 调用建议

  • 重试只用于幂等操作:查询、开通类接口可安全重试;注册、转账等写操作失败后请核对是否已生效,避免重复提交。
  • 限流:服务端当前仅在「登录失败锁定」「短信发送频率」「IP 访问策略」三处做限制,尚未提供全局 QPS 限流,不会返回 429;公网部署建议在网关层(Nginx / WAF)自行补充。
  • 批量操作建议:单批建议 50 条以内;大量导入请拆批并做好失败记录(_error 字段)。
  • 连接池注意:Python 同步客户端使用 requests.Session 复用连接,程序退出前无需特殊处理;异步客户端使用完请 await client.close()。

常见问题

Q1: 如何获取 AppID 和 AppSecret?

登录管理后台,进入「应用管理」模块,点击「创建应用」即可获得。每个应用对应一套独立的凭证。

Q2: 回调地址可以配置多个吗?

可以。应用支持配置多个回调地址(后台「应用管理」中以英文逗号或换行分隔), 授权时传入的 redirect 必须在白名单内,否则会被拒绝。开发/测试/生产多环境直接配多条即可,无需创建多个应用。 应用还支持 ip_whitelist 限制回调来源。

Q3: Token 有效期多长?如何刷新?

Access Token 有效期由后台 sso.token_ttl 配置,默认 604800 秒(7 天)。 当前版本不支持 Refresh Token,过期后需重新引导用户授权换取新的 Token。

Q4: 支持哪些部署环境?

PHP SDK 支持 PHP 7.4+,其他语言 SDK 支持对应语言的主流版本。服务端需开启 ext-json 和 ext-curl 扩展。

Q5: 本地开发如何测试?

建议在本地 hosts 中配置域名(如 uic.local),或使用 127.0.0.5 作为开发地址。确保回调地址与配置一致。

Q6: 生产环境安全注意事项?

1) 务必启用 HTTPS;2) AppSecret 存储在服务端环境变量;3) 定期轮换 AppSecret;4) 开启 IP 白名单限制。

更新日志

v1.1.0 (2026-09-20)

  • PHP SDK:新增指数退避重试机制(config.retry 可配置,默认关闭)
  • PHP SDK:新增批量操作 batchInfo() / batchRegister(),单条失败不中断
  • Go SDK:新增 WithRetry(重试+抖动)、WithContext(取消控制)、WithTimeout
  • Go SDK:默认启用 HTTP 连接池(MaxIdleConns=100 / MaxIdleConnsPerHost=10)
  • Go SDK:补齐用户接口与验证码接口(register/login/info/password/check/captcha)
  • Python SDK:AsyncClient 子客户端(auth/user/captcha)实现真正的异步调用,支持连接池复用
  • JavaScript SDK:浏览器 UMD 包 + Node.js CJS 双环境支持
  • 新增 PHPUnit 单元测试(30 tests / 69 assertions)、JS 冒烟测试、Python pytest 测试
  • 开放文档页面上线:多语言 SDK 切换、错误码表、快速接入指南、高级功能说明

v1.0.0 (2026-09-20)

  • 初始版本发布
  • 支持 SSO 单点登录(OAuth2.0 简化模式)
  • 支持用户注册、登录、改密、资料管理
  • 支持图形验证码(滑块/数字/混合)
  • 提供 PHP、JavaScript、Python、Go 四种语言 SDK

v1.2.0 (2026-09-21)

  • 文档与实现对齐:修正管理接口参数名(user_list 改为 kw/page/size,log_list 改为 type/level/uid/app_id/kw/page/size,session_list size 钳制 10~50)
  • 修正 sso.exchange 响应示例:移除未实现的 refresh_token 字段
  • 补齐用户接口文档:security / logout / logoutall / device_kill / check / oauth_unbind / deletion_request
  • 补齐 SSO 文档:authorize 跳转语义、test / userinfo / logout 参数与响应示例
  • 新增管理接口 RBAC 权限点速查表(30+ 接口)
  • 错误码表重构:明确「HTTP 恒为 200、业务码在 code 字段」,移除未实现的 429 / 503,补充业务子码 -1~-8
  • 补充滑块验证码对接说明(hole_x/hole_y 定位、容差 10px)与「校验即作废」注意事项
  • 修正 FAQ:回调地址支持多个(原描述为仅单个,与实现不符)

路线图

  • v1.2.0 - Refresh Token 自动刷新机制
  • v1.3.0 - WebHook 事件通知
  • v1.4.0 - JS/Python SDK 增加重试与批量能力
  • v2.0.0 - OAuth2.0 授权码模式