由于国内QQ用户的普遍性,所以现在各大网站都尽可能的提供QQ登陆口,下面我们来看看php版,给大家参考下
/** * QQ互联 oauth * @author dyllen * */class Oauth{//取Authorization Code Urlconst PC_CODE_URL = "https://graph.qq.com/oauth2.0/authorize"; //取Access Token Urlconst PC_ACCESS_TOKEN_URL = "https://graph.qq.com/oauth2.0/token"; //取用户 Open Id Urlconst OPEN_ID_URL = "https://graph.qq.com/oauth2.0/me"; //用户授权之后的回调地址public $redirectUri = null; // App Idpublic $appid = null; //App Keypublic $appKey = null; //授权列表//字符串,多个用逗号隔开public $scope = null; //授权codepublic $code = null; //续期access token的凭证public $refreshToken = null; //access tokenpublic $accessToken = null; //access token 有效期,单位秒public $expiresIn = null; //statepublic $state = null; public $openid = null; //constructpublic 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"];}}以上所述就是本文的全部内容了,希望大家能够喜欢。