/ API 文档 返回首页

API 参考文档

本文档涵盖所有对外开放的 REST API,包括 OAuth 2.0 授权、微信扫码登录、密码管理、消息推送等。所有接口均基于 HTTPS,返回 JSON 格式。

认证方式

不同接口使用不同的认证组合,共有三种凭证:

凭证Header适用接口
API KeyX-API-Key: <api_key>用户管理、消息推送、OAuth 授权 URL 等
签名X-Signature / X-TimestampOAuth Token 端点、注册、密码重置等
BearerAuthorization: Bearer <token>用户信息、修改密码、退出登录等
ℹ️标注 PUBLIC 的接口无需任何认证(如回调、确认页、健康检查)。
签名算法

使用 HMAC-SHA256 对每次请求进行签名,防止请求被篡改,有效期 5 分钟(防重放)。

⚠️签名参数只能通过 Header 传递,禁止放在 URL 查询参数中(防泄露)。
签名步骤
1
获取时间戳
time()
2
Body 参数
按 key 排序后
JSON 序列化
3
拼接内容
appId+ts+body
4
HMAC-SHA256
用 api_secret
计算摘要
5
放入 Header
X-Signature
PHP
// 签名生成示例
$timestamp = time();
$params    = ['username' => 'alice', 'password' => 'secret'];
ksort($params);
$body      = json_encode($params, JSON_UNESCAPED_UNICODE);
$content   = $appId . $timestamp . $body;
$signature = hash_hmac('sha256', $content, $apiSecret);

// 请求 Header
'X-API-Key':   $appId
'X-Timestamp': $timestamp
'X-Signature': $signature
'Content-Type': 'application/json'
PHP SDK · 安装与初始化

官方 PHP SDK 封装了签名、Token 验证、微信扫码等全部细节,推荐服务端接入时使用。PHP ≥ 7.4,仅依赖 ext-curlext-json,无框架依赖。

安装
Bash
# Composer 安装
composer require uuuz/uuauth

# 或手动引入
require_once __DIR__ . '/sdk/src/autoload.php';
初始化
PHP
use uuuz\Client;

$client = new Client([
    'api_url'    => 'https://auth.example.com',  // 服务地址,末尾无斜杠
    'api_key'    => 'your_api_key',              // API Key(必填)
    'api_secret' => 'your_api_secret',           // 用于签名(必填)
    'jwt_secret' => 'your_jwt_secret',           // 本地验证 Token(可选)
    'timeout'    => 30,
    'ssl_verify' => true,
]);
参数必填说明
api_url必填服务器地址,不带末尾斜杠
api_key必填在管理后台「API Keys」页面创建
api_secret必填用于 HMAC 请求签名
jwt_secret可选配置后可本地验证 Token,无需网络请求
timeout可选HTTP 超时(秒),默认 30
ssl_verify可选默认 true;测试环境可设 false
⚠️api_keyapi_secret 为空时构造函数抛出 \InvalidArgumentException。签名、时间戳等细节由 SDK 内部自动处理。
PHP SDK · 登录认证
SDK$client->passwordLogin() 密码登录

用户名/邮箱/手机号 + 密码登录,失败抛出 RuntimeException

PHP
try {
    $token = $client->passwordLogin('username', 'password123');

    $token['access_token'];   // JWT 访问令牌(2 小时有效)
    $token['refresh_token'];  // 刷新令牌(7 天有效)
    $token['expires_in'];     // 有效期秒数(7200)
    $token['user'];           // 用户信息数组
} catch (\RuntimeException $e) {
    echo '登录失败: ' . $e->getMessage();
}
SDK$client->register() 用户注册
PHP
$client->register([
    'username' => 'new_user',
    'password' => 'Password123',
    'email'    => 'user@example.com',  // 可选
    'phone'    => '13800138000',       // 可选
]);
SDK$client->refreshToken() / logout() 刷新 Token / 退出登录
PHP
// 刷新 Token(refresh_token 每次刷新轮转)
$newToken = $client->refreshToken($refreshToken);

// 退出登录(撤销该用户所有 Refresh Token)
$client->logout($accessToken);
PHP SDK · 微信扫码登录

获取授权 URL 后按环境分流:微信内静默授权,PC 展示扫码确认页。

SDK$client->getAuthUrl() 1. 获取授权 URL
PHP
$authInfo = $client->getAuthUrl(
    'https://your-app.com/callback',  // 回调地址(参数名 redirect_url)
    'snsapi_userinfo',                // snsapi_userinfo 或 snsapi_base
    'custom_state',                   // 自定义 state(可选)
    'login'                            // 场景:login / bind / password_reset
);

$authInfo['session_id'];   // 会话 ID,用于轮询状态
$authInfo['auth_url'];     // 微信内 + snsapi_base:直接静默 OAuth
$authInfo['confirm_url'];  // PC / 非微信:展示扫码确认页
地址选择:微信内浏览器且 scope=snsapi_base 时跳转 auth_url;PC 和非微信浏览器使用 confirm_url,扫码完成后确认页显示“关闭页面”完成态并停止轮询。旧授权中心返回空 auth_url 时应升级授权中心,不要在微信内降级到人工确认页。
场景授权成功后
login签发 Token,data.token 含完整令牌
bind仅返回一次性 bind_session_id,需调用 bindWechatSession
password_reset仅返回 openid,需调用 resetPasswordByQrcode
SDK$client->queryAuthStatus() 2. 轮询授权状态
PHP
$status = $client->queryAuthStatus($sessionId);
// status: "pending" | "authorized" | "expired"

if ($status['status'] === 'authorized') {
    $accessToken = $status['data']['token']['access_token'];

    // 首次微信登录,需设置用户名
    if ($status['data']['account_setup_required'] ?? false) {
        $client->setupAccount('my_username', null, $accessToken);
    }
}
SDK$client->handleCallback() 3. 处理回调(含签名验证)

微信授权后跳转 redirect_url?code=xxx&state=xxxhandleCallback() 自动验证签名并换取 Token(本地 HMAC 计算,防重放 10 分钟)。

PHP
// 自动验证签名 + 换 Token(推荐)
$tokenData = $client->handleCallback($_GET);

// 或仅换码
$tokenData = $client->exchangeCode($_GET['code']);
SDK$client->bindWechatSession() / unbindWechat() 绑定 / 解绑微信
PHP
// bind 场景扫码授权后
$client->bindWechatSession($accessToken, $status['data']['bind_session_id']);

// 解绑
$client->unbindWechat($accessToken);
PHP SDK · Token 验证
SDK$client->validateToken() 本地 / 远程验证 Access Token

本地验证无网络请求(需配置 jwt_secret);远程验证可检测 Token 是否已被吊销。未配置 jwt_secret 时自动降级为远程验证。

PHP
// 本地验证(无网络请求,需 jwt_secret)
$result = $client->validateToken($accessToken);
// ['valid' => true, 'user_id' => 1, 'exp' => ..., 'jti' => 'xxx']

// 远程验证(可检查是否已被吊销)
$result = $client->validateToken($accessToken, true);
// ['active' => true, 'valid' => true, 'openid' => 'xxx', ...]
💡Access Token 无状态,2 小时内有效;logout() 只吊销 Refresh Token。需实时拦截已退出用户,请用 validateToken($token, true) 远程验证。
PHP SDK · 消息推送
SDK$client->sendTemplateMessage() 发送模板消息
PHP
$client->sendTemplateMessage(
    'user_openid',
    'wx_template_id_xxx',   // 微信模板 ID(与 template_key 二选一)
    [
        'first'    => ['value' => '您的订单已发货', 'color' => '#173177'],
        'keyword1' => ['value' => 'P123456789',   'color' => '#173177'],
        'remark'   => ['value' => '感谢您的支持!', 'color' => '#576B95'],
    ],
    'https://your-app.com/order/123',  // 跳转链接(可选)
    'order_notify'                      // 本地模板别名(可选)
);
SDK$client->batchSendTemplateMessages() 批量发送(最多 1000 个)
PHP
$client->batchSendTemplateMessages(
    ['openid_1', 'openid_2'],
    '',  // template_id 留空则用 template_key
    ['first' => ['value' => '活动提醒', 'color' => '#173177']],
    'https://your-app.com/activity',
    'activity_remind'
);
// ['data' => ['total' => 2, 'success' => 2, 'failed' => 0]]
SDK$client->getTemplateList() / getPushStats() 模板列表 / 推送统计
PHP
$client->getTemplateList();          // 模板列表(5 分钟缓存)
$client->getTemplate('order_notify');  // 按别名获取单个
$client->getPushStats(7);           // 最近 N 天推送统计
PHP SDK · 方法速查

主客户端方法失败时直接抛出 RuntimeException;需要统一格式 {code, msg, data} 返回时用子客户端 $client->oauth()

分类方法说明
登录认证passwordLogin / register / refreshToken / logout密码登录、注册、刷新、退出
微信扫码getAuthUrl / queryAuthStatus / exchangeCode / handleCallback授权 URL、轮询、换码、回调
微信绑定bindWechat / unbindWechat绑定、解绑
TokenvalidateToken / verifyCallbackSign本地/远程验证、回调验签
账号setupAccount / setPassword / updateContact / getCurrentUserInfo初始化、设密码、联系方式、用户信息
密码changePassword / resetPasswordByQrcode / requestResetToken / resetPasswordByToken改密、扫码/令牌重置
消息sendTemplateMessage / batchSendTemplateMessages / getPushStats发送、批量、统计
模板getTemplateList / getTemplate列表、单个
用户getUserList / getUser / syncUsers列表、详情、同步
V2 端点v2GetUsers / v2SendMessage / v2GetTemplates …RESTful 风格接口
ℹ️查看 SDK 版本:echo \uuuz\Client::version(); 错误响应描述字段为 message(不是 msg)。
获取 Token(POST /oauth/token)

统一 Token 签发端点,通过 grant_type 区分登录方式。需要 API Key + 签名认证。

POST/oauth/token 密码登录 grant_type=password
API Key签名

用户名/邮箱/手机号 + 密码登录,返回 Access Token 和 Refresh Token。连续失败触发账号和 IP 级节流锁定。

请求 Body(JSON)
字段类型必须说明
grant_typestring必须固定值 password
usernamestring必须用户名、邮箱或 11 位手机号
passwordstring必须登录密码
Response 200
{
  "access_token":  "eyJhbGci...",
  "token_type":    "Bearer",
  "expires_in":    7200,
  "refresh_token": "eyJhbGci...",
  "user": { "id": 1, "username": "alice", "has_wechat": true }
}
POST/oauth/token 微信授权码换 Token grant_type=wechat
API Key签名

前端轮询 /api/v1/oauth/status/{session_id} 获得 code 后,调用本接口换取 JWT。授权码一次性,5 分钟内有效,且只能用于 wechat grant。

请求 Body(JSON)
字段类型必须说明
grant_typestring必须固定值 wechat
codestring必须轮询接口返回的授权码
POST/oauth/token 刷新 Token grant_type=refresh_token
API Key签名

用 Refresh Token 换取新的 Token 对(旧 Token 立即失效)。系统内置 Token Reuse 检测,一旦发现重放攻击,强制用户所有设备退出。

请求 Body(JSON)
字段类型必须说明
grant_typestring必须固定值 refresh_token
refresh_tokenstring必须上次签发的 Refresh Token
POST/oauth/token 客户端凭证 grant_type=client_credentials
API Key签名

服务端到服务端调用,不关联具体用户,返回应用级 Access Token。

请求 Body(JSON)
字段类型必须说明
grant_typestring必须固定值 client_credentials
scopestring可选权限范围
Token 验证
POST/oauth/token/introspection 远程验证 Token(RFC 7662)
API Key

验证任意 Access Token 是否有效,返回 Token 中的用户信息和有效期。可用于资源服务器在不持有 jwt_secret 的情况下验证 Token。

请求 Body(JSON)
字段类型必须说明
tokenstring必须待验证的 Access Token
Response 200
{
  "code": 200,
  "data": {
    "active": true,
    "openid": "oXxx...",
    "user_info": { "id": 1, "username": "alice" },
    "exp": 1753055200,
    "scope": "snsapi_userinfo",
    "token_type": "Bearer"
  }
}
微信扫码授权 URL

授权地址按环境分流:微信内以 snsapi_base 静默授权;PC 和非微信浏览器展示扫码确认页。

1
POST
authorize-url
2
微信:auth_url
PC:confirm_url
3
用户微信
扫码确认
4
轮询
GET /status
5
POST /token
grant=wechat
POST/api/v1/oauth/authorize-url 获取微信扫码授权 URL
API Key签名

创建授权会话,返回 auth_url(微信内 snsapi_base 静默授权)、confirm_url(PC 扫码确认页)和 session_id(用于轮询状态)。

请求 Body(JSON)
字段类型必须说明
scenestring可选login / bind / password_reset,默认 login
redirect_urlstring可选授权成功后的回调地址,不传则使用产品默认配置
scopestring可选snsapi_userinfo(默认)或 snsapi_base
statestring可选自定义状态参数,原样回传到 redirect_url
Response 200
{
  "code": 200,
  "data": {
    "session_id":  "a3f8e2...",
    "confirm_url": "https://your-domain/auth/confirm/a3f8e2...",
    "auth_url":    "https://open.weixin.qq.com/connect/oauth2/authorize?...",
    "expires_in":  180,
    "scene":       "login"
  }
}
💡微信内浏览器且 scope=snsapi_base 时直接跳转 auth_url;PC 和非微信浏览器将 confirm_url 渲染成二维码。旧授权中心返回空 auth_url 时应升级授权中心,二维码有效期 3 分钟。
轮询授权状态
GET/api/v1/oauth/status/{session_id} 查询扫码授权结果
API Key签名

建议每 1.5 秒轮询一次,直至状态变为 authorizedexpired。授权成功时直接返回 Token,无需再调 /oauth/token

响应 data.status 含义
状态说明
pending等待用户扫码
authorized已授权,login 场景下 data.token 直接返回 JWT
expired会话过期,需重新获取授权 URL
Response 200(login 场景授权成功)
{
  "code": 200,
  "data": {
    "status": "authorized",
    "data": {
      "openid": "oXxx...",
      "token": {
        "access_token": "eyJ...",
        "expires_in": 7200,
        "user": { "id": 1, "username": "alice" }
      }
    }
  }
}
注册账号
POST/oauth/register 创建本地账号
API Key签名

创建本地账号,密码需符合强度要求(≥8 位,含大小写字母和数字)。注册成功后直接返回 Token 对,无需再次登录。

请求 Body(JSON)
字段类型必须说明
passwordstring必须密码(≥8 位,须含大小写字母和数字)
emailstring可选邮箱(唯一)
phonestring可选手机号(11 位,唯一)
nicknamestring可选昵称
openidstring可选同步绑定微信 openid
用户信息
GET/api/v1/oauth/userinfo 获取当前用户信息
Bearer

返回当前 Token 对应的用户信息(手机号已脱敏为 138****5678)。

Response 200
{ "id": 1, "nickname": "Alice",
  "email": "alice@example.com", "phone": "138****5678",
  "has_wechat": true, "openid": "oXxx...",
  "account_setup_required": false }
退出登录
POST/api/v1/oauth/logout 撤销所有设备 Token
Bearer

撤销当前用户所有 Refresh Token,所有设备同步退出。无请求 Body。Access Token 因 JWT 无状态不会立即失效,但到期后不可刷新。

账号初始化

微信扫码登录的新用户默认没有手机号/邮箱和密码,需通过以下接口完成初始化。

POST/api/v1/oauth/account-setup 补全手机号或邮箱并设置密码
Bearer

仅允许 account_setup_required=true 的用户调用,至少提供一个已验证手机号或邮箱,并同时设置密码。

请求 Body(JSON)
字段类型必须说明
phonestring至少一个已验证手机号
emailstring至少一个已验证邮箱
passwordstring必须设置登录密码
PUT/api/v1/oauth/set-password 设置初始密码(仅无密码账号)
Bearer

仅限未设置过密码的账号(如纯微信登录用户)。已有密码请用修改密码接口。

请求 Body(JSON)
字段类型必须说明
passwordstring必须≥8 位,须含大小写字母和数字
更新联系方式
PUT/api/v1/oauth/contact 更新手机号 / 邮箱
Bearer

产品端自行验证手机/邮箱归属后调用本接口写入。传空字符串清空该字段,phone/email 至少传其中一个。

请求 Body(JSON)
字段类型必须说明
phonestring可选手机号(传 "" 清空)
emailstring可选邮箱(传 "" 清空)
修改密码
PUT/api/v1/oauth/password/change 验证旧密码后修改
Bearer

验证旧密码后修改为新密码。修改成功后强制所有设备退出,需重新登录。

请求 Body(JSON)
字段类型必须说明
old_passwordstring必须当前密码
new_passwordstring必须新密码(≥8 位,须含大小写字母和数字,不能与旧密码相同)
申请重置令牌
POST/oauth/password/reset-token 产品担保方式生成重置令牌
API Key签名

由产品端担保用户身份后申请重置令牌,返回一次性令牌(默认 5 分钟有效)。防枚举:用户名不存在也返回成功。同一用户名每小时最多申请 3 次。

请求 Body(JSON)
字段类型必须说明
usernamestring必须用户名 / 邮箱 / 手机号
Response 200
{ "code": 200,
  "data": { "reset_token": "uuuz_rst_xxx...", "expires_in": 300 } }
令牌重置密码
POST/oauth/password/reset-by-token 用重置令牌设置新密码
API Key签名

使用申请到的 reset_token 重置密码。令牌一次性使用,且必须与申请时的应用一致。成功后强制所有设备退出。

请求 Body(JSON)
字段类型必须说明
reset_tokenstring必须申请重置令牌返回的 token
new_passwordstring必须新密码(≥8 位,须含大小写字母和数字)
扫码重置密码
POST/oauth/password/reset-by-qrcode 微信扫码验证后重置密码
API Key签名

用户通过 scene=password_reset 扫码验证身份(轮询获得 openid)后,用 session_id + 新密码重置。要求该微信已绑定账号。

请求 Body(JSON)
字段类型必须说明
session_idstring必须扫码会话 ID
openidstring必须扫码得到的 openid
new_passwordstring必须新密码(≥8 位,须含大小写字母和数字)
微信绑定
POST/api/v1/oauth/wechat/bind 为当前账号绑定微信
API KeyBearer

已登录用户通过 scene=bind 扫码获得 openid 后,调用本接口完成绑定。一个微信只能绑定一个账号。

请求 Body(JSON)
字段类型必须说明
openidstring必须扫码得到的 openid
解绑微信
DELETE/api/v1/oauth/wechat/bind 解除当前账号的微信绑定
API KeyBearer

解除当前用户绑定的微信。无请求 Body。

微信用户列表
GET/api/v1/user/list 分页获取微信用户
API Key签名

分页返回微信公众号用户列表。

Query 参数
字段类型必须说明
pageint可选页码,默认 1
limitint可选每页数量,默认 20
GET/api/v1/user/stats 用户统计
API Key签名

返回用户总数、已关注/已取关、绑定本地账号数等聚合统计。

微信用户详情
GET/api/v1/user/{openid} 获取单个用户详情
API Key签名

根据 openid 返回单个微信用户的详细信息。

同步微信用户
POST/api/v1/user/sync 从微信拉取用户列表
API Key签名

从微信服务器拉取公众号关注者列表并同步到本地数据库。

批量获取用户
POST/api/v1/user/batch 按 openid 列表批量获取
API Key签名

根据 openid 数组批量获取用户信息,单次最多 100 个。

请求 Body(JSON)
字段类型必须说明
openidsarray必须openid 字符串数组(最多 100)
发送模板消息
POST/api/v1/message/send 发送单条模板消息
API Key签名

向指定 openid 发送微信模板消息。可用 template_id(微信模板 ID)或 template_key(本地模板别名)。

请求 Body(JSON)
字段类型必须说明
openidstring必须接收者 openid
template_keystring必须模板标识(或 template_id)
dataobject必须模板变量键值对
urlstring可选点击消息跳转地址
批量发送消息
POST/api/v1/message/batch-send 批量发送模板消息
API Key签名

向多个 openid 批量发送模板消息,支持异步队列处理。

请求 Body(JSON)
字段类型必须说明
openidsarray必须接收者 openid 数组
template_keystring必须模板标识
dataobject必须模板变量键值对
模板列表
GET/api/v1/template/list 获取可用模板列表
API Key签名

返回所有已启用的消息模板及其字段配置。

GET/api/v1/template/{templateKey} 获取单个模板详情
API Key签名

根据模板标识返回模板详情和字段定义。

系统接口
GET/api/v1/oauth/options 获取系统配置
API Key

返回产品配置、支持的场景和 scope。

GET/health 健康检查
PUBLIC

返回 Redis、MySQL、磁盘状态。HTTP 200=健康,503=不健康。

GET/.well-known/openid-configuration OIDC Discovery
PUBLIC

返回 OIDC 元数据(authorization_endpoint、token_endpoint 等)。

📚 完整的密码管理、微信绑定、用户管理和消息推送接口请参考 config/route.php 或联系管理员。