Facebook登录链接有效,但不是登录按钮,任何想法为什么?

时间:2013-09-10 06:16:30

标签: php facebook facebook-graph-api facebook-php-sdk

我正在尝试创建一个用户可以登录然后喜欢我的页面的php页面。如果我在块中使用login_url,它的效果很好。

但是我想使用官方的facebook登录按钮,特别是因为它允许传入区域设置,然后它将被本地化为正确的语言....它看起来很棒!

进行一些研究,似乎php中的登录状态与js中的登录状态不同步,但我只看到了一些代码(大部分都是过时版本的api)。 / p>

任何人都可以指出我正确的方向,我需要做什么来使Facebook登录按钮与$ login_url做同样的事情?

现在我发现以下行为:

  1. 我打开页面,登录按钮和链接可见,因为php代码认为用户未登录
  2. 我点击登录按钮并登录
  3. php代码仍然认为用户未登录,因此仍显示登录按钮
  4. 直到我点击登录链接才能正确登录,登录按钮会在重新加载时消失。
  5. 现在点击该按钮只是重新加载页面,甚至不要求用户登录。如果用户使用登录按钮登录,则页面的php部分认为用户未登录...

    <?php 
    
    require("facebook/facebook.php");
    
    $locale = "en_US"; // TODO
    
    $connect_facebook_url = "'//connect.facebook.net/" . $locale . "/all.js#xfbml=1&appId=XXXXXXXXXXXXXXXXXXXXXXX'";
    
    $facebook = new Facebook(array(
      "appId"  => "XXXXXXXXXXXXXX",
      "secret" => "XXXXXXXXXXXXXXXXX",
      "cookie" => true,
    ));
    
    $access_token = $facebook->getAccessToken(); 
    
    // Get User ID
    $user_id = $facebook->getUser();
    
    if($user_id) 
    {
      // We have a user ID, so probably a logged in user.
      // If not, we'll get an exception, which we handle below.
      try 
      {
        $user_profile = $facebook->api('/me','GET');
    
        $likes = $facebook->api(array( 
          'method' => 'fql.query',
          'query' => 'SELECT page_id FROM page_fan WHERE uid = "'
                     . $user_profile['id']
                     . '" AND page_id="XXXXXXXXXXXXX"', )); 
    
      } 
      catch(FacebookApiException $e) 
      {
        // If the user is logged out, you can have a 
        // user ID even though the access token is invalid.
        // In this case, we'll get an exception, so we'll
        // just ask the user to login again here.
        $login_url = $facebook->getLoginUrl(); 
        error_log($e->getType());
        error_log($e->getMessage());
      }   
    } 
    else 
    {
      // No user, print a link for the user to login
      $login_url = $facebook->getLoginUrl();
    }
    
    if(count($likes) > 0) 
    {
      $likes_result = "User likes this page"; 
    }
    else 
    {
      $likes_result = "User doesnt like this page";
    }
    
    if($login_url)
    {
      $login_string = '<a href="' . $login_url . '">' . 'IDST_MENUITEM_SIGN_IN' . '</a>';
    }
    
    ?>
    
    <html>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/> 
    <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 = 
        <?php echo $connect_facebook_url; ?>
        ;
        fjs.parentNode.insertBefore(js, fjs);
      }(document, 'script', 'facebook-jssdk'));
    </script>
    
    <body bgcolor="#000000">
    
    <div align="center">
      <table>
      <tbody>
      <tr>
        <td>    
          <img src="http://www.myapp.com/wp-content/uploads/2012/05/MyApp-logo.png"/>
        </td>
        <td style="align:left; vertical-align:middle">
          <p style="font-family:segoe ui;color:white;font-size:40px;">MyApp</p>
        </td>
      </tr>
      </tbody></table>
    </div>
    
    <p>&nbsp<p>
    
    <div align="center" style="font-family:segoe ui;color:white;font-size:20px;">
      <?php if ($login_string) : ?>
        <div class="fb-login-button" size="xlarge" data-width="200"></div>
      <?php else: ?>
        <div class="fb-like" 
             data-href="https://www.facebook.com/MyApp" 
             data-width="200" 
             data-colorscheme="dark" 
             data-show-faces="true" 
             data-send="true">
        </div>
      <?php endif; ?>
    
      <br>
    
      <p>
        <?php echo $likes_result; ?>
      </p>
      <p>
        <?php echo 'Please <a href="' . $login_url . '">login.</a>'; ?>
      </p>
    </div>
    
    </body>
    </html>
    

3 个答案:

答案 0 :(得分:2)

你去吧。 希望这有帮助

<html>
  <head>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <style type="text/css">
      div#container_notlike, div#container_like {
        display: none;
      }
    </style>
  </head>
  <body>
    <div id="fb-root"></div>
    <script>
      window.fbAsyncInit = function() {
        FB.init({
          appId      : 'YOUR_APP_ID', // App ID
          channelUrl : 'http(s)://YOUR_APP_DOMAIN/channel.html', // Channel File
          status     : true, // check login status
          cookie     : true, // enable cookies to allow the server to access the session
          xfbml      : true  // parse XFBML
        });

        FB.getLoginStatus(function(response) {
          var page_id = "YOUR_PAGE_ID";
          if (response && response.authResponse) {
            var user_id = response.authResponse.userID;
            var fql_query = "SELECT uid FROM page_fan WHERE page_id = "+page_id+"and uid="+user_id;
            FB.Data.query(fql_query).wait(function(rows) {
              if (rows.length == 1 && rows[0].uid == user_id) {
                console.log("LIKE");
                $('#container_like').show();
              } else {
                console.log("NO LIKEY");
                $('#container_notlike').show();
              }
            });
          } else {
            FB.login(function(response) {
              if (response && response.authResponse) {
                var user_id = response.authResponse.userID;
                var fql_query = "SELECT uid FROM page_fan WHERE page_id = "+page_id+"and uid="+user_id;
                FB.Data.query(fql_query).wait(function(rows) {
                  if (rows.length == 1 && rows[0].uid == user_id) {
                    console.log("LIKE");
                    $('#container_like').show();
                  } else {
                    console.log("NO LIKEY");
                    $('#container_notlike').show();
                  }
                });
              } else {
                console.log("NO LIKEY");
                $('#container_notlike').show();
              }
            }, {scope: 'user_likes'});
          }
        });
      };

      // Load the SDK Asynchronously
      (function(d){
        var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
        js = d.createElement('script'); js.id = id; js.async = true;
        js.src = "//connect.facebook.net/en_US/all.js";
        d.getElementsByTagName('head')[0].appendChild(js);
      }(document));
    </script>

    <div id="container_notlike">
      YOU DON'T LIKE ME :(
    </div>

    <div id="container_like">
      YOU LIKE ME :)
    </div>

  </body>
</html>

将“YOUR_PAGE_ID”替换为您的网页ID。

if (rows.length == 1 && rows[0].uid == user_id) {
                        console.log("LIKE");
                        $('#container_like').show();
                        //window.location=YOURPHP.php    

如果您使用window.location,您将被重定向到YOURPHP.pho,如果您不想要

use ajax here in the code.

$.post("database.php",{userid: user_id, likes:1"},
  function(data,status){
  console.log(data);
console.log("LIKE");
  $('#container_like').show();
  posttofacebook(caption);
  document.getElementById("captionresult").innerHTML=data;
}); 
                      }

如果您对此有任何疑问或疑问,请随时联系。

答案 1 :(得分:1)

尝试使用会话

if($user_id) {
    try {
        $user_profile = $facebook->api('/me','GET');
        $_SESSION['user'] = $user_profile['id'];
    }
}

然后在您的html页面上,您可以添加:

    <?php if(isSet($_SESSION['user'])) { ?>
         Your html content here
    <?php } ?>

如果会话未启动,只需在页面的乞讨处添加session_start()。希望这会有所帮助

答案 2 :(得分:1)

我遇到了同样的问题并通过简单的一行设置解决了这个问题:

在FB.init中

你没有设置xbmfl默认值,所以它默认为false,因此不呈现任何社交图标。只需添加

$facebook = new Facebook(array(
  "appId"  => "XXXXXXXXXXXXXX",
  "secret" => "XXXXXXXXXXXXXXXXX",
  "cookie" => true,
  "xbmfl" => true
));

根据facebook initialization documentation: XBMFL:确定是否解析社交插件使用的XFBML标记,从而确定是否呈现插件。默认为false。