0

我是Facebook SDK for PHP的新手。我在这里有一个非常基本的问题(这个答案没有帮助):我目前登录到我的 Facebook 个人资料,但是getUser()没有返回任何内容。为什么?

require_once("vendor/facebook-php-sdk/src/facebook.php");

class Controller_Test extends Controller {
    public function action_me()
        {
            $config = array();
            $config['appId'] = 'dfjq454...';
            $config['secret'] = 'adfw424...';
            $config['fileUpload'] = false;
            $facebook = new Facebook($config);  
            $user = $facebook->getUser();

            // Returns '0'
            echo "Me: ".$user;
            // ...

编辑1:

我尝试在 bootstrap.php 中取消注释这一行,但它不起作用'auth' => MODPATH.'auth', // Basic authentication

编辑 2: 当我运行以下代码时

$user_profile = $facebook->api('/me');
        echo "My Profile: ".$user_profile;

我收到这个错误

必须使用活动访问令牌来查询有关当前用户的信息。

编辑 3

FacebookApiException [ 0 ]: An active access token must be used to query information about the current user.
DOCROOT\vendor\facebook-php-sdk\src\base_facebook.php [ 1272 ]
1267    *
1268    * @param $result array A record storing the error message returned
1269    *                      by a failed API call.
1270    */
1271   protected function throwAPIException($result) {
1272     $e = new FacebookApiException($result);
1273     switch ($e->getType()) {
1274       // OAuth 2.0 Draft 00 style
1275       case 'OAuthException':
1276         // OAuth 2.0 Draft 10 style
1277       case 'invalid_token':
DOCROOT\vendor\facebook-php-sdk\src\base_facebook.php [ 881 ] » BaseFacebook->throwAPIException(arguments)
{PHP internal call} » BaseFacebook->_graph(arguments)
DOCROOT\vendor\facebook-php-sdk\src\base_facebook.php [ 654 ] » call_user_func_array(arguments)
APPPATH\classes\Controller\test.php [ 17 ] » BaseFacebook->api(arguments)
SYSPATH\classes\Kohana\Controller.php [ 84 ] » Controller_Test->action_me()
{PHP internal call} » Kohana_Controller->execute()
SYSPATH\classes\Kohana\Request\Client\Internal.php [ 97 ] » ReflectionMethod->invoke(arguments)
SYSPATH\classes\Kohana\Request\Client.php [ 114 ] » Kohana_Request_Client_Internal->execute_request(arguments)
SYSPATH\classes\Kohana\Request.php [ 986 ] » Kohana_Request_Client->execute(arguments)
DOCROOT\index.php [ 118 ] » Kohana_Request->execute()
4

2 回答 2

2

来自Facebook 开发者文档

注意:配置为本机/桌面应用程序的应用程序将无法进行需要应用程序 access_token 的 API 调用。

转到设置→高级,并将其更改为Web

这是此问题的最常见原因,将其更改为Web应该可以解决它。


如果不是这种情况,则可能是 PHP SDK 的问题,它依赖于$_REQUEST来自服务器的超全局数组,由于默认php.ini设置已更改,该数组在 PHP 5.4.x 中已更改。一种解决方法是模仿with和超全局数组中的使用。 source $_REQUESTbase_facebook.php$_GET$_POST$_COOKIE

在您的 中找到以下代码base_facebook.php

<?php

protected function getCode() {
    if (isset($_REQUEST['code'])) {
        if ($this->state !== null &&
                isset($_REQUEST['state']) &&
                $this->state === $_REQUEST['state']) {

            // CSRF state has done its job, so clear it
            $this->state = null;
            $this->clearPersistentData('state');
            return $_REQUEST['code'];
        } else {
            self::errorLog('CSRF state token does not match one provided.');
            return false;
        }
    }

    return false;
}

?>

将其更改为:

<?php

protected function getCode() {
    $server_info = array_merge($_GET, $_POST, $_COOKIE);

    if (isset($server_info['code'])) {
        if ($this->state !== null &&
                isset($server_info['state']) &&
                $this->state === $server_info['state']) {

            // CSRF state has done its job, so clear it
            $this->state = null;
            $this->clearPersistentData('state');
            return $server_info['code'];
        } else {
            self::errorLog('CSRF state token does not match one provided.');
            return false;
        }
    }

    return false;
}

?>

看到不同。

于 2013-09-11T16:28:38.147 回答
0

I was stuck up with similar issue, here is the solution that may help you.

 $facebook = new Facebook(array(
    'appId'  => 'xxxx',
    'secret' => 'xxxxx',
    "redirect_uri" => "set the uri to point to the same page"
 ));

$user = $facebook->getUser();

if($user)
{
//your task
} else {
header('location:'. $facebook->getLoginUrl());

}

$user = $facebook->getUser();

if($user)
{
 //your task
} else {
header('location:'. $facebook->getLoginUrl());

}
于 2014-02-13T06:53:50.253 回答