Почему Facebook PHP SDK getUser всегда возвращает 0? - PullRequest
39 голосов
/ 22 июля 2011

Я пытаюсь работать с веб-сайтом, который требует некоторой информации от пользователя Facebook, я использую PHP и JS SDK.

У меня есть функция на PHP:

public function isLoggedOnFacebook() {
    $user = $this->_facebook->getUser();
    if ($user) {
        return $this->_facebook->api("/$user");
    }
    return false;
}

В классе, который содержит объект facebook из SDK в $this->_facebook.

Затем в блоке я делаю это:

<?php if (!$this->isLoggedOnFacebook()): ?>
<div>
   <fb:login-button show-faces="true" perms="email" width="500" />
</div>
<?php endif ?>

И среда FB JS установлена ​​правильновверх (я думаю), так что это работает.Таким образом, пользователь получает всплывающее окно и авторизует сайт.

Проблема заключается в том, что даже после того, как приложение было авторизовано пользователем, $ user всегда равен 0, что означает, что $facebook->getUser() всегда возвращает 0, а затем перечисляет лицапользователей, включая зарегистрированного пользователя, но если я вызову $facebook->api('/me') или что-то еще, то возникнет исключение недопустимого токена.

Я видел эту проблему, но не виделРешение, я не знаю, в чем проблема, и у меня заканчиваются идеи.

На странице разработчиков Facebook в разделе приложений есть вкладка Веб-сайт, где вы можете настроить URL-адрес своего сайта и домен домена.и я думаю, что это является причиной моей проблемы, но я не знаю точно, что эти поля должны содержать.

Ответы [ 26 ]

0 голосов
/ 11 ноября 2015

Эта проблема действительно странная. Я обнаружил, что проблема заключалась в статическом массиве $ CURL_OPTS в base_facebook.php.

Попробуйте отредактировать его так:

  /**
   * Default options for curl.
   *
   * @var array
   */
  public static $CURL_OPTS = array(
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_USERAGENT      => 'facebook-php-3.2',
  );

до

  /**
   * Default options for curl.
   *
   * @var array
   */
  public static $CURL_OPTS = array(
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_USERAGENT      => 'facebook-php-3.2',
    CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4 
  );
0 голосов
/ 21 сентября 2011

Если вы используете новый SDK 3.1.1 и JS, вам нужно добавить новую переменную в подпрограмму FB.init с именем

oauth : true использовать новый протокол OATH 2.0! Затем обновите кнопку входа в систему, пока не разрешены перми. Пожалуйста, используйте область вместо перми

0 голосов
/ 23 января 2014

Я тоже много часов смотрел на это и тоже нашел решение.Может быть, не для вас, но, похоже, есть некоторая проблема с $ _SERVER ['QUERY_STRING'], поэтому вам нужно установить его в массив $ _REQUEST.

Я использовал codeigniter и обнаружил, что следующий код надзагрузка библиотеки работала.

parse_str ($ _ SERVER ['QUERY_STRING'], $ _ REQUEST);

<code>    parse_str($_SERVER['QUERY_STRING'],$_REQUEST);
    $config = array(); 
    $config["appId"] = "63xxxxx39";
    $config["secret"] = "dexxxx3bf";
    $this->load->library('facebook',$config);

    $this->user = $user = $this->facebook->getUser();
    if ($user) {

        try {
                // Proceed knowing you have a logged in user who's authenticated.
                $user_profile = $this->facebook->api('/me');
                //print_r($user_profile);exit;
        } catch (FacebookApiException $e) {
                echo '<pre>'.htmlspecialchars(print_r($e, true)).'
';$ user = null;} $ logout = $ this-> facebook-> getLogoutUrl ();$ this-> fb_logout = $ logout;$ this-> fb_user = $ user_profile;} else {$ login = $ this-> facebook-> getLoginUrl (array ("scope" => "email", "redirect_uri" => "http://domain/login/login_fbmember/")); $ this-> fb_login = $ login;}}
0 голосов
/ 18 августа 2012

Facebook-> getUser () вернет 0, когда нет вошедшего в систему пользователя. (https://developers.facebook.com/docs/reference/php/facebook-getUser/)

Чтобы решить эту проблему, SDK Facebook JS предоставляет маркер доступа от успешного входа в систему, который можно использовать с SDK Facebook PHP.

Приведенный ниже javascript проверит, существует ли уже вход в Facebook, и ваше приложение Facebook авторизовано:

FB.getLoginStatus(function($response) {
    if ($response.status === 'connected') {
        var uid = $response.authResponse.userID;
        var accessToken = $response.authResponse.accessToken;
        _accessServer(uid, accessToken);

    } else if ($response.status === 'not_authorized') {
        _loginPopup();

    } else {
        _loginPopup();
    }
});

Функция _accessServer открывает еще один запрос на ваш сервер, отправляя токен доступа.

Функция _loginPopup должна открывать всплывающее окно входа в Facebook, запрашивая соответствующие разрешения для пользователя, чтобы «разрешить доступ» к вашему приложению.

Приложение PHP должно затем передать токен доступа в API Facebook:

$facebook->setAccessToken($new_access_token);
$uid = $facebook->getUser();

https://developers.facebook.com/docs/reference/php/facebook-setAccessToken/

Надеюсь, это поможет.

0 голосов
/ 09 июня 2016

Ответ на мою конкретную проблему состоял в том, что были несовместимости между версиями JS SDK и PHP SDK, которые я использовал, и только их обновление решило ее.

Симптом этой проблемы похож, когда он вызванмножеством разных вещей, так что вы можете преуспеть в поиске различных ответов, доступных на этой странице.

0 голосов
/ 21 августа 2012

Добавление этой строки решило эту проблему для меня в IE9:

header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'); // This is the main cause to use on IE.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...