由于国内QQ用户的普遍性,所以现在各大网站都尽可能的提供QQ登陆口,下面我们来看看php版,给大家参考下
/** * QQ互联 oauth * @author dyllen * */ 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\']; } }
以上所述就是本文的全部内容了,希望大家能够喜欢。
本文地址:https://www.stayed.cn/item/525
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我