/*
*
* QQ互联 oauth
* @author dyllen
* @edit
http://www.lai18.com
* @date 2015-07-06
*/
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
'];
}
}