【问题标题】:facebook php sdk $this->getUser always returning 0facebook php sdk $this->getUser 总是返回 0
【发布时间】:2013-03-12 05:05:29
【问题描述】:

我为这个问题搜索了很多,没有找到这个问题的特定解决方案。我看过很多例子和所谓的解决方案,但没有一个有效。 最重要的是,我正在观看 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 和秘密。

<?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.我访问我的网址。我点击链接。 2.它让我进入facebook的登录页面。我登录。 3. 它将我重定向到重定向 uri 并打印 0。

注意:我正在使用 codeigniter 进行开发。 提前致谢。 任何帮助都非常感谢!

【问题讨论】:

  • 本地主机上的 Facebook 有点挑战。您是否尝试过将代码上传到域以将其隔离到您的本地主机?
  • 谢谢!我还没有一个域来托管我的网站。我尝试了 heroku,但它显示 500 内部服务器错误。我认为是因为 codeigniter 需要启用 mod_rewrite。代码在我的本地机器上加载正常。我已经创建了一个等待回复的支持票。

标签: php facebook codeigniter facebook-php-sdk


【解决方案1】:

我之前遇到过同样的问题,经过几天的搜索,如果您确定所有配置,我会通过两种方式解决它......我认为您必须尝试解决方案: 1-在网络托管服务器上托管您的应用程序,并使用您将获得的域进行尝试。 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

【讨论】:

  • 我试图设置 accesstoken 和 request 但没有帮助我在 php 中做到了我用 getAccessToken 请求 accesstoken 并将它传递给 setAccessToken 如你提到的并尝试 getUser()。仍然没有运气..感觉我必须现场托管它才能正确测试,无论如何感谢您的帮助。如果有帮助,我会投票给你:D
  • 亲爱的他们你所做的不会有帮助,我告诉你使用 javascript sdk 获取访问令牌,然后将其传递给 php 页面,然后从请求中读取它,最后使用 setAccessToken 分配它,之后所有这些你都可以询问有关用户的任何信息。
  • 我现在确定这是因为访问令牌,因为我传递了从开发人员站点获得的静态访问令牌,它运行良好,但我遇到了问题......这是一个愚蠢的问题..但是你如何触发 FB.Event.subscribe
  • FB.Event.subscribe ...此事件未触发且 url 未重定向..因此没有访问令牌因此感到沮丧....
【解决方案2】:

嗨@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;
            }}

【讨论】:

  • 我看不出这段代码和我写的有什么不同。你刚刚发现了一个异常并添加了一堆受保护的变量。它与我的代码有什么不同,有什么变化?请你解释一下?
  • 这个库中要注意的主要是“日志”的使用。使用日志找出确切的错误并调试它。它将帮助您了解实际问题是什么,而不是在执行所有步骤后想知道为什么它不起作用!而那些受保护的变量,函数只是为了确保封装和抽象到位。只要你在开发并只专注于日志的使用,请忘记这一点。
【解决方案3】:

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

您需要了解 Facebook 如何将数据发送到您的应用程序,然后才能创建您的环境。

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

  2. 尝试创建一个在线应用程序(我使用的是 PHP,所以我会以这种方式编写),并使用 var_dump 签名请求。

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

  4. 创建带有输入字段的 PHP 文件,您可以在其中放置本地应用程序,以及将数据发布到输入页面的按钮。在表单中,您将隐藏名为“signed_request”的输入,其中包含第 2 步中的数据。

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

我知道如何制作它是一个漫长的过程,但是一旦完成,您将拥有测试环境,供将来所有其他应用程序使用。

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

  1. Facebook 页面标签不喜欢
  2. Facebook 页面标签被点赞
  3. 带有已接受权限框的 Facebook 页面选项卡
  4. 等等……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-03
    • 2011-10-11
    • 2013-02-16
    • 2013-03-19
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 2014-03-02
    相关资源
    最近更新 更多