Вы включили регистрацию ошибок php? что говорит журнал?
Это довольно трудно, чтобы помочь вам отлаживать, не видя ваш utils.php
IsSet это функция, которая возвращает истину, если переменная создается и имеет значение.
По вашим счетам это означает, что ваш $ facebook-> api ('/ me') возвращает нуль или эта строка кода вообще не запускается.
Не знаю точно, что пошло не так с вашими кодами, потому что, не видя, что вы делаете, я только предполагаю.
В любом случае, поскольку вы используете PHP, как насчет того, чтобы исключить необходимость в кнопке входа в систему? просто попросите войти в систему, как только они войдут в приложение (если они не вошли в Facebook), если сеанс Facebook получен, покажите им фактическое приложение, и у вас уже будет информация о профиле пользователя. Как это звучит?
Вот что я обычно делаю в своих приложениях Facebook. Вы можете настроить его так, как вам нравится в соответствии с вашими потребностями.
config.php
<?php
//set facebook application id, secret key and api key here
$fbconfig['appid'] = "xxxxxxxxxxxxxxxx";
$fbconfig['secret'] = "xxxxxxxxxxxxxxxxxxxxxxxxx";
$protocol = "http";
if(isset($_SERVER['HTTPS']))
{
if($_SERVER['HTTPS'])
{
$protocol = "https";
}
}
//set application urls here
$domainName = $_SERVER['HTTP_HOST'];
$appNamespace = "[APP_NAMESPACE]";
$appFolder = "[WEB_FOLDER_NAME]";
$fbconfig['appBaseUrl'] = $protocol."://apps.facebook.com/".$appNamespace;
$fbconfig['baseUrl'] = $protocol."://" . $domainName . "/" . $appFolder;
$uid = null; // facebook user id
$me = null; // JSON object containing the basic user information
$redirect_url = $fbconfig['baseUrl']."/redirect.php";
$cancel_url = $protocol."://www.facebook.com";
$allow_url = $fbconfig['appBaseUrl'];
$profileURL = $protocol."://www.facebook.com/profile.php?id=";
?>
redirect.php
<?php
include_once "config.php";
if (isset($_REQUEST["error"]))
{
?>
<script type="text/javascript">
top.location.href = "<?=$cancel_url?>";
</script>
<?php
}
else
{
?>
<script type="text/javascript">
top.location.href = "<?=$allow_url?>";
</script>
<?php
}
?>
fbmain.php
<?php
include_once "../facebook_sdk/facebook.php";
include_once "config.php";
$uid = null; // facebook user id
$me = null; // JSON object containing the basic user information
// Create our Application instance (replace this with your appId and secret).
$facebook = new Facebook(array(
'appId' => $fbconfig['appid'],
'secret' => $fbconfig['secret'],
'cookie' => true,
));
$signedRequest = $facebook->getSignedRequest();
// We may or may not have this data based on a $_GET or $_COOKIE based session.
//
// If we get a session here, it means we found a correctly signed session using
// the Application Secret only Facebook and the Application know. We dont know
// if it is still valid until we make an API call using the session. A session
// can become invalid if it has already expired (should not be getting the
// session back in this case) or if the user logged out of Facebook.
$user = $facebook->getUser();
$access_token = $facebook->getAccessToken();
$logoutUrl = $facebook->getLogoutUrl();
$loginUrl = $facebook->getLoginUrl(
array(
//state what are the required perms
'redirect_uri' => $redirect_url,
'scope' => 'email, user_likes, user_status, friends_likes, friends_status',
)
);
// Session based API call.
if ($user) {
try {
$me = $facebook->api('/me');
if($me)
{
$uid = $me['id'];
$_SESSION['fbId'] = $me['id'];
}
}
catch (FacebookApiException $e) {
error_log($e);
}
}
else {
echo "<script type='text/javascript'>top.location.href = '$loginUrl';</script>";
exit;
}
function outputData($d){
echo '<pre>';
print_r($d);
echo '</pre>';
}
?>
после этого мне просто нужно включить «fbmain.php» на любую страницу, для которой требуется сеанс facebook. Обычно я включаю include в свой «index.php».
index.php
<?php
include_once "fbmain.php";
?>
<html>
<body id="my_body">
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({
appId: '<?php echo $facebook->getAppID() ?>',
cookie: true,
xfbml: true,
oauth: true
});
FB.Canvas.setAutoGrow();
FB.Canvas.scrollTo(0,0);
};
(function() {
var e = document.createElement('script'); e.async = true;
e.src = document.location.protocol +
'//connect.facebook.net/en_US/all.js';
document.getElementById('fb-root').appendChild(e);
}());
</script>
<?php
if ($me)
{
echo "Facebook ID: ".$me['id']. "<br />";
echo "Facebook Name: ".$me['name'];
}
?>
</body>
</html>
последующие страницы сайта будут использовать переменные сессии, чтобы сделать API вызовы с помощью Javascript SDK вместо повторного прохождения через весь процесс аутентификации.
Я думаю, что ваша переменная '$ user_profile' не установлена, а? Пожалуйста, покажите нам, где вы установите переменную. – sebastian
@sebastian У меня есть файл с именем 'utils.php', и я устанавливаю' $ user_profile' там. Я использовал 'require_once', чтобы распознать переменную. –