<?php
/* PHP5 实例封装类函数,获取API接口JSON数据;
* 如果有accessToken,获取API接口JSON数据;
* 如果没有accessToken则调用permToken去获取新的accessToken,获取API接口JSON数据;
* 如果没有permToken,则调用账户密码去获取新的accessToken,获取API接口JSON数据;
* accessToken和permToken保存在SESSION中,accessToken短时效Token;permToken长时效Token;
*/
class TokenHandler{
private $api_base = 'https://api.example.com';
private $credentials = array(
'username' => 'demo_user',
'password' => 'demo_pass'
);
public function __construct(){
if(session_id() == '') session_start();
}
public function main(){
if($this->isToken()){
return $this->getApiData($_SESSION['accessToken']);
}
return $this->getRefreshToken();
}
private function isToken(){
return isset($_SESSION['accessToken']) &&
!empty($_SESSION['accessToken']);
}
private function getApiData($token){
return $this->cURL('/user', 'GET', null, array(
'Authorization: Bearer '.$token
));
}
private function getRefreshToken(){
if(isset($_SESSION['permToken']) && !empty($_SESSION['permToken']){
$token = $this->permTokenAccessToken($_SESSION['permToken']);
if($token){
$_SESSION['accessToken'] = $token;
return $this->getApiData($token);
}
}
return $this->getLoginToken();
}
private function permTokenAccessToken($getRefreshToken){
$response = $this->cURL('/token', 'POST', array(
'grant_type' => 'permToken',
'permToken' => $getRefreshToken
));
return isset($response['accessToken']) ? $response['accessToken'] : false;
}
private function getLoginToken(){
$tokens = $this->login();
if($tokens){
$_SESSION['accessToken'] = $tokens['accessToken'];
$_SESSION['permToken'] = $tokens['permToken'];
return $this->getApiData($tokens['accessToken']);
}
throw new Exception('账户密码认证失败');
}
private function login(){
return $this->cURL('/auth', 'POST', $this->credentials);
}
private function cURL($endpoint, $method, $data = null, $headers = array(), $cookiesState = 1){
/* @POST/GET模拟请求
* @param string $postUrl URL地址
* @param string $method 默认 GET
* @param array $headers
* @param json $curlPost 请求参数
* @return json 变量值
* @用法 echo cURL($url);
*/
$url = $this->api_base . $endpoint;
$cookie_file = dirname(__FILE__).'/cookie.txt';
if (empty($url){
return false;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0); //true返回头HEADER
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if($method == 'POST') {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
if ($method == 'PUT' || strtoupper($method) == 'DELETE'){
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
}
if($cookiesState == 1){
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
}
if($cookiesState == 0){
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
}
curl_setopt($ch,CURLINFO_HEADER_OUT,true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
$error = curl_error($ch);
//echo '响应头信息:'.curl_getinfo($ch, CURLINFO_HEADER_OUT).'<br>';
//$curl_info = curl_getinfo($ch);
//var_dump(['request_header' => $curl_info]);
curl_close($ch);
if($error){
throw new Exception('获取数据失败: '.$error);
}
return json_decode($response, true);
}
}
// 使用示例
try{
$handler = new TokenHandler();
print_r($handler->main());
}catch(Exception $e){
echo 'Error: '.$e->getMessage();
}