我正在尝试使用ajax使用PHP SDK将图像发布到facebook,(这是我第一次尝试ajax上传),但是当用户单击按钮时,如果用户已经授权应用程序并登录,则不会显示FB App.授权对话框 图像发布成功: 这是我的代码:
view.php?id=xxxx
document.getElementById("uploadfb").onclick=function(e){
e.preventDefault();
//id hidden input type in a form
id = $("#id").val();
$.ajax({
type: "GET",
url: "uploadfb.php",
data: {id: id},
dataType : 'json',
forceIframeTransport: true, //force use iframe or will no work
autoUpload : true,
success: function(result){
alert("Success");
},
error: function(errorThrown){
alert("Error");
}
});
return false;
};
上传FB.php包含所有必要的FB登录代码和图像发布
$id=$_GET['id'];
require_once 'config.php';
$user = $facebook->getUser();
if($user)
{
// We have a user ID, so probably a logged in user.
try {
$user_profile = $facebook->api('/me');
}
catch (FacebookApiException $e) {
error_log($e);
$user = null;
}
} else {
$params = array(
'scope' => 'publish_stream,user_photos'
);
$loginUrl = $facebook->getLoginUrl($params);
header('location:' .$loginUrl);
}
///// then image post code
if($user)
{
$args['image'] = '@' . realpath($id);
$post = $facebook->api('/me/photos', 'post', $args);
}
当用户已经授权应用程序时,单击上传按钮图像上传到Facebook并返回成功。当新用户单击然后Facebook应用程序授权对话框未出现时出现问题,它返回错误
还尝试将 getLoginUrl 参数中的重定向 uri 更改为 uploadfb.php?id=xxxxx但仍然没有显示应用程序授权。
出于测试目的,我放置了一个单独的按钮"使用Facebook登录",只有登录代码
登录.php
require_once 'config.php';
$user = $facebook->getUser();
if($user)
{
// We have a user ID, so probably a logged in user.
try {
$user_profile = $facebook->api('/me');
}
catch (FacebookApiException $e) {
error_log($e);
$user = null;
}
} else {
$params = array(
'scope' => 'publish_stream,user_photos'
);
$loginUrl = $facebook->getLoginUrl($params);
header('location:' .$loginUrl);
}
我得出的结论是,身份验证对话框未出现在 ajax 请求中。现在,当用户第一次使用登录按钮登录时,然后单击上传按钮 结果为成功图片发布成功。但是,如果直接(未经第一次授权)新用户,请单击"上传"按钮,则会出现错误。
我不想放置两个单独的按钮,因此用户第一次单击登录,然后上传按钮。当用户单击上传按钮时,如果用户尚未进行身份验证,则希望打开我的应用程序授权对话框窗口,该窗口在此处不起作用。
Ajax 代码中缺少某些内容? 或者无法在 Ajax 请求中显示身份验证对话框。对此的任何替代解决方案也将有所帮助。感谢您抽出时间。
您可以尝试使用 JavaScript Login 方法来查看您的 Ajax 调用是否有效,而不是使用 PHP login 方法:
document.getElementById("uploadfb").onclick=function(e){
e.preventDefault();
// id hidden input type in a form
id = $("#id").val();
FB.login(function(response) {
if (response.authResponse) {
$.ajax({
type: "GET",
url: "uploadfb.php",
data: {id: id},
dataType : 'json',
forceIframeTransport: true, //force use iframe or will no work
autoUpload : true,
success: function(result){
alert("Success");
},
error: function(errorThrown){
alert("Error");
}
});
});
} else {
console.log('User cancelled login or did not fully authorize.');
}
});
return false;
};
我基本上用FB.login()方法包装了Ajax调用,所以要求用户先登录,然后进行Ajax调用以上传文件。它现在应该适用于已登录和非登录用户。