Codeigniter V2.x与FB API 4

时间:2014-08-25 08:13:24

标签: php facebook codeigniter facebook-graph-api

我想使用CodeIgniter创建一个简单的Facebook网络应用程序,以便能够发布到链接到我的Facebook帐户的页面。

目前这是我的代码:

控制器:

function facebook(){
    $this->config->load('facebook', TRUE);
    $this->load->library('facebook');
    $login_url = $this->facebook->get_user();
    echo $login_url;
}

库:

我确实使用粘贴在这里的代码:http://www.benmarshall.me/facebook-sdk-php-v4-codeigniter/(Ben Marshall)。

默认情况下,库代码不会打印相应的Exception。所以我不得不扩展代码,使它看起来像这样(在构造函数上):

public function __construct() {
        $this->ci =& get_instance();
        $this->ci->load->library('session');
        if (!isset($_SESSION)){
            session_start();
        }

        FacebookSession::setDefaultApplication(
            $this->ci->config->item('api_id', 'facebook'),
            $this->ci->config->item('app_secret', 'facebook')
        );

        $this->helper = new FacebookRedirectLoginHelper($this->ci->config->item('redirect_url', 'facebook'));
        if($this->ci->session->userdata('fb_token')){
            $this->session = new FacebookSession( $this->ci->session->userdata('fb_token'));

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

        }else{
            try {
                $this->session = $this->helper->getSessionFromRedirect();
            }catch(FacebookRequestException $ex){
                echo "<pre> "; print_r($ex->getCode());
                // When Facebook returns an error
            }catch(Exception $ex){ 
                echo "<pre>"; print_r($ex);
                // When validation fails or other local issues
            }
        }

        if ($this->session ){
            $this->ci->session->set_userdata( 'fb_token', $this->session->getToken() );
            $this->session = new FacebookSession( $this->session->getToken());
        }
    }

我做的是: 1.我手动启动会话,否则我会收到错误说&#34;会话未激活,无法加载状态。&#34;使用错误代码:721。

但是,即使我开始会话,FacebookRedirectLoginHelper也总是返回NULL。

在我深入挖掘之后,事实证明在FacebookRedirectLoginHelper.php中,特别是loadState()函数总是返回NULL。

这是loadState()

的代码
protected function loadState()
  {
    if ($this->checkForSessionStatus === true
      && session_status() !== PHP_SESSION_ACTIVE) {
      throw new FacebookSDKException(
        'Session not active, could not load state.', 721
      );
    }
    if (isset($_SESSION[$this->sessionPrefix . 'state'])) {
      $this->state = $_SESSION[$this->sessionPrefix . 'state'];
      return $this->state;
    }

    return null;
  }

有人可以为我建议一个可能的解决方案吗?有没有人用CI成功开发FB API 4?

2 个答案:

答案 0 :(得分:0)

你需要写session_start();在页面的开头,将在php页面上启动会话。

如果你可以从autoload.php配置文件中自动加载facebook库,那就很好了。

答案 1 :(得分:0)

class MyFacebookRedirectLoginHelper extends \Facebook\FacebookRedirectLoginHelper {
    public function __construct() {
        $this->ci = & get_instance();
    }

    protected function storeState($state) {
        if ($this->ci->session->set_userdata($this->sessionPrefix . 'state', $state)) {
            $this->state = $this->ci->session->set_userdata($this->sessionPrefix . 'state', $state);
        return $this->state;
        }
        return NULL;
    }

    protected function loadState() {
        return $this->state = $this->ci->session->userdata($this->sessionPrefix . 'state');
    }
}

https://github.com/facebook/facebook-php-sdk-v4/issues/39#issuecomment-42363729