我正在使用以下Facebook SDK登录我的网站。我在Facebook Developers找到了源代码。
$fb = new Facebook\Facebook([
'app_id' => $fbapp_id,
'app_secret' => $fbapp_secret,
'default_graph_version' => 'v2.4',
]);
$helper = $fb->getRedirectLoginHelper();
try {
$accessToken = $helper->getAccessToken();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
$msg = 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
$msg = 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
if ( !isset($accessToken) ) {
if ($helper->getError()) {
header('HTTP/1.0 401 Unauthorized');
echo "Error: " . $helper->getError() . "\n";
echo "Error Code: " . $helper->getErrorCode() . "\n";
echo "Error Reason: " . $helper->getErrorReason() . "\n";
echo "Error Description: " . $helper->getErrorDescription() . "\n";
} else {
header('HTTP/1.0 400 Bad Request');
$msg = 'Bad request';
}
exit;
}
// The OAuth 2.0 client handler helps us manage access tokens
$oAuth2Client = $fb->getOAuth2Client();
// Get the access token metadata from /debug_token
$tokenMetadata = $oAuth2Client->debugToken($accessToken);
var_dump($tokenMetadata);
$_SESSION['fb_access_token'] = (string) $accessToken;
通过使用上面的代码,我得到以下响应。如何从此数组中获取'user_id'值。
string(208) "CAAQJ73gQW1kBAEeG6aOH5aPZBmULTxJPuJ8qOliC1Xn5ljjBYVHHuXuiKAn04Dz2D6hdcZBiHqhtLhe8oR1b3M78KxxUsKOj3QzQsPEnPTqxw54MK026ljHxz6EbACMdgNYgQ0jO6x6x5YGdkdIari6Nhya8ea68gTpHArl8MxexXnkZCpBXOQxZAXQ4y80YNVZCsR9X89QZDZD"
object(Facebook\Authentication\AccessTokenMetadata)#13 (1) {
["metadata":protected]=>
array(7) {
["app_id"]=>
string(16) "1136824023014233"
["application"]=>
string(8) "example.com"
["expires_at"]=>
object(DateTime)#17 (3) {
["date"]=>
string(26) "2015-11-18 06:36:01.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(3) "UTC"
}
["is_valid"]=>
bool(true)
["issued_at"]=>
object(DateTime)#18 (3) {
["date"]=>
string(26) "2015-09-19 06:36:01.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(3) "UTC"
}
["scopes"]=>
array(2) {
[0]=>
string(5) "email"
[1]=>
string(14) "public_profile"
}
["user_id"]=>
string(17) "1020772222323227"
}
}
答案 0 :(得分:6)
我已设法使用以下
获取User Id
$getUserId = $tokenMetadata->getUserId();
答案 1 :(得分:2)
$tokenMetadata->getField('user_id')
要获取所有元数据,请使用
$tokenMetadata->getMetadata()
返回所有字段的关联数组
答案 2 :(得分:2)
我使用以下代码将令牌元数据转换为数组:
$responseArray = (array) $tokenMetadataObject;
$token_metadata = $responseArray[array_keys($responseArray)[0]];
这为您提供了一个数组(在$token_metadata
中),现在可以访问所有字段(此方法有点变通方法,但它有效)。您无法直接访问这些字段的原因是因为它们在对象中都是私有的,并且只能从类中访问。
如果您尝试将其转换为数组然后直接访问字段,您仍然无法使用$theArray['theIndex']
的常用方法获取值,因为将私有字段转换为数组填充索引 NULL 字节,以便您无法访问它。