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'];
}
}
以上所述就是本文的全部内容了,希望大家能够喜欢。