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

Я пытаюсь использовать PHP sdk v4.0 для получения долгосрочного маркера доступа для управления страницами.

Я хватаю маркер доступа из входа пользователя (да, я хватаю маркер доступа для конкретной страницы). Затем отправьте его в конечную точку, как указано в документации, но я не получаю никаких результатов и не получаю никаких ошибок.

могу ли я знать, какой правильный фрагмент кода использовать?

Это код, который я использую до сих пор

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

}

3 ответов


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

Маркер Доступа Пользователя

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

логин

вам нужно будет попросить этого пользователя войти в систему с помощью manage_pages разрешение, если вы планируете выполнять admin-specific действия на странице.

$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 точка. Вы захотите вытащить


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


используйте этот код 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;
}
?>