Я пытаюсь использовать 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();
Тем не менее, если вы используете долгоживущий токен доступа пользователя для получения токена доступа к странице, токен доступа к странице никогда не истечет .
Вы можете думать о токенах доступа к страницам как «токены доступа к доступу» к токену доступа пользователя к странице. Это важная концепция, поскольку токены доступа к страницам связаны с пользователем 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; } ?>