PHP版QQ互联OAuth示例代码分享

/* *
 * QQ互联 oauth
 * @author dyllen
 * @edit 
http://www.lai18.com
 * @date 2015-07-06
 
*/
class Oauth
{
   // 取Authorization Code Url
   const PC_CODE_URL =  ' https://graph.qq.com/oauth2.0/authorize ';
    
   // 取Access Token Url
   const PC_ACCESS_TOKEN_URL =  ' https://graph.qq.com/oauth2.0/token ';
    
   // 取用户 Open Id Url
   const OPEN_ID_URL =  ' https://graph.qq.com/oauth2.0/me ';
    
   // 用户授权之后的回调地址
   public $redirectUri =  null;
    
   //  App Id
   public $appid =  null;
    
   // App Key
   public $appKey =  null;
    
   // 授权列表
  
// 字符串,多个用逗号隔开
   public $scope =  null;
    
   // 授权code
   public $code =  null;
    
   // 续期access token的凭证
   public $refreshToken =  null;
    
   // access token
   public $accessToken =  null;
    
   // access token 有效期,单位秒
   public $expiresIn =  null;
    
   // state
   public $state =  null;
    
   public $openid =  null;
    
   // construct
   public function __construct($config=[])
  {
     foreach($config  as $key => $value) {
      $ this->$key = $value;
    }
  }
    
   /* *
   * 得到获取Code的url
   * @throws \InvalidArgumentException
   * @return string
   
*/
   public function codeUrl()
  {
     if (!$ this->redirectUri) {
       throw  new \Exception( ' parameter $redirectUri must be set. ');
    }
    $query = [
         ' response_type ' =>  ' code ',
         ' client_id ' => $ this->appid,
         ' redirect_uri ' => $ this->redirectUri,
         ' state ' => $ this->getState(),
         ' scope ' => $ this->scope,
    ];
    
     return self::PC_CODE_URL .  ' ? ' . http_build_query($query);
  }
    
   /* *
   * 取access token
   * @throws Exception
   * @return boolean
   
*/
   public function getAccessToken()
  {
    $ params = [
         ' grant_type ' =>  ' authorization_code ',
         ' client_id ' => $ this->appid,
         ' client_secret ' => $ this->appKey,
         ' code ' => $ this->code,
         ' redirect_uri ' => $ this->redirectUri,
    ];
    
    $url = self::PC_ACCESS_TOKEN_URL .  ' ? ' . http_build_query($ params);
    $content = $ this->getUrl($url);
    parse_str($content, $res);
     if ( !isset($res[ ' access_token ']) ) {
      $ this->thrwoError($content);
    }
    
    $ this->accessToken = $res[ ' access_token '];
    $ this->expiresIn = $res[ ' expires_in '];
    $ this->refreshToken = $res[ ' refresh_token '];
    
     return  true;
  }
    
   /* *
   * 刷新access token
   * @throws Exception
   * @return boolean
   
*/
   public function refreshToken()
  {
    $ params = [
         ' grant_type ' =>  ' refresh_token ',
         ' client_id ' => $ this->appid,
         ' client_secret ' => $ this->appKey,
         ' refresh_token ' => $ this->refreshToken,
    ];
    
    $url = self::PC_ACCESS_TOKEN_URL .  ' ? ' . http_build_query($ params);
    $content = $ this->getUrl($url);
    parse_str($content, $res);
     if ( !isset($res[ ' access_token ']) ) {
      $ this->thrwoError($content);
    }
    
    $ this->accessToken = $res[ ' access_token '];
    $ this->expiresIn = $res[ ' expires_in '];
    $ this->refreshToken = $res[ ' refresh_token '];
    
     return  true;
  }
    
   /* *
   * 取用户open id
   * @return string
   
*/
   public function getOpenid()
  {
    $ params = [
         ' access_token ' => $ this->accessToken,
    ];
    
    $url = self::OPEN_ID_URL .  ' ? ' . http_build_query($ params);
        
    $ this->openid = $ this->parseOpenid( $ this->getUrl($url) );
      
     return $ this->openid;
  }
    
   /* *
   * get方式取url内容
   * @param string $url
   * @return mixed
   
*/
   public function getUrl($url)
  {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_URL, $url);
    $response = curl_exec($ch);
    curl_close($ch);
    
     return $response;
  }
    
   /* *
   * post方式取url内容
   * @param string $url
   * @param array $keysArr
   * @param number $flag
   * @return mixed
   
*/
   public function postUrl($url, $keysArr, $flag =  0)
  {
    $ch = curl_init();
     if(! $flag) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $keysArr);
    curl_setopt($ch, CURLOPT_URL, $url);
    $ret = curl_exec($ch);
    
    curl_close($ch);
     return $ret;
  }
    
    
   /* *
   * 取state
   * @return string
   
*/
   protected function getState()
  {
    $ this->state = md5(uniqid(rand(),  true));
     // state暂存在缓存里面
    
// 自己定义
        
// 。。。。。。。。。
    
     return $ this->state;
  }
    
   /* *
   * 验证state
   * @return boolean
   
*/
   protected function verifyState()
  {
     // 。。。。。。。
  }
    
   /* *
   * 抛出异常
   * @param string $error
   * @throws \Exception
   
*/
   protected function thrwoError($error)
  {
    $subError = substr($error, strpos($error,  " { "));
    $subError = strstr($subError,  " } "true) .  " } ";
    $error = json_decode($subError,  true);
      
     throw  new \Exception($error[ ' error_description '], ( int)$error[ ' error ']);
  }
    
   /* *
   * 从获取openid接口的返回数据中解析出openid
   * @param string $str
   * @return string
   
*/
   protected function parseOpenid($str)
  {
    $subStr = substr($str, strpos($str,  " { "));
    $subStr = strstr($subStr,  " } "true) .  " } ";
    $strArr = json_decode($subStr,  true);
     if(!isset($strArr[ ' openid '])) {
      $ this->thrwoError($str);
    }
      
     return $strArr[ ' openid '];
  }
}

你可能感兴趣的:(OAuth)