Facebook PHP SDK 4.0:获取长期访问令牌

Aar*_*Lee 6 php sdk facebook version token

我正在尝试使用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();

}
Run Code Online (Sandbox Code Playgroud)

Sam*_*myK 19

您可以使用几种类型的访问令牌来调用Graph.知道使用哪个访问令牌可能很棘手.

用户访问令牌

如果您想对页面进行更改并以admin用户身份发布在页面墙上,则需要使用该用户的访问令牌.

登录

manage_pages如果您计划在页面上执行特定于管理员的操作,则需要让该用户使用该权限登录.

$helper = new FacebookRedirectLoginHelper($redirect_url);
echo '<a href="' . $helper->getLoginUrl(['manage_pages']) . '">Login</a>';
Run Code Online (Sandbox Code Playgroud)

扩展用户访问令牌

默认情况下,您将从Facebook获得一个短期用户访问令牌.我假设您正在使用数据库来存储您的访问令牌.您需要将长期用户访问令牌交换为长期存在的用户访问令牌,并将新令牌保存在数据库中.

$accessToken = $session->getAccessToken();
$longLivedAccessToken = $accessToken->extend();
echo (string) $longLivedAccessToken;
Run Code Online (Sandbox Code Playgroud)

使用代码

如果要将长期存在的用户访问令牌存储在数据库中,作为最佳实践,您应该使用令牌生成a code然后生成另一个长期存取的令牌.这样,您每次都不代表用户对所有请求使用相同的访问令牌.这可以最大限度地降低您的应用被标记为垃圾邮件的可能性.

use Facebook\Entities\AccessToken;

$longLivedAccessToken = new AccessToken('{long-lived-access-token}');
$code = AccessToken::getCodeFromAccessToken($longLivedAccessToken);
$newLongLivedAccessToken = AccessToken::getAccessTokenFromCode($code);
Run Code Online (Sandbox Code Playgroud)

页面访问令牌

如果您想在页面上发布状态并让帖子显示为页面已发布状态,则您需要使用页面访问令牌.

获取页面访问令牌

使用页面管理员的长期用户访问令牌,您可以列出该用户在/me/accounts端点上管理的页面.您需要拉出access_token作为页面访问令牌的字段.您还可以拉取该perms字段以查看管理员用户具有的权限.

$request = new FacebookRequest($session, 'GET', '/me/accounts?fields=name,access_token,perms');
$pageList = $request->execute()->getGraphObject()->asArray();
Run Code Online (Sandbox Code Playgroud)

短命与长期页面访问令牌

如果使用短期用户访问令牌来获取页面访问令牌,则页面访问令牌也将是短暂的.

如果您愿意,可以直接使用长期页面访问令牌交换短期页面访问令牌.这将为您提供一个持续约2个月的页面访问令牌.

$pageAccessToken = new AccessToken('{short-lived-page-access-token}');
$longLivedPageAccessToken = $pageAccessToken->extend();
Run Code Online (Sandbox Code Playgroud)

但是,如果使用长期存在的用户访问令牌来获取页面访问令牌,则页面访问令牌将永不过期.

页面访问令牌"gotcha"

您可以将页面访问令牌视为页面管理员用户访问令牌的"子访问令牌".这是一个重要的概念,因为页面访问令牌与您从中获取页面访问令牌的管理员用户相关联.

由于页面管理员可以拥有不同的页面管理员角色,如果未为管理员用户分配授予他们所需特定权限的角色,则会限制页面访问令牌的范围.