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; // 返回数据
 | |
|     }
 | |
| 
 | |
| 
 | |
| } |