2014-07-03 52 views
4

我是Facebook Graph API的新開發者。我遵循本教程:https://www.webniraj.com/2014/05/01/facebook-api-php-sdk-updated-to-v4-0-0。我有一次測試,它的工作原理。我有修改和重新測試,它的工作。但是,第二天,什麼都沒有......我的Facebook會話令牌有變化,我不知道爲什麼和如何。PHP /圖形API:爲什麼我的Facebook會話不起作用?

有我的代碼:

// ALL includes and variables 

// start session 
session_start(); 

// init app with app id and secret 
FacebookSession::setDefaultApplication($app_ID, $app_secret); 

// login helper with redirect_uri 
$helper = new FacebookRedirectLoginHelper($url); 

// generate login url with scope, each permission as element in array 
$loginUrl = $helper->getLoginUrl(array($access_right)); 

// see if a existing session exists 
if (isset($_SESSION) && isset($_SESSION['fb_token'])) { 
    // create new session from saved access_token 
    $session = new FacebookSession($_SESSION['fb_token']); 

    // validate the access_token to make sure it's still valid 
    try { 
     if (!$session->validate()) { 
      $session = null; 
     } 
    } catch (Exception $e) { 
     // catch any exceptions 
     $session = null; 
    } 
} 

if (!isset($session) || $session === null) { 
    // no session exists 

    try { 
     $session = $helper->getSessionFromRedirect(); 
    } catch(FacebookRequestException $ex) { 
     // When Facebook returns an error 
     // handle this better in production code 
     print_r($ex); 
    } catch(Exception $ex) { 
     // When validation fails or other local issues 
     // handle this better in production code 
     print_r($ex); 
    } 

} 

// see if we have a session 
if (isset($session)) { 

// save the session 
$_SESSION['fb_token'] = $session->getToken(); 
// create a session using saved token or the new one we generated at login 
$session = new FacebookSession($session->getToken()); 

// graph api request for user data 
$graphObject = (new FacebookRequest($session, 'GET', '/me/accounts'))->execute()->getGraphObject()->asArray(); 

// print profile data 
echo '<pre>' . print_r($graphObject, 1) . '</pre>'; 

$page_token = $graphObject['data'][0]->access_token; 

echo '<p>Page token : '.$page_token.'</p>'; 

$session = new FacebookSession($page_token); 

/* make the API call */ 
$request = new FacebookRequest(
    $session, 
    'POST', 
    '/'.$pageID.'/feed', 
    array (
    'message' => 'This is a test message', 
) 
); 
$response = $request->execute(); 
$graphObject = $response->getGraphObject(); 

/* handle the result */ 
// print profile data 
echo '<pre>' . print_r($graphObject, 1) . '</pre>'; 

// print logout url using session and redirect_uri (logout.php page should destroy the session) 
echo '<a href="' . $helper->getLogoutUrl($session, 'http://yourwebsite.com/app/logout.php') . '">Logout</a>'; 

} else { 
// show login url 
echo '<a href="' . $helper->getLoginUrl(array('email', 'user_friends')) . '">Login</a>'; 
} 

我的目標就是把一個消息我的粉絲專頁上,和它的作品第一次。爲什麼變量「$ _SESSION ['fb_token']」現在是NULL?我如何才能使它工作?

感謝您的回覆!

編輯1: 我發現我的會話已將CSRF標題:'fb_token'更改爲'FBRLH_state'。關於這種變化的想法?

+0

我有這個相同的問題! – Jeshii

+0

我有同樣的問題,現在我仍然搜索如何解決這個問題。 – viyancs

+0

Facebook的會話總是使用'​​FBRLH_state',問題在於FBRLH_state改變的原因? – ilumin

回答

3

這裏是我使用最新的Facebook PHP-SDK 4.0.9(我認爲)登錄用戶的文件的內容。

<?php 
require_once('Facebook/FacebookSession.php'); 
require_once('Facebook/FacebookRedirectLoginHelper.php'); 
require_once('Facebook/FacebookRequest.php'); 
require_once('Facebook/FacebookResponse.php'); 
require_once('Facebook/FacebookSDKException.php'); 
require_once('Facebook/FacebookRequestException.php'); 
require_once('Facebook/FacebookAuthorizationException.php'); 
require_once('Facebook/GraphObject.php'); 
require_once('Facebook/GraphUser.php'); 

use Facebook\FacebookSession; 
use Facebook\FacebookRedirectLoginHelper; 
use Facebook\FacebookRequest; 
use Facebook\FacebookResponse; 
use Facebook\FacebookSDKException; 
use Facebook\FacebookRequestException; 
use Facebook\FacebookAuthorizationException; 
use Facebook\GraphObject; 
use Facebook\GraphUser; 

if (!isset($_SESSION['facebookUserId']) || !isset($_SESSION['facebookSession']) || !isset($_SESSION['facebookUserProfile'])) { 
    // init app with app id (APPID) and secret (SECRET) 
    FacebookSession::setDefaultApplication($appId,$appSecret); 

    // login helper with redirect_uri 
    $helper = new FacebookRedirectLoginHelper($canvasUrl); 
    try { 
     $FBSession = $helper->getSessionFromRedirect(); 
    } catch(FacebookRequestException $ex) { 
     // When Facebook returns an error 
    } catch(Exception $ex) { 
     // When validation fails or other local issues 
    } 
    if (!isset($FBSession)) { 
     // STEP ONE - REDIRECT THE USER TO FACEBOOK FOR AUTO LOGIN/APP APPROVAL 
     header('Location: ' . $helper->getLoginUrl()); 
     exit(); 
    } else { 
     $user_profile = (new FacebookRequest($FBSession, 'GET', '/me'))->execute()->getGraphObject(GraphUser::className()); 
     $_SESSION['facebookUserId'] = $user_profile->getID(); 
     $_SESSION['facebookSession'] = $FBSession; // I DON'T THINK THIS ACTAULLY WORKS RIGHT 
     $_SESSION['facebookUserProfile'] = $user_profile; 

    } 
} 

我簡單地包含這個文件,如下所示。

include ('SimpleFacebookLogin.php'); 

我嘗試保存會話,它不正確的會議,所以我覺得我失去了一些東西,以及保存,但我可以創建一個會話後,成功登錄。我只是不確定如何在以後再次訪問它。我希望這有幫助。

-1

Actualy works! =)會話用這段腳本保存在我的電腦上。 我添加了session_start()和session_write_close() - 也許你錯過了那些?

相關問題