Почему 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 ]

1 голос
/ 08 мая 2012

У меня была точно такая же проблема в моем приложении на Facebook, и я наконец-то понял это после 2 дней разочарования.Оказалось, проблема с редиректом-uri в getLoginUrl()!если он не соответствует зарегистрированному домену приложения через Facebook, они возвращают ошибку, и пользователь возвращается как 0 (значение пользователя по умолчанию).

1 голос
/ 01 мая 2012

Попробуйте это в своем фрагменте кода: если при выполнении условия вы будете перенаправлены на Facebook, войдите в систему, и я надеюсь, что к тому времени вам будет хорошо, но не забывайте использовать новые библиотеки php SDK

if(($facebook->getUser())==0)
{
 header("Location:{$facebook->getLoginUrl(array('scope' => 'photo_upload,user_status,publish_stream,user_photos,manage_pages'))}");
 exit;
}
else {
$accounts_list = $facebook->api('/me/accounts');
echo "i am connected";
}
1 голос
/ 16 марта 2012

Я проверял и проверял долгое время, Теперь я нашел причину.

Пожалуйста, войдите в систему для приложений разработчика, в настройках -> Advance -> Миграции -> Устаревший автономный доступ- -> отключен .

Вы найдете, что $ facebook-> getUser () будет работать.

другое дело.лучше добавить домен, когда новый класс Facebook;

$facebook = new Facebook(array(
'appId' => APP_ID,//$app_id,
'secret' => APP_SECRET,//$app_secret,
'cookie' => true,
'domain'=>'xxxdomain.com',
));
$session = $facebook->getUser();    
1 голос
/ 23 августа 2013

Через несколько отчаянных часов вот что вызвало ту же проблему на моем сервере: если вы используете SSL, убедитесь, что порт 443 не заблокирован ! Я открыл порт в прошлом году, но оказалось, что мой веб-хостер как-то недавно сделал сброс.

1 голос
/ 06 июля 2012

У меня была такая же проблема с getUser(), он возвращает 0 в IE 8. Я нашел решение после некоторых исследований.Перейдите по ссылке ниже.Это работает как шарм.

http://www.andugo.com/facebook-php-sdk-getuser-return-0-value-on-ie/

0 голосов
/ 23 июня 2013

Это хорошие предложения, но то, что у меня сработало, это на самом Facebook. После многократного рефакторинга кода я понял, что это проблема с настройками на Facebook.
Следующие шаги решили мою проблему.

1.) В разделе «Основные»> «Приложение на Facebook» ... я отменил выбор, хотя вы можете оставить его, если хотите

2.) В разделе «Разрешения»> «Конфиденциальность» -> установите «Публичный»

.

Разрешения> Токен авторизации -> установлен в строку запроса

3.) В разделе «Дополнительно» -> «Аутентификация»> «Тип приложения» -> «Интернет»

.

Третий шаг - это тот, который действительно все исправил, но не совсем уверен, почему, хотя, надеюсь, это поможет

0 голосов
/ 11 августа 2013

Убедитесь, что вы вызываете эту API-функцию Facebook getUser перед любым выводом, потому что он использует переменные сеанса и файлы cookie. Заголовки не могут быть отправлены / прочитаны правильно, если вы это сделали.

0 голосов
/ 08 мая 2013
    if ($facebook->getUser()) {
       $userProfile = $facebook->api('/me');
       // do logic
    } else {
       $loginUrl = $facebook->getLoginUrl($params = array('scope' => SCOPE));
       header('Location:' . $loginUrl);
    }

вот как я исправил свою проблему, теперь он возвращает мне детали профиля пользователя для дальнейшей обработки. (это была такая головная боль)

0 голосов
/ 29 сентября 2011

getUser() и PHP-SDK молча завершается ошибкой, если _REQUEST как глобальные переменные, сбрасываемые http-сервером из-за неправильной конфигурации. Я использовал неправильно сконфигурированный nginx и после трассировки кода ~ 3 часа решил эту проблему путем изменения конфигурации vhost.

Я написал комментарий о решении здесь: https://github.com/facebook/php-sdk/issues/418#issuecomment-2193699

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

0 голосов
/ 29 марта 2013

Если этот вопрос все еще актуален для людей, я бы хотел внести свои 2 цента, так как я изо всех сил пытался заставить все работать.

Прежде всего, попробуйте SDK, который подойдет вам, будь то PHP или JS. По сути, они оба делают одно и то же, просто JS может справиться с этим немного более элегантно (с помощью всплывающего диалога, а что нет). Существует много различных учебных пособий, руководств и примеров! Мне потребовалась неделя, чтобы найти 1, который подходит мне и который я действительно мог бы использовать. Как только вы нашли фрагмент кода, который работает с SDK, который вы планируете использовать, пришло время изменить код в соответствии с вашими конкретными потребностями.

Как только я закончил свой код, я начал его тестировать. Я заметил, что выполняю свой код на localhost, и я тоже не получаю результатов от своих массивов. Чтобы ответить на ваш вопрос: загрузите свой код в (суб) домен и повторите попытку. Мой код работал все время, но из-за того, что у меня не было его в сети, он не работал. Если вы уже получили его в Интернете, мой ответ вам не нужен.

Извините, если такого рода небольшая история на самом деле не предназначена для SO, но она может помочь людям.

Удачи!

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