class
Oauth
{
const
PC_CODE_URL =
'https://graph.qq.com/oauth2.0/authorize'
;
const
PC_ACCESS_TOKEN_URL =
'https://graph.qq.com/oauth2.0/token'
;
const
OPEN_ID_URL =
'https://graph.qq.com/oauth2.0/me'
;
public
$redirectUri
= null;
public
$appid
= null;
public
$appKey
= null;
public
$scope
= null;
public
$code
= null;
public
$refreshToken
= null;
public
$accessToken
= null;
public
$expiresIn
= null;
public
$state
= null;
public
$openid
= null;
public
function
__construct(
$config
=[])
{
foreach
(
$config
as
$key
=>
$value
) {
$this
->
$key
=
$value
;
}
}
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
);
}
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;
}
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;
}
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;
}
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
;
}
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
;
}
protected
function
getState()
{
$this
->state = md5(uniqid(rand(), true));
return
$this
->state;
}
protected
function
verifyState()
{
}
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'
]);
}
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'
];
}
}