PHP版QQ互联OAuth示例代码分享
由于国内QQ用户的普遍性,所以现在各大网站都尽可能的提供QQ登陆口,下面我们来看看php版,给大家参考下
/** *QQ互联oauth *@authordyllen * */ classOauth { //取AuthorizationCodeUrl constPC_CODE_URL='https://graph.qq.com/oauth2.0/authorize'; //取AccessTokenUrl constPC_ACCESS_TOKEN_URL='https://graph.qq.com/oauth2.0/token'; //取用户OpenIdUrl constOPEN_ID_URL='https://graph.qq.com/oauth2.0/me'; //用户授权之后的回调地址 public$redirectUri=null; //AppId public$appid=null; //AppKey public$appKey=null; //授权列表 //字符串,多个用逗号隔开 public$scope=null; //授权code public$code=null; //续期accesstoken的凭证 public$refreshToken=null; //accesstoken public$accessToken=null; //accesstoken有效期,单位秒 public$expiresIn=null; //state public$state=null; public$openid=null; //construct publicfunction__construct($config=[]) { foreach($configas$key=>$value){ $this->$key=$value; } } /** *得到获取Code的url *@throws\InvalidArgumentException *@returnstring */ publicfunctioncodeUrl() { if(!$this->redirectUri){ thrownew\Exception('parameter$redirectUrimustbeset.'); } $query=[ 'response_type'=>'code', 'client_id'=>$this->appid, 'redirect_uri'=>$this->redirectUri, 'state'=>$this->getState(), 'scope'=>$this->scope, ]; returnself::PC_CODE_URL.'?'.http_build_query($query); } /** *取accesstoken *@throwsException *@returnboolean */ publicfunctiongetAccessToken() { $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']; returntrue; } /** *刷新accesstoken *@throwsException *@returnboolean */ publicfunctionrefreshToken() { $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']; returntrue; } /** *取用户openid *@returnstring */ publicfunctiongetOpenid() { $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内容 *@paramstring$url *@returnmixed */ publicfunctiongetUrl($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内容 *@paramstring$url *@paramarray$keysArr *@paramnumber$flag *@returnmixed */ publicfunctionpostUrl($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 *@returnstring */ protectedfunctiongetState() { $this->state=md5(uniqid(rand(),true)); //state暂存在缓存里面 //自己定义 //。。。。。。。。。 return$this->state; } /** *验证state *@returnboolean */ protectedfunctionverifyState() { //。。。。。。。 } /** *抛出异常 *@paramstring$error *@throws\Exception */ protectedfunctionthrwoError($error) { $subError=substr($error,strpos($error,"{")); $subError=strstr($subError,"}",true)."}"; $error=json_decode($subError,true); thrownew\Exception($error['error_description'],(int)$error['error']); } /** *从获取openid接口的返回数据中解析出openid *@paramstring$str *@returnstring */ protectedfunctionparseOpenid($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']; } }
以上所述就是本文的全部内容了,希望大家能够喜欢。