facebook php sdk $ this-> getUser总是返回0

时间:2013-03-12 05:05:29

标签: php facebook codeigniter facebook-php-sdk

我已经搜索了很多这个问题,并没有找到解决这个问题的具体方法。我见过很多例子和所谓的解决方案,但没有一个能够奏效。 最重要的是,我正在通过phpacademy观看视频,并完全按照视频输入。

在任何人将此标记为重复之前,我唯一的问题是

这是因为我在本地机器上测试了吗? 因为我的设置和视频之间的唯一区别是教程是实时托管的,我正在本地计算机上测试它。

如果是这种情况?我如何在本地机器上测试PHP facebook SDK?

这是我的完整代码 这是我的主要控制器

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Fbapp extends MX_Controller {


    function __construct() {
        $this->load->library('fbconnect');
        parent::__construct();
    }
    function index() {


        echo "<a href='" . base_url() . "fbapp/gotofb'>Go To Facebook</a>";
    }

    function gotofb(){

        $data = array(
            'redirect_uri' => base_url() . "fbapp/redirected",
            'scope' => "email,photo_upload"
        );
      $url =  $this->fbconnect->getLoginUrl($data);

     redirect($url);
    }

    function redirected(){
        $user_id= $this->fbconnect->getUser();
       echo $user_id;

    }
}

这是我的库文件,我将其命名为“fbconnect.php”,包含库中的sdk文件并包含在库中,我在配置中创建了一个facebook.php,它存储了我已加载为$ config的appId和secret。

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');


require_once(APPPATH . 'libraries/facebook/src/facebook.php');
class Fbconnect extends Facebook{

    public $user = null;

    function __construct() {
        $ci =& get_instance();

        $ci->load->config("facebook", true);
        $config = $ci->config->item('facebook');

        parent::__construct($config);
    }

}

步骤: 1.i访问我的网址。点击链接。 2.让我到facebook的登录页面。我登录 3.它将我重定向到重定向uri并打印0。

注意:我正在开发codeigniter。 提前致谢。 任何帮助都非常赞赏!!

3 个答案:

答案 0 :(得分:0)

您好@developernaren尝试在库中使用以下代码:

<?php
    if (!defined('BASEPATH')) exit('No direct script access allowed');

include(APPPATH.'libraries/facebook/src/facebook.php');

class Fb_connect extends Facebook {

    //declare protected variables
    protected $user     = NULL;
    protected $user_id  = FALSE;
            protected $friends      = NULL;

            //constructor method.
    public function __construct()
    {
                $CI = & get_instance();
                $CI->config->load("facebook",TRUE);
                $config = $CI->config->item('facebook');
                parent::__construct($config);
                $this->user_id = $this->getUser();
                if ($this->user_id) {
                    log_message('Info','Userid is fetched!');
                    try {
                        $this->user = $this->api('/me');
                        $this->friends = $this->api('/me/friends');
                    } catch (FacebookApiException $e) {
                        error_log($e);
                    }
                }
    }
            //Use this function to fetch the fb_uid. Function call: $this->fb_connect->user_id();
            public function user_id()
            {
                if(!empty($this->user_id))
                    return $this->user_id;
                else
                    return FALSE;
            }
          //Use this function to fetch the user details from fb. Function call: $this->fb_connect->user();
            public function user()
            {
                if(!empty($this->user))
                    return $this->user;
                else
                    return NULL;
            }}

答案 1 :(得分:0)

之前我遇到过同样的问题,经过几天的搜索,如果你确定所有的配置,我会用两种方式解决它...我认为你必须尝试解决方案: 1-在web托管服务器上托管您的应用程序,并使用您将获得的域名进行尝试。 2-使用javascript sdk获取access_token,然后将其传递给php skd,如下所示:

              window.fbAsyncInit = function() {
            FB.init({
              appId      : 'appId', // App ID
              channelUrl : 'channel.html', // Channel File
              status     : true, // check login status
              cookie     : true, // enable cookies to allow the server to access the session
              xfbml      : true  // parse XFBML
            });
            // Additional init code here

            FB.Event.subscribe('auth.login', function(response) {
            var accessToken = response.authResponse.accessToken;
            window.location.href = "http://page_to_read_process_the _request?"accessToken="+accessToken;
         });
在php中,你只需要这样做:

$facebook->setAccessToken($accessToken);
$facebook->getUser();

如果这解决了你的问题:请不要忘记投票:D

答案 2 :(得分:0)

您可以尝试为本地计算机创建某种测试环境。

您需要了解Facebook如何向您的应用程序发送数据,然后您可以创建您的环境。

  1. Facebook正在向您的页面发送请求(通过POST),并且您的页面正在接收此数据,您需要接受数据并进行处理。

  2. 尝试创建一个在线应用程序(我正在使用PHP,因此我将以这种方式编写),并且var_dump已签名请求。

  3. 在var_dump之后,您可以看到从Facebook发送的已签名请求。

  4. 使用输入字段创建PHP文件,您可以在其中放置本地应用程序,并将POST数据按钮输入到输入页面。在表单中,您将使用来自步骤2的数据隐藏名为“signed_request”的输入。

  5. 将数据发送到您的页面后,页面将处理已签名的请求,就像它应该在线处理一样。

  6. 我知道这是一个漫长的过程,但是一旦你这样做,你将拥有测试环境,将来所有其他应用程序。

    另外,尝试使用以下几种情况创建多个表单:

    1. Facebook页面标签不喜欢
    2. Facebook页面标签已
    3. 带有接受权限框的Facebook页面标签
    4. 等...