用PHP发布Facebook状态-需要$_Post中的帮助



在我的网站上,我有一些下面有按钮的文本,这样用户就可以直接将该文本作为他们的facebook状态发布。我使用Form post请求将该状态发布到我的fbapp。

问题是,当用户第一次使用此功能时,在用户允许后会出现"应用程序请求权限"窗口,然后我的fbapp页面会出现,该页面在FORM操作中设置,我通过POST发送的文本会作为NULL值发布到该页面

但当用户再次使用此功能时(即出现权限窗口dnt),它会直接进入我的fbapp页面文本,并成功发布为状态。

使用的代码是:

<?php if(isset($_POST['mystatus']))
{
$status = $_POST['mystatus'];
}
require_once 'facebook.php';
$facebook = new Facebook(array(
'appId' => xxxxxx,
'secret' => xxxxxxxxxx,
));
$user = $facebook->getUser();
if($user) {
} else {
$params = array(
'scope' => 'publish_stream'
);
$loginUrl = $facebook->getLoginUrl($params);
header('location:' .$loginUrl);
} ?>
<html>
<body>
if ($user) {
...................................
rest of the usual php sdk code here
....................................
}
else {
echo("<script> top.location.href='" . $loginUrl . "'</script>");
}
</body>
</html>

如果用户已经授予了对App&第二次使用此功能,然后应用程序请求权限窗口dnt出现文本状态,发布为$_POST['mystatus'],并在用户id上成功更新。

问题是,只有当用户允许应用程序后出现"应用程序请求权限"窗口时,$_POST['mystatus']才会获得值,并且状态在用户id上更新为NULL

请帮助解决这个问题。

如果用户禁用或删除应用程序我还想知道如果用户不允许应用程序请求,我如何在页面上显示错误消息。&如果以后使用后删除应用程序,则页面显示此错误:

Fatal error: Uncaught OAuthException: Error validating access token: User xxxxxxxxxxx has not authorized application xxxxxxxxxxxxxxxxxxx. thrown in base_facebook.php on line 1106

有没有办法向用户显示自定义消息而不是这个错误?

只有当用户允许应用程序后出现"应用程序请求权限"窗口时,问题才会出现,然后$_POST['mystatus']无法获取值,并且状态在用户id上更新为NULL。

当然$_POST['mystatus']中没有值,因为发送此参数的请求已经成为过去。

情况如下:

  • 用户将表单内容发布到您的服务器。在处理该请求和仅处理该请求时,您可以通过$_POST访问此数据。

  • 但是用户没有登录,所以您重定向到Auth对话框。这意味着,此时脚本执行结束,客户端(浏览器)发出另一个请求。此请求将发送到Facebook,成功登录后,客户端将再次重定向回您的应用程序服务器。

  • 最后一次重定向会导致客户端向服务器发出另一个请求(确切地说是GET请求)。这与你的应用程序收到的第一个POST请求无关——它们之间绝对没有联系。当然,你无法访问很久以前以完全不同的请求发布到你的应用程序中的数据。


这些是使用HTTP的基本知识,如果您想开发web应用程序,您应该熟悉这些知识HTTP是一种"无状态"协议–请查找它的实际含义!


现在我们已经介绍了解决方案的这些基础知识:

引入一种方法来"识别"在无状态协议HTTP中彼此具有某种逻辑连接的同一客户端的请求,即使用一种称为"会话">的机制。(我不想在这里讨论理论细节,但PHP有一个易于使用的会话机制;如果你不熟悉,也请阅读。)

因此,您可以做的是将通过POST在第一个请求中接收到的数据放入会话中,并将其存储在那里以供以后检索。

然后,如果用户尚未登录,则将其重定向到"身份验证"对话框。一旦用户从那里"回来",你检查你的会话,就会发现,"啊,还有一些数据是我早些时候收到的,还有另一个请求,还没有处理">——然后你就这样做,处理它:从会话中检索状态消息,发布到Facebook,然后将其从会话中删除(这样您就不会在下一次加载页面时再次处理它)。

最新更新