我正在使用PHP SDK 2.1.2并使用标准http://connect.facebook.net/en_US/all.js作为JS SDK。
这就是我想要实现的目标:
1)初始化JS Sdk,使用(email,user_location,user_birthday)调用Fb.UI,方法:' oauth',作为响应,如果用户成功授予权限,则对服务器执行ajax调用,然后使用PHP-SDK调用Graph API并获取所需的数据。 (好吧,您可能会争辩通过JS SDK调用图形API,但当前场景要求我使用PHP SDK)
问题
通过ajax调用的文件没有初始化会话并且我得到null,而facebook sdk理想情况下应该加载cookie并且具有活动会话,因为已经在客户端授予了权限。
我的代码
主文件
<?php
session_start();
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
require 'src/facebook.php';
// Create our Application instance (replace this with your appId and secret).
$facebook = new Facebook(array(
'appId' => 'xxxxxxxxxxxxxxxxxxxxxxxx',
'secret' => 'yyyyyyyyyyyyyyyyyyyyyyyy',
'cookie' => true,
));
$session = $facebook->getSession();
$me = null;
// Session based API call.
if ($session) {
try {
$uid = $facebook->getUser();
$me = $facebook->api('/me');
print_r($me);
} catch (FacebookApiException $e) {
error_log($e);
}
}
&GT;
<!doctype html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
<head>
<title>php-sdk</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js">
</script>
</head>
<body>
<input type="button" onclick="getpermission();"/>
<!--
We use the JS SDK to provide a richer user experience. For more info,
look here: http://github.com/facebook/connect-js
-->
<div id="fb-root"></div>
<script type="text/javascript" src="http://connect.facebook.net/en_US/all.js"></script>
<script type="text/javascript">
FB.init({
appId : '<?php echo $facebook->getAppId(); ?>',
session : <?php echo json_encode($session); ?>, // don't refetch the session when PHP already has it
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : true // parse XFBML
});
function getpermission(){
FB.ui({
method: 'oauth',
client_id: <?php echo $facebook->getAppId(); ?>,
perms: 'email,user_location,user_birthday'
},function(permObj) {
if(permObj){
$.ajax({
type: "POST",
url: 'page2.php',
dataType:'text',
success: function(data) {
return;
},
error:function (xhr, ajaxOptions, thrownError){
alert(xhr.status);
alert(thrownError);
}
});
}
});
}
</script>
</body>
通过AJAX调用文件
<?php
session_start();
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
require 'src/facebook.php';
// Create our Application instance (replace this with your appId and secret).
$facebook = new Facebook(array(
'appId' => 'xxxxxxxxxxxxxxxx',
'secret' => 'yyyyyyyyyyyyyyyyyyyyyyyyyyyy',
'cookie' => true,
));
$session = $facebook->getSession();
$me = null;
// Session based API call.
if ($session) {
try {
$uid = $facebook->getUser();
$me = $facebook->api('/me');
print_r($me);
} catch (FacebookApiException $e) {
error_log($e);
}
}
echo "hello";
?>
如果你在上面的例子中看到,我应该在警告框中获取整个/ me对象而不是我得到&#34;你好&#34;。我不知道为什么这不起作用?我错过了什么?
场景: - 如果我在授予权限后执行页面重新加载(top.location.href),我会获得所需的对象,但我们正在尝试避免使用此机制重新加载。我还尝试设置所需的P3P标头,因为我认为可能存在一些cookie问题,但仍然无法加载。
另外,我已经尝试过使用PHP SDK 2.1.1,2.1.2,3.0.1,我听说过某些新的PHP-SDK还没有与JS SdK兼容,这是真的吗?
提前致谢。
答案 0 :(得分:0)
您无法使用AJAX调用设置cookie:通过域A在域B上设置第三方cookie要求域B上的页面在域A上获取页面的行为,您的ajax调用没有做。
我建议不要尝试使用cookie,而是从响应oauth对话框(permObj->access_token
获取访问令牌,除非我错了,我可以)并将其作为请求发布您的AJAX调用参数。然后,您可以使用令牌值调用$facebook->setAccessToken
方法,并且您应该全部设置。