我刚刚开始使用facebook graph API和PHP SDK。我发现很难理解将fb响应转换为哪种类型的对象。我了解节点和边缘的概念。我还遇到了其他一些Stack Overflow问题(when do you use getGraphObject and getGraphEdge),因此我一直在寻找答案创建对象。
请考虑以下示例。我想从用户那里得到5条帖子。
// getting posts published by user
try {
$posts_request = $fb->get('/me?fields=feed.limit(5)');
}
$posts_response = $posts_request->getGraphEdge();
此查询应返回边,但这给我一个错误
Uncaught Facebook\Exceptions\FacebookSDKException: Unable to convert response from Graph to a GraphEdge because the response does not look like a GraphEdge. Try using GraphNodeFactory::makeGraphNode() instead.
如果我将其更改为
$posts_response = $posts_request->getGraphNode();
我收到以下错误:
Uncaught TypeError: Argument 1 passed to Facebook\Facebook::next() must be an instance of Facebook\GraphNodes\GraphEdge, instance of Facebook\GraphNodes\GraphNode given,
问题1:有人问我为什么在使用getGraphEdge时会抛出错误,即使查询在Graph API资源管理器中返回了graphedges以及如何解决此问题?
此外,我尝试了另一种编写查询的方式,如FB文档(https://developers.facebook.com/docs/graph-api/using-graph-api)中所述。.
$posts_request = $fb->get('/me',array (
'fields' => 'feed.limit(3)'
)
但这给我一个错误:
hash_hmac() expects parameter 2 to be string, array given in /storage/ssd2/231/8670231/public_html/truthposts/Facebook/Authentication/AccessToken.php on line 70
。
虽然我正在使用
设置默认访问令牌$fb->setDefaultAccessToken($_SESSION['facebook_access_token']);
我的完整代码如下:
<?php
session_start();
require_once __DIR__ . '/Facebook/autoload.php'; // download official fb sdk for php @ https://github.com/facebook/php-graph-sdk
$fb = new Facebook\Facebook([
'app_id' => 'xxxxxxx',
'app_secret' => 'xxxxxxxxx',
'default_graph_version' => 'v2.12',
]);
$helper = $fb->getCanvasHelper();
$permissions = ['user_posts','user_photos']; // optionnal
try {
if (isset($_SESSION['facebook_access_token'])) {
$accessToken = $_SESSION['facebook_access_token'];
} else {
$accessToken = $helper->getAccessToken();
}
} catch(Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
if (isset($accessToken)) {
if (isset($_SESSION['facebook_access_token'])) {
$fb->setDefaultAccessToken($_SESSION['facebook_access_token']);
} else {
$_SESSION['facebook_access_token'] = (string) $accessToken;
// OAuth 2.0 client handler
$oAuth2Client = $fb->getOAuth2Client();
// Exchanges a short-lived access token for a long-lived one
$longLivedAccessToken = $oAuth2Client->getLongLivedAccessToken($_SESSION['facebook_access_token']);
$_SESSION['facebook_access_token'] = (string) $longLivedAccessToken;
$fb->setDefaultAccessToken($_SESSION['facebook_access_token']);
}
// validating the access token
try {
$request = $fb->get('/me');
} catch(Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
if ($e->getCode() == 190) {
unset($_SESSION['facebook_access_token']);
$helper = $fb->getRedirectLoginHelper();
$loginUrl = $helper->getLoginUrl('https://apps.facebook.com/APP_NAMESPACE/', $permissions);
echo "<script>window.top.location.href='".$loginUrl."'</script>";
exit;
}
} catch(Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
// getting all posts published by user
try {
$posts_request = $fb->get('/me',array (
'fields' => 'feed.limit(3)'
) );
} catch(Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
$total_posts = array();
$posts_response = $posts_request->getGraphEdge();
if($fb->next($posts_response)) {
$response_array = $posts_response->asArray();
$total_posts = array_merge($total_posts, $response_array);
while ($posts_response = $fb->next($posts_response)) {
$response_array = $posts_response->asArray();
$total_posts = array_merge($total_posts, $response_array);
}
print_r($total_posts);
} else {
$posts_response = $posts_request->getGraphEdge()->asArray();
print_r($posts_response);
}
// Now you can redirect to another page and use the access token from $_SESSION['facebook_access_token']
} else {
$helper = $fb->getRedirectLoginHelper();
$loginUrl = $helper->getLoginUrl('https://apps.facebook.com/nnnnn/', $permissions);
echo "<script>window.top.location.href='".$loginUrl."'</script>";
}
问题2:您能告诉我为什么我在编写上述查询时默认访问令牌不起作用吗?