如何组合两者的示例
https://github.com/facebook/php-sdk/blob/master/examples/example.php和 https://github.com/facebook/connect-js/blob/master/examples/jquery/login.html
最终目标是我们可以使用jQuery登录,不知何故,以下行仍然可以使用
$user = $facebook->getUser();
我目前注意到的是,当我使用JavaScript登录时,它不会使用PHP设置会话,因此,它与基于PHP的SDK不兼容(因此在这种情况下$ user仍然为null)
我不是<a href="$facebook->getLoginUrl()">Login with Facebook</a>
的忠实粉丝,
因为它会导致浏览器加载不同的页面(Facebook登录),然后重定向回Web应用程序。如果我可以为用户加载一个弹出框来登录,然后透明地重定向回我的网络应用程序,那就更理想了。因此,我将非常感谢有关如何实现此用户体验的任何建议。谢谢!
答案 0 :(得分:15)
不确定你是否有这个工作。当前的JS API具有保存cookie的配置,因此服务器可以读取它:
FB.init({
appId : 'YOUR APP ID',
cookie : true
});
现在,在PHP中,您可以执行以下操作来使用JS中的会话:
// Read the cookie created by the JS API
$cookie = preg_replace("/^\"|\"$/i", "", $_COOKIE['fbs_' . FB_APP_ID]);
parse_str($cookie, $data);
// Startup the Facebook object
$fb = new Facebook(array(
'appId' => FB_APP_ID,
'secret' => FB_APP_SECRET
));
// Say we are using the token from the JS
$fb->setAccessToken($data['access_token']);
// It should work now
var_dump($fb->getUser());
希望它有所帮助。
答案 1 :(得分:12)
我只使用Facebook登录按钮 - https://developers.facebook.com/docs/reference/plugins/login/
一旦用户使用该登录(如果他们尚未登录)并授予对您的应用程序(网站)的访问权限,PHP-SDK应该可以毫无困难地使用Facebook会话和API。
我刚尝试使用新版本的3.0 PHP SDK,它肯定是不正常工作。在developer blog
上找到了这个如果您使用JavaScript SDK与PHP SDK一起登录,则需要等待JavaScript SDK升级(即将在4周内完成)。由于cookie格式的改变,PHP SDK 3.0.0版不会与当前的JavaScript SDK配合使用。
换句话说,在更新JS SDK之前使用v2 PHP SDK。
答案 2 :(得分:1)
听起来像facebook没有在正确的时间解决这个问题(因为他们说https://developers.facebook.com/blog/post/503)。
这是关于js sdk的最新信息 https://developers.facebook.com/blog/post/525/
答案 3 :(得分:1)
经过长时间的搜索,我发现这解决了我的问题,即PHP SDK没有拿起Facebook会话。显然,Javascript SDK没有以正确的方式设置会话。将其添加到您的auth.login
eventlistener:
FB.Event.subscribe('auth.login', function(response) {
FB._oauth = false;
FB.Cookie.setEnabled(true);
FB.Auth.setSession(response.authResponse, response.status);
FB._oauth = true;
window.location.reload();
});
此外,请确保将App Domain设置为与您的Cookie域匹配。修好这些物品后,它终于奏效了。
修改强> 今天早上,一切都很好。当我刚刚测试更多时,我发现我必须编辑base_facebook.php以确保对Facebook的请求不会超时。我的猜测是因为我在我的本地机器上进行测试,连接速度不够快,无法及时完成。这解释了奇怪的行为,有时它会,有时它不起作用。
更改第128行$ CURL_OPTS数组中的connecttimeout:
public static $CURL_OPTS = array(
CURLOPT_CONNECTTIMEOUT => 20,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
CURLOPT_USERAGENT => 'facebook-php-3.1',
);
答案 4 :(得分:0)
在SDK的第4版中,它可以自动使用JavaScript SDK。您只需使用FacebookJavaScriptLoginHelper
:
$helper = new FacebookJavaScriptLoginHelper(); // Get access token from JS SDK
try {
$session = $helper->getSession();
} catch(FacebookRequestException $e) {
// When Facebook returns an error
echo "Exception occured, code: " . $e->getCode();
echo " with message: " . $e->getMessage();
} catch(\Exception $e) {
// When validation fails or other local issues
echo "Exception occured, code: " . $e->getCode();
echo " with message: " . $e->getMessage();
}
// If logged in
if($session) {
// Get user profile
try {
$user_profile = (new FacebookRequest(
$session, 'GET', '/me'
))->execute()->getGraphObject(GraphUser::className());
print_r($user_profile);
} catch(FacebookRequestException $e) {
echo "Exception occured, code: " . $e->getCode();
echo " with message: " . $e->getMessage();
}
}
无需乱搞饼干!