我从FB的PHP SDK获得了一个有趣的SDK异常消息.我完全像FB文档所说的那样设置我的代码..?
调试错误消息:
[12-Jun-2014 21:08:12 UTC] PHP Fatal error:  Uncaught exception 'Facebook\FacebookSDKException' with message 'Session not active, could not store state.' in C:\WebRoot\Website\root\inc\Facebook\FacebookRedirectLoginHelper.php:188
Stack trace:
#0 C:\WebRoot\Website\root\inc\Facebook\FacebookRedirectLoginHelper.php(94):Facebook\FacebookRedirectLoginHelper->storeState('**********...')
#1 C:\WebRoot\Website\root\login\index.php(87): Facebook\FacebookRedirectLoginHelper->getLoginUrl()
#2 {main}
   thrown in C:\WebRoot\Website\root\inc\Facebook\FacebookRedirectLoginHelper.php on line 188
Facebook.php:
<?php
require_once("../inc/config.php");
require_once(ROOT_PATH . 'inc/Facebook/FacebookSession.php' );
require_once(ROOT_PATH . 'inc/Facebook/FacebookRedirectLoginHelper.php' );
require_once(ROOT_PATH . 'inc/Facebook/FacebookRequest.php' );
require_once(ROOT_PATH . 'inc/Facebook/FacebookResponse.php' );
require_once(ROOT_PATH . 'inc/Facebook/FacebookSDKException.php' );
require_once(ROOT_PATH . 'inc/Facebook/FacebookRequestException.php' );
require_once(ROOT_PATH . 'inc/Facebook/FacebookAuthorizationException.php' );
require_once(ROOT_PATH . 'inc/Facebook/GraphObject.php' );
require_once(ROOT_PATH . 'inc/Facebook/HttpClients/FacebookCurl.php' );
require_once(ROOT_PATH . 'inc/Facebook/HttpClients/FacebookHttpable.php' );
require_once(ROOT_PATH . 'inc/Facebook/HttpClients/FacebookCurlHttpClient.php' );
use Facebook\FacebookSession;
// init app with app id (APPID) and secret (SECRET)
FacebookSession::setDefaultApplication("**********","*******************");
主登录页面:
<?php
require_once("../inc/config.php");
require_once(ROOT_PATH . 'inc/Facebook/Facebook.php' );
require_once(ROOT_PATH . "inc/LoginHelper.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\HttpClients\FacebookCurl;
use Facebook\HttpClients\FacebookHttpable;
use Facebook\HttpClients\FacebookCurlHttpClient;
session_start();
// login helper with redirect_uri
$helper = new FacebookRedirectLoginHelper( '***********' );
主登录页面上的链接:
<a href="<?php echo $helper->getLoginUrl();?>"><img src="<?php echo BASE_URL; ?>img/facebook-login-button.png" class="fb-login"></a>
重定向网址页面:
<?php
require_once("../inc/config.php");
require_once(ROOT_PATH . 'inc/Facebook/Facebook.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\HttpClients\FacebookCurl;
use Facebook\HttpClients\FacebookHttpable;
use Facebook\HttpClients\FacebookCurlHttpClient;
session_start();
//get user login token from FB
$helper = new FacebookRedirectLoginHelper('*******');
try {
   $session = $helper->getSessionFromRedirect();
} catch(FacebookRequestException $ex) {
     echo $ex;
  // When Facebook returns an error
} catch(Exception $ex) {
    echo $ex;
  // When validation fails or other local issues
}
if ($session) {
    $FacebookAccessToken = $session->getToken();
   // Logged in
}
Sam*_*myK 13
为了扩大Chancho的回答,SDK将检查是否会话有效时,它会尝试任何数据存储到它之前.有三种方法可以解决这个问题.
如果你只是使用PHP的原生会话,Chancho的答案就足够了.session_start();在发送任何输出之前,您必须确保它位于脚本的最顶层.
如果您使用的是像Codeigniter,Yii,CakePHP,Laravel等Web框架,它们通常有自己的存储会话的方式.要覆盖默认会话存储,您需要编写自己的类来扩展\Facebook\FacebookRedirectLoginHelper该类.然后你需要覆盖storeState()和loadState()方法.这是整个SDK中与$_SESSION变量接口的唯一两种方法.
您可以在SDK的GitHub问题中看到一个laravel实现示例.这是laravel实现:
class MyFacebookRedirectLoginHelper extends \Facebook\FacebookRedirectLoginHelper
{
  protected function storeState($state)
  {
    Session::put('state', $state);
  }
  protected function loadState()
  {
    return $this->state = Session::get('state');
  }
}
如果您尝试在无状态环境(如命令行)中使用SDK,则无法启动会话或覆盖会话数据的存储方式.你可以简单地禁用支票FacebookRedirectLoginHelper::disableSessionStatusCheck().
要禁用会话检查,请运行此命令.
$helper = new FacebookRedirectLoginHelper('*******');
$helper->disableSessionStatusCheck();
$session = $helper->getSessionFromRedirect();
// . . . 
我希望有所帮助!
| 归档时间: | 
 | 
| 查看次数: | 11364 次 | 
| 最近记录: |