PHP5 实例封装类函数,获取API接口JSON数据

<?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();
}

  

posted @ 2025-05-28 10:49  钢锅  阅读(9)  评论(0)    收藏  举报