1

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

但是我想使用官方的 facebook 登录按钮,特别是因为它允许传入语言环境,然后它将被本地化为正确的语言......而且看起来不错!

做了一些研究,似乎php中的登录状态与js中的登录状态不同步,但我只看到了一些代码片段(其中大部分是api的过时版本)。

谁能给我指出正确的方向,我需要在这里做什么才能使 facebook 登录按钮与 $login_url 做同样的事情?

现在我观察到以下行为:

  1. 我打开页面,登录按钮和链接可见,因为 php 代码认为用户未登录
  2. 我单击登录按钮并登录
  3. php代码仍然认为用户没有登录,所以仍然显示登录按钮
  4. 只有在我单击登录链接之前,我才能正确登录并且登录按钮在重新加载时消失。

现在点击按钮只是重新加载页面,甚至不要求用户登录。如果用户使用登录按钮登录,页面的 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>
4

3 回答 3

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;
}); 
                      }

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

于 2013-09-18T13:18:04.000 回答
1

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

在 FB.init 中,您没有设置 xbmfl 默认值,因此它默认为 false,因此不会呈现任何社交图标。只需添加

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

根据facebook 初始化文档: XBMFL:确定是否解析社交插件使用的 XFBML 标签,从而确定是否呈现插件。默认为假。

于 2015-04-20T18:10:18.627 回答
1

尝试使用会话

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

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

    <?php if(isSet($_SESSION['user'])) { ?>
         您的 html 内容在这里
    <?php } ?>

如果会话未启动,只需在页面请求处添加 session_start() 即可。希望这会有所帮助

于 2013-09-18T07:54:56.477 回答