由于国内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
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我