facebook - 新的 Facebook SDK 4 在 laravel 中抛出关于 PHP_SESSION_ACTIVE 的异常

标签 facebook laravel-4 facebook-php-sdk

我想在我的项目 laravel 上实现新的 facebook API v 4.0.0。

设置访问我的应用程序所需的所有信息和凭据,何时调用登录函数:

$helper = new FacebookRedirectLoginHelper('http://mywebsite.dev');
$loginUrl = $helper->getLoginUrl();

它抛出一个异常

FacebookSDKException 'Session not active, could not store state.'

所以我在那条线上深入研究了 facebook 的 SDK 类,并检查了这个 session :

 if (session_status() !== PHP_SESSION_ACTIVE) {
      throw new FacebookSDKException(
        'Session not active, could not store state.'
      );
    }

然后我不知道为什么会这样,所以我尝试在干净的路线上进行相同的检查并查看结果

Route::get('test',function() {

   if (session_status() !== PHP_SESSION_ACTIVE)
    {
        return "is not active";
    }

    return "is active";

});

它返回未激活 为什么会这样?这样我就不能在 laravel 中使用新的 facebook API 了吗?

最佳答案

分享我如何在 Laravel 4 上实现 Facebook SDK V4。

这是我在默认 composer.json 上添加的内容

"autoload": {
    "classmap": [
        "app/commands",
        "app/controllers",
        "app/models",
        "app/database/migrations",
        "app/database/seeds",
        "app/tests/TestCase.php"
    ],
    "psr-4" : {
        "Facebook\\":"vendor/facebook/php-sdk-v4/src/Facebook/"
    }
},

在我的 index.php 中添加了 Facebook 初始化,如下所示:

/*
|--------------------------------------------------------------------------
| Initialized Facebook PHP SDK V4
|--------------------------------------------------------------------------
|
*/

//Initialize
use Facebook\FacebookSession;
FacebookSession::setDefaultApplication(Config::get('facebook.AppId'),Config::get('facebook.AppSecret'));

对于 Session,Laravel 不使用 $_SESSION 所以你根本不需要做 session_start。为了能够在 Facebook PHP SDK V4 上使用 Laravel session ,您需要扩展 Facebook 的 FacebookRedirectLoginHelper 类。 以下是如何子类化 FacebookRedirectLoginHelper 并覆盖 session 处理。

class LaravelFacebookRedirectLoginHelper extends \Facebook\FacebookRedirectLoginHelper
{

  protected function storeState($state)
  {
    Session::put('state', $state);
  }

  protected function loadState()
  {
    $this->state = Session::get('state');
    return $this->state;
  }


  protected function isValidRedirect()
  {

    return $this->getCode() && Input::has('state')
        && Input::get('state') == $this->state;

  }



  protected function getCode()
  {
    return Input::has('code') ? Input::get('code') : null;
  }


  //Fix for state value from Auth redirect not equal to session stored state value
  //Get FacebookSession via User access token from code
  public function getAccessTokenDetails($app_id,$app_secret,$redirect_url,$code)
  {

        $token_url = "https://graph.facebook.com/oauth/access_token?"
          . "client_id=" . $app_id . "&redirect_uri=" . $redirect_url
          . "&client_secret=" . $app_secret . "&code=" . $code;

        $response = file_get_contents($token_url);
        $params = null;
        parse_str($response, $params);

        return $params;
   }


}

还有一步,您需要执行一个 composer 命令来重新生成自动加载文件:

composer dump-autoload -o

好的,如果一切顺利,您现在可以开始使用 SDK,这里是一个示例

这是我的一个项目类(class)的摘录:

namespace Fb\Insights;

//Facebook Classes
use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\FacebookSDKException;


//Our Facebook Controller
use FbController;

class PagePosts extends \Facebook\GraphObject {

    /*
        Get Page Posts Impression
        https://developers.facebook.com/docs/graph-api/reference/v2.0/insights#post_impressions     


    */
    public static function getPagePostsImpressions($postid = null) {

        $fbctrl = new FbController();

        $metricNames = array(
            'post_impressions',
            'post_impressions_unique',
            'post_impressions_paid',
            'post_impressions_paid_unique',
            'post_impressions_fan',
            'post_impressions_fan_unique',
            'post_impressions_fan_paid',
            'post_impressions_fan_paid_unique',
            'post_impressions_organic',
            'post_impressions_organic_unique',
            'post_impressions_viral',
            'post_impressions_viral_unique',
            'post_impressions_by_story_type',
            'post_impressions_by_story_type_unique',
            'post_impressions_by_paid_non_paid',
            'post_impressions_by_paid_non_paid_unique'
        );

        $postsInsights = array();       
        $batch = array();
        $limit = $fbctrl->FacebookGraphDateLimit();     


        //craft our batch API call
        for($i=0; $i<count($metricNames); $i++) {       
            $batch[] = json_encode(array('method' => 'GET','relative_url' => $postid . '/insights/' . $metricNames[$i] . '?since=' . $limit['since'] . '&until=' . $limit['until'] ));
        }
        $params = array( 'batch'    => '[' . implode(',',$batch ) . ']' );      

        $session = new FacebookSession($fbctrl->userAccessToken);

        try {

            $res = (new FacebookRequest($session,'POST','/',$params))
                ->execute()
                ->getGraphObject();

        } catch(FacebookRequestException $ex) {
            //log this error
            echo $ex->getMessage();
        } catch(\Exception $ex) {
            //log this error
            echo $ex->getMessage();
        }

        //Collect data
        for($i=0; $i<count($batch); $i++) {

            $resdata = json_decode(json_encode($res->asArray()[$i]),true);

            $fbctrl->batchErrorDataChecker($resdata,$postsInsights,$metricNames[$i]);

        }

        return $postsInsights;

    }

欢迎发表评论或提出建议,这样我也可以改进我的代码。 快乐编码。

关于facebook - 新的 Facebook SDK 4 在 laravel 中抛出关于 PHP_SESSION_ACTIVE 的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23501811/

相关文章:

php - Laravel Form 方法 VS 传统编码

通过单击图像按钮 PHP 更新 MySQL

php - laravel php 包冲突

mysql - 照片存储难题

iphone - Facebook 共享窗口问题

php - Laravel 权限在 storage/meta/services.json 中被拒绝

css - Twitter Bootstrap、导航栏和 Laravel

facebook - 将 Facebook 事件目标与洞察行动类型相匹配

node.js - Facebook Graph API 与 Node JS 和 Sails JS

ios - facebook iOS SDK 授权,无需重定向到 safari