首先,Facebook用户使用Facebook JS SDK登录客户端。
使用以下参数调用FB.init():
{
version : 'v2.0',
appId: '...',
status : true,
cookie : true,
xfbml : false
}
然后,在PHP中,创建一个会话:
$session = (new FacebookJavaScriptLoginHelper())->getSession();
一旦从PHP调用FB API,我仍然可以继续使用js调用FB API。
但是,只要我的页面向服务器发送新命令指示它进行FB API调用,它就不会再次运行,并且FB API说:
请求此资源需要访问令牌。
显然,这再被召唤一次,之后就停止了工作:
$session = (new FacebookJavaScriptLoginHelper())->getSession();
如果用户在浏览器中更新页面,则服务器的下一次调用将再次起作用。我想要的是在不重新加载页面的情况下同时从服务器和浏览器查询FB API。
答案 0 :(得分:0)
它已过时,但可能会帮助某人
<?php
//some code here - requires and uses
FacebookSession::setDefaultApplication($SETTINGS['fbappid'], $SETTINGS['fbsecret']);
$helper = new FacebookJavaScriptLoginHelper();
$session;
try {
$session = $helper->getSession();
} catch(FacebookRequestException $ex) {
//
} catch(\Exception $ex) {
//
}
?>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script>
window.fbAsyncInit = function() {
FB.init({
appId : '<?php echo $SETTINGS['fbappid'] ?>',
xfbml : true,
version : 'v2.0',
status : true,
cookie : true
});
FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
var uid = response.authResponse.userID;
var accessToken = response.authResponse.accessToken;
FB.login(function () {
FB.api('/me', {
fields: 'id'
}, function (response) {
console.log(response);
});
}, {
scope: 'publish_actions'
});
} else if (response.status === 'not_authorized') {
} else {
}
});
};
(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/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
</script>
<div id="fb-root"></div>
<?php
//here url to go to my app
echo "<a href='...'>Sign in to Facebook application</a>";
if ($session) {
echo "<br/>logged in";
}
?>
</body>
</html>
请注意,如果未设置Cookie,则在第二次访问页面后登录。因此需要ajax请求才能正确检查。