125 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			125 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | 
 | ||
|  | namespace App\Oauth; | ||
|  | 
 | ||
|  | use App\Config\YlyConfig; | ||
|  | use Exception; | ||
|  | class YlyOauthClient{ | ||
|  | 
 | ||
|  |     private $clientId; | ||
|  |     private $clientSecret; | ||
|  |     private $tokenUrl; | ||
|  |     private $log; | ||
|  | 
 | ||
|  | 
 | ||
|  |     public function __construct(YlyConfig $config) | ||
|  |     { | ||
|  |         $this->clientId = $config->getClientId(); | ||
|  |         $this->clientSecret = $config->getClientSecret(); | ||
|  |         $this->tokenUrl = $config->getRequestUrl() . '/oauth/oauth'; | ||
|  |         $this->log = $config->getLog(); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     public function getToken($code = '') | ||
|  |     { | ||
|  |         $time = time(); | ||
|  |         $params = array( | ||
|  |             'client_id' => $this->clientId, | ||
|  |             'timestamp' => $time, | ||
|  |             'sign' => $this->getSign($time), | ||
|  |             'id' => $this->uuid4(), | ||
|  |             'scope' => 'all' | ||
|  |         ); | ||
|  |         $params['grant_type'] = 'client_credentials'; | ||
|  |         if (!empty($code)) { | ||
|  |             $params['code'] = $code; | ||
|  |             $params['grant_type'] = 'authorization_code'; | ||
|  |         } | ||
|  |         return $this->send($params); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     public function refreshToken($refreshToken) | ||
|  |     { | ||
|  |         $time = time(); | ||
|  |         $params = array( | ||
|  |             'client_id' => $this->clientId, | ||
|  |             'timestamp' => $time, | ||
|  |             'sign' => $this->getSign($time), | ||
|  |             'id' => $this->uuid4(), | ||
|  |             'scope' => 'all', | ||
|  |             'grant_type' => 'refresh_token', | ||
|  |             'refresh_token' => $refreshToken, | ||
|  |         ); | ||
|  |         return $this->send($params); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     public function getSign($timestamp) | ||
|  |     { | ||
|  |         return md5( | ||
|  |             $this->clientId. | ||
|  |             $timestamp. | ||
|  |             $this->clientSecret | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     public function uuid4(){ | ||
|  |         mt_srand((double)microtime() * 10000); | ||
|  |         $charid = strtolower(md5(uniqid(rand(), true))); | ||
|  |         $hyphen = '-'; | ||
|  |         $uuidV4 = | ||
|  |             substr($charid, 0, 8) . $hyphen . | ||
|  |             substr($charid, 8, 4) . $hyphen . | ||
|  |             substr($charid, 12, 4) . $hyphen . | ||
|  |             substr($charid, 16, 4) . $hyphen . | ||
|  |             substr($charid, 20, 12); | ||
|  |         return $uuidV4; | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     public function send($data) | ||
|  |     { | ||
|  |         $requestInfo = http_build_query($data); | ||
|  |         $log = $this->log; | ||
|  |         if ($log != null) { | ||
|  |             $log->info("request data: " . $requestInfo); | ||
|  |         } | ||
|  |         $curl = curl_init(); // 启动一个CURL会话
 | ||
|  |         curl_setopt($curl, CURLOPT_URL, $this->tokenUrl); // 要访问的地址
 | ||
|  |         curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检测
 | ||
|  |         curl_setopt($curl, CURLOPT_HTTPHEADER, array( | ||
|  |             'Expect:' | ||
|  |         )); // 解决数据包大不能提交
 | ||
|  |         curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
 | ||
|  |         curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
 | ||
|  |         curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
 | ||
|  |         curl_setopt($curl, CURLOPT_POSTFIELDS, $requestInfo); // Post提交的数据包
 | ||
|  |         curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循
 | ||
|  |         curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
 | ||
|  |         curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
 | ||
|  |         $requestResponse = curl_exec($curl); // 执行操作
 | ||
|  |         $response = json_decode($requestResponse); | ||
|  |         if (curl_errno($curl)) { | ||
|  |             if ($log != null) { | ||
|  |                 $log->error("error: " . curl_error($curl)); | ||
|  |             } | ||
|  |             throw new Exception(curl_error($curl)); | ||
|  |         } | ||
|  |         if (is_null($response)) { | ||
|  |             throw new Exception("illegal response :" . $requestResponse); | ||
|  |         } | ||
|  |         if ($response->error != 0 && $response->error_description != 'success') { | ||
|  |             throw new Exception(json_encode($response)); | ||
|  |         } | ||
|  |         if ($this->log != null) { | ||
|  |             $this->log->info("response: " . json_encode($response)); | ||
|  |         } | ||
|  |         curl_close($curl); // 关键CURL会话
 | ||
|  |         return $response->body; // 返回数据
 | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  | } |