版本 1.0.0 · 2026-04-23
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);
| 接口 | 方法 | 说明 | 认证 |
|---|---|---|---|
/token | POST | 获取访问令牌 | 无 |
/userinfo | GET | 获取用户信息 | Bearer Token |
/verify | GET | 验证令牌有效性 | Bearer Token |
/revoke | POST | 撤销授权 | Bearer Token |
/health | GET | 健康检查 | 无 |
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..."
}
}
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
}
}
GET /api/oauth/verify
{
"code": 200,
"data": {
"valid": true,
"union_id": "HAM_abc123",
"expires_in": 3600
}
}
POST /api/oauth/revoke
{
"code": 200,
"message": "撤销成功"
}
/** 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);
| 错误 | 解决方法 |
|---|---|
应用不存在 | 检查 Client ID |
密钥错误 | 检查 Client Secret |
应用未启用 | 联系管理员 |
IP不在白名单 | 后台添加服务器 IP |
/health 接口正常