0

Facebook の接続/切断リンクがあります。ユーザーが「Facebook 接続」リンク ( 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 を忘れないでください) ;-)

どんな助けでも大歓迎です!ありがとう !

index.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>

connect.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 呼び出しは実際には必要ありません。

をリロードし、そこでデータベースをチェックしてから、正常にログインしたユーザーのコンテンツを出力するか、 Locationヘッダーindex.phpを使用してそこからリダイレクトすることもできます。

とにかく、手動ではなく動的にリロードしても FB 情報を取得できない理由を理解する必要があります。これが本当の問題です。

それでは、実際の問題を調査する必要があります。発生している可能性のある例外をデバッグするか、その追加の AJAX ステップを使用するか、それを回避して、ログイン フローにどのような違いがあるかを確認します (どの Cookie がいつ設定されるか、次のリクエストなど)

于 2013-01-10T15:49:53.687 に答える