我正在尝试使用PHP sdk v4.0来获取用于PAGE管理的长期访问令牌。
我从用户的登录中抓取访问令牌(是的,我正在抓取特定于页面的访问令牌)。然后按照文档中的说明将其发送到端点,但我没有得到任何结果,我没有收到任何错误。
我能知道要使用的代码片段是什么吗?
这是我目前使用的代码
$endpoint = '/oauth/access_token?';
$endpoint .= 'grant_type=fb_exchange_token&';
$endpoint .= 'client_id='.$this->app_id.'&';
$endpoint .= 'client_secret='.$this->app_secret.'&';
$endpoint .= 'fb_exchange_token='.$access_token;
try {
$response = (new FacebookRequest(
$this->session, 'GET', $endpoint
))->execute();
// Do something with the response here but response is empty
} catch (FacebookRequestException $ex) {
echo $ex->getMessage();
} catch (\Exception $ex) {
echo $ex->getMessage();
}
答案 0 :(得分:19)
您可以使用多个types of access tokens来调用Graph。知道使用哪个访问令牌可能会很棘手。
如果您想更改页面并以管理员用户身份发布在页面墙上,则需要使用该用户的访问令牌。
如果您计划在页面上执行特定于管理员的操作,则需要让该用户使用manage_pages
权限登录。
$helper = new FacebookRedirectLoginHelper($redirect_url);
echo '<a href="' . $helper->getLoginUrl(['manage_pages']) . '">Login</a>';
默认情况下,您将从Facebook获得一个短暂的用户访问令牌。我假设您正在使用数据库来存储您的访问令牌。您需要将长期用户访问令牌交换为长期存在的用户访问令牌,并将新令牌保存在数据库中。
$accessToken = $session->getAccessToken();
$longLivedAccessToken = $accessToken->extend();
echo (string) $longLivedAccessToken;
如果要将长期存在的用户访问令牌存储在数据库中,作为最佳实践,您应该使用令牌生成code
,然后生成另一个长期访问令牌。这样,您每次都不代表用户对所有请求使用相同的访问令牌。这可以最大限度地降低您的应用被标记为垃圾邮件的可能性。
use Facebook\Entities\AccessToken;
$longLivedAccessToken = new AccessToken('{long-lived-access-token}');
$code = AccessToken::getCodeFromAccessToken($longLivedAccessToken);
$newLongLivedAccessToken = AccessToken::getAccessTokenFromCode($code);
如果您想在页面上发布状态并让帖子显示为页面已发布状态,则您需要使用页面访问令牌。
使用页面管理员的长期用户访问令牌,您可以列出该用户在/me/accounts
endpoint上管理的页面。您需要提取作为页面访问令牌的access_token
字段。您还可以提取perms
字段以查看管理员用户所拥有的permissions。
$request = new FacebookRequest($session, 'GET', '/me/accounts?fields=name,access_token,perms');
$pageList = $request->execute()->getGraphObject()->asArray();
如果您使用短期用户访问令牌来获取页面访问令牌,则页面访问令牌也将是短暂的。
如果您愿意,可以直接与短期页面访问令牌交换短期页面访问令牌。这将为您提供一个持续约2个月的页面访问令牌。
$pageAccessToken = new AccessToken('{short-lived-page-access-token}');
$longLivedPageAccessToken = $pageAccessToken->extend();
但是,如果您使用长期存在的用户访问令牌来获取页面访问令牌,则页面访问令牌将永不过期。
您可以将页面访问令牌视为“子访问令牌”到页面管理员用户访问令牌。这是一个重要的概念,因为页面访问令牌与您从中获取页面访问令牌的管理员用户相关联。
由于页面管理员可以拥有different page admin roles,如果没有为管理员用户分配授予他们所需权限的角色,则会限制页面访问令牌的范围。
答案 1 :(得分:1)
我不会使用PHP SDK,你可以使用CURL轻松完成。有关您需要的所有代码的详细说明,请参阅此文章:http://www.devils-heaven.com/extended-page-access-tokens-curl/
如果你真的想用PHP SDK做到这一点,可以在这里解释一个简单的解决方案:http://www.devils-heaven.com/facebook-access-tokens/
您只需要调用FacecookSession对象上的特定函数:
$facebookSession->getLongLivedSession();
$request = new FacebookRequest($session, 'GET', '/PAGE-ID?fields=access_token');
顺便说一句,没有“特定于页面的用户令牌”,但当然您需要使用“manage_pages”权限授权用户访问/ me / accounts - 这样您就可以获得管理页面的列表与他们的所有访问令牌。获得该列表后,唯一的区别是您将获得一个带有短生命用户令牌的短生活页面令牌和带有扩展用户令牌的扩展页面令牌。
答案 2 :(得分:-1)
使用此代码PHP
<?php
session_start();
require '/vendor/autoload.php';
use Facebook\FacebookSession;
use Facebook\FacebookRedirectLoginHelper;
use Facebook\FacebookRequest;
use Facebook\FacebookResponse;
use Facebook\GraphUser;
use Facebook\GraphObject;
FacebookSession::setDefaultApplication($config['app_id'], $config['app_secret']);
$helper = new FacebookRedirectLoginHelper('http://localhost/folder/index.php');
try {
$session = $helper->getSessionFromRedirect();
if ($session):
$_SESSION['facebook'] = $session->getToken();
header('Location: index.php');
endif;
if (isset($_SESSION['facebook'])):
$session = new FacebookSession($_SESSION['facebook']);
$page_id = '000000000000';
// get page access token
$access_token = (new FacebookRequest( $session, 'GET', '/' . $page_id, array( 'fields' => 'access_token' ) ))
->execute()->getGraphObject()->asArray();
// save access token in variable for later use
$access_token = $access_token['access_token'];
$page_post = (new FacebookRequest( $session, 'POST', '/'. $page_id .'/feed', array(
'access_token' => $access_token,
'name' => 'TITULO DEL ENLACE',
'link' => 'http://www.example.com/',
'caption' = 'Example text',
'message' => 'This is my link!',
) ));
$response = $page_post->execute();
$graphObjectClass = $response->getGraphObject();
$facebook_POST = $graphObjectClass;
endif;
} catch(FacebookRequestException $ex) {
// When Facebook returns an error
echo $ex;
} catch(\Exception $ex) {
// When validation fails or other local issues
echo $ex;
}
?>