我正在尝试创建一个用户可以登录然后喜欢我的页面的php页面。如果我在块中使用login_url,它的效果很好。
但是我想使用官方的facebook登录按钮,特别是因为它允许传入区域设置,然后它将被本地化为正确的语言....它看起来很棒!
进行一些研究,似乎php中的登录状态与js中的登录状态不同步,但我只看到了一些代码(大部分都是过时版本的api)。 / p>
任何人都可以指出我正确的方向,我需要做什么来使Facebook登录按钮与$ login_url做同样的事情?
现在我发现以下行为:
现在点击该按钮只是重新加载页面,甚至不要求用户登录。如果用户使用登录按钮登录,则页面的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> <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>
答案 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。