Facebook PHP SDK 4.0: получение долгосрочного маркера доступа

Я пытаюсь использовать 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(); } 

Существует несколько типов токенов доступа, которые вы можете использовать с вызовами Graph. Знать, какой токен доступа использовать может быть сложным.

Ток доступа пользователя

Если вы хотите внести изменения в страницу и опубликовать ее на стене страницы в качестве пользователя admin, вам необходимо использовать токен доступа этого пользователя.

Авторизоваться

Вам нужно будет попросить пользователя войти в систему с разрешением 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 . Вы захотите вытащить поле access_token которое является токеном доступа к странице. Вы также можете потянуть поле perms чтобы узнать, какие разрешения у администратора есть.

 $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(); 

Тем не менее, если вы используете долгоживущий токен доступа пользователя для получения токена доступа к странице, токен доступа к странице никогда не истечет .

Точки доступа к странице "gotcha"

Вы можете думать о токенах доступа к страницам как «токены доступа к доступу» к токену доступа пользователя к странице. Это важная концепция, поскольку токены доступа к страницам связаны с пользователем admin, с которого вы получили токен доступа к странице.

Поскольку существуют разные роли администратора страницы, которые может иметь администратор страницы, это ограничит область доступа к токену доступа к странице, если администратору не назначена роль, предоставляющая им определенное разрешение.

Я бы не использовал PHP SDK для этого, вы можете сделать это легко с помощью CURL. Подробную информацию см. В этой статье со всем необходимым кодом: http://www.devils-heaven.com/extended-page-access-tokens-curl/

Если вы действительно хотите сделать это с помощью SDK PHP, здесь можно найти легкое решение: 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, чтобы вы могли получить список администрируемых страниц со всеми их Токены доступа. После того, как вы получите этот список, единственное различие заключается в том, что вы получите короткоживущий токен страницы с коротким живым токеном пользователя и расширенным с расширенным User Token.

Использовать этот код 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; } ?>