0

我有一个 Facebook 连接/断开链接。当用户点击“Facebook connect”链接(在index.php上)时,它会检查用户状态(他是否连接到 Facebook?)然后如果他没有连接,我的脚本会发送一个 Ajax $.post 请求到connect.php为了从数据库中检索信息(例如:用户是否在我们的数据库中注册?)。之后,它向 index.php 发回响应:如果没有错误,则刷新页面。在这种情况下,如果一切正常,在脚本( window.location.reload(); )刷新页面后,我们应该会看到 Facebook 用户 ID (UID)。

问题是通过ajax回调重新加载页面后UID仍然为空。但是,如果我再次手动刷新页面,我现在可以看到 UID。

我测试了很多方法来了解问题出在哪里,我发现这个 Facebook 请求存在问题:$me = $facebook->api('/me');

无论如何,我不能没有$me = $facebook->api('/me'); 所以如果你想测试我的脚本并找到问题,这就是你需要的!(不要忘记最后一个 Facebook SDK);-)

任何帮助将不胜感激!谢谢 !

索引.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Facebook Connect</title>
<script src="js/jquery.js"></script>
<?php

/* FACEBOOK APP CONFIGURATION */
$appId = 'YOU_APP_ID';
$appSecret = 'YOUR_APP_SECRET';

define("APPID",$appId);
define("APPSECRET",$appSecret);

/* API CALL */
if (!class_exists('FacebookApiException'))
{
  require_once('inc/facebook.php' );
}

$facebook = new Facebook(array(
   'appId' => APPID,
   'secret' => APPSECRET,
));

$fb_user = $facebook->getUser();

if ($fb_user) {
    try
    {
       $me = $facebook->api('/me');
       $uid = $facebook->getUser();
    }
      catch (FacebookApiException $e)
    {
       //echo error_log($e);
       $fb_user = null;
    }
}
?>
</head>

<body>
<div id="fb-root"></div>
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/fr_FR/all.js#xfbml=1&appId=<?=APPID?>";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

<script type="text/javascript">
    window.fbAsyncInit = function() {
        FB.init({
            appId   : '<?=APPID?>',
            oauth   : true,
            status  : true,
            cookie  : true,
            xfbml   : true
        });
    };

    function fb_connect() {
        alert('FB.getLoginStatus');
        FB.getLoginStatus(function(response) {
            if (response.status === 'connected') {
                var access_token = response.authResponse.accessToken;
                var user_id = response.authResponse.userID;
                //
                window.location.reload();
                //
            } else {
                alert('FB.login');
                FB.login(function(response) {
                    var access_token = response.authResponse.accessToken;
                    var user_id = response.authResponse.userID;
                        $.post('connect.php', function(data) {
                        var obj = $.parseJSON(data);
                        if (obj['error']==0) {
                            alert(obj['message']);
                            window.location.reload();
                        } else {
                            alert(obj['message']);
                        }
                    });
                    //

                }, {
                    scope: 'email, publish_stream, user_birthday'
                });
            }
        });
    }

    function fb_logout() {
        FB.logout(function(response) {
            window.location.reload();
        }); 
    }

    (function() {
      var e = document.createElement('script');
      e.src = document.location.protocol + '//connect.facebook.net/fr_FR/all.js';
      e.async = true;
      document.getElementById('fb-root').appendChild(e);
    }());
</script>
<p>UID : <?=$fb_user?></p>
<?php if ($fb_user) { ?>
<a href="#" onclick="fb_logout();">Disconnect</a>
<?php } else { ?>
<a href="#" onclick="fb_connect();">Facebook connect</a>
<?php } ?>
</body>
</html>

连接.php

<?php
/* FACEBOOK APP CONFIGURATION */
$appId = 'YOUR_APP_ID';
$appSecret = 'YOUR_APP_SECRET';

define("APPID",$appId);
define("APPSECRET",$appSecret);

/* API CALL */
if (!class_exists('FacebookApiException'))
{
  require_once('inc/facebook.php' );
}

$facebook = new Facebook(array(
   'appId' => APPID,
   'secret' => APPSECRET,
));

$fb_user = $facebook->getUser();

if ($fb_user) {
    try
    {
       $me = $facebook->api('/me');
       $uid = $facebook->getUser();
    }
      catch (FacebookApiException $e)
    {
       //echo error_log($e);
       $fb_user = null;
    }
}

/* CALLBACK */
$result = array();

if ($fb_user) {
    $result['error'] = 0;
    $result['message'] = $me['first_name'];;
} else {
    $result['error'] = 1;
    $result['message'] = 'error';
}

echo json_encode($result);
?>
4

1 回答 1

0

对不起,但这不是多余的,我真的需要它来检查数据库中的内容。实际上,如果用户没有在数据库中注册,用户会被重定向到另一个页面,而不是重新加载索引页面

因此,正如我所怀疑的那样,实际上不需要 AJAX 调用。

您也可以重新加载您的index.php,在那里进行数据库检查,然后为成功登录的用户提供内容,或者使用Location标头从那里重定向它们。

无论如何,我需要了解为什么我无法通过手动重新加载来检索我的 FB 信息。这是真正的问题。

那么你应该调查你真正的问题:调试你可能得到的异常,或者使用额外的 AJAX 步骤检查登录流中有什么差异或避免它(比如什么 cookie 什么时候设置,它们是否被发送回下一个请求等)

于 2013-01-10T15:49:53.687 回答