class
Oauth
{
const
PC_CODE_URL = 'https:
const
PC_ACCESS_TOKEN_URL = 'https:
const
OPEN_ID_URL = 'https:
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'];
}
}