🔗 第三方接入指南

版本 1.0.0 · 2026-04-23

🚀 快速开始(3步完成接入)

第一步:申请应用

  1. 联系 PTTWebServer 管理员申请接入
  2. 提供:应用名称、应用官网 URL、回调地址
  3. 审核通过后获得:Client ID + Client Secret

第二步:选择接入模式

模式说明适用场景
客户端凭证服务器间直接调用批量查询、设备验证
授权码用户扫码授权绑定需要关联用户身份

第三步:集成代码

// 引入 SDK
require_once 'PTTSDK.php';

// 初始化
$sdk = new PTTSDK('your_client_id', 'your_client_secret', 'https://ptt-server.com');

// 调用接口
$result = $sdk->getUserInfo($access_token);

📚 接口列表

接口方法说明认证
/tokenPOST获取访问令牌
/userinfoGET获取用户信息Bearer Token
/verifyGET验证令牌有效性Bearer Token
/revokePOST撤销授权Bearer Token
/healthGET健康检查

🔑 接口详解

1. 获取访问令牌

POST /api/oauth/token

// 请求体
{
    "client_id": "app_abc123",
    "client_secret": "xxx",
    "grant_type": "client_credentials"
}

// 响应
{
    "code": 200,
    "data": {
        "access_token": "eyJhbGci...",
        "expires_in": 7200,
        "refresh_token": "rt_xxx..."
    }
}
⚠️ Access Token 有效期 2 小时,过期后用 Refresh Token 刷新

2. 获取用户信息

GET /api/oauth/userinfo

Headers: Authorization: Bearer {access_token}

{
    "code": 200,
    "data": {
        "union_id": "HAM_abc123",
        "callsign": "BG4UJJ",
        "dmr_id": "1234567",
        "email": "user@example.com",
        "quota_total": 10,
        "quota_used": 3
    }
}

3. 验证 Token

GET /api/oauth/verify

{
    "code": 200,
    "data": {
        "valid": true,
        "union_id": "HAM_abc123",
        "expires_in": 3600
    }
}

4. 撤销授权

POST /api/oauth/revoke

{
    "code": 200,
    "message": "撤销成功"
}

💻 PHP SDK(直接可用)

/** PTTWebServer OAuth SDK */
class PTTSDK {
    private $client_id, $client_secret, $base_url;
    
    public function __construct($client_id, $client_secret, $base_url) {
        $this->client_id = $client_id;
        $this->client_secret = $client_secret;
        $this->base_url = rtrim($base_url, '/');
    }
    
    public function getToken() {
        $resp = $this->post('/token', [
            'client_id' => $this->client_id,
            'client_secret' => $this->client_secret,
            'grant_type' => 'client_credentials'
        ]);
        return $resp['data']['access_token'] ?? null;
    }
    
    public function getUserInfo($token) {
        return $this->get('/userinfo', [], $token);
    }
    
    public function verify($token) {
        return $this->get('/verify', [], $token);
    }
    
    private function get($ep, $params = [], $token = null) {
        $url = $this->base_url . $ep;
        if ($params) $url .= '?' . http_build_query($params);
        $h = ['Content-Type: application/json'];
        if ($token) $h[] = "Authorization: Bearer $token";
        return json_decode($this->req('GET', $url, null, $h), true);
    }
    
    private function post($ep, $data, $token = null) {
        $h = ['Content-Type: application/json'];
        if ($token) $h[] = "Authorization: Bearer $token";
        return json_decode($this->req('POST', $this->base_url . $ep, json_encode($data), $h), true);
    }
    
    private function req($m, $u, $b, $h) {
        $c = curl_init();
        curl_setopt_array($c, [CURLOPT_URL => $u, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, CURLOPT_HTTPHEADER => $h]);
        if ($m === 'POST') { curl_setopt($c, CURLOPT_POST, true); curl_setopt($c, CURLOPT_POSTFIELDS, $b); }
        return curl_exec($c);
    }
}

// 使用示例
$sdk = new PTTSDK('app_ClientID', 'ClientSecret', 'https://ptt-server.com/api/oauth');
$token = $sdk->getToken();
$userinfo = $sdk->getUserInfo($token);
print_r($userinfo);

❌ 错误码参考

200成功
400参数错误
401认证失败
403无权限
429请求频繁

常见错误

错误解决方法
应用不存在检查 Client ID
密钥错误检查 Client Secret
应用未启用联系管理员
IP不在白名单后台添加服务器 IP

✅ 接入前检查清单

  • 已获得 Client ID 和 Client Secret
  • 已配置回调地址
  • 服务器 IP 已在白名单(如有)
  • 已测试 /health 接口正常

🚀 准备开始?

还没有申请接入?立即提交申请获取 API 密钥

📝 申请接入

已有申请?查询状态 / 管理后台
← 返回接入平台