我使用PHP SDK开发了一个facebook粉丝页面应用程序并成功运行它。我有一个Fan Gate实现,也就是说,用户必须先喜欢该页面才能使用该应用程序。
到目前为止我无法解决的问题是:我想阻止我的应用程序在Facebook iframe之外运行。截至目前,当用户复制并粘贴URL(iframe src)时,我的应用程序可以在新的浏览器选项卡或窗口中运行。在这一点上,我想给出一条错误消息,例如“此应用只能在Facebook标签页中运行”。
我正在捕捉signed_request,但由于我的应用程序有子页面和例程,我必须将signed_request存储在会话变量中。
有任何建议吗?
答案 0 :(得分:0)
好的,我通常做的是在app_data
的{{1}}字段中提供数据,以了解要加载的页面。 POST时,我在处理有效负载后直接重定向到选项卡。
因此,有两种方法可以请求一个页面,实际上是一个facebook标签:GET和POST。
获取强>
使用GET时,应始终使用facebook URL请求标签。例如:标签的子页面“表单”应该包含以下网址:http://www.facebook.com/pages/xXx/ [page_id]?sk = app_ [app_id]& app_data = form
在服务器端代码中,您在解码signed_request
后识别app_data
中的数据(请参阅1和2)。
在指向表单页面的链接中,还必须添加signed_request
属性。
这样,Facebook重新加载,标签比直接链接子页面时感觉慢。但是您有标识子页面的URL,这是我们的首选。
此外,您可以预期每个GET请求都有target="parent"
。如果没有,则不通过Facebook调用,您可以显示错误消息,或者我建议重定向到您的选项卡(子页面)。
发表强>
POST永远不会有signed_request
。但通常,在浏览时,浏览器会使用GET请求。因此,您可以假设,如果您收到POST请求,则可能来自您自己的表单或黑客尝试。
在这两种情况下,都要检查该请求的有效性值。
如果有效,则将其保存到您的数据库并重定向到“成功”页面。例如。如果您参加比赛,您应该显示一个页面,确保用户他/她已成功参加。
如果数据无效,则会将错误消息保存到会话中并重定向回显示它们的表单。
我总是建议您在POST请求后重定向,无论您是否在facebook标签中。但是在facebook选项卡中,重定向必须使用javascript来完成,因为它在IFRAME中并且您希望整个页面重新加载:
signed_request
发布脚本1:对我来说,表单总是使用POST请求。
Post scriptum 2:如果你不喜欢每次点击重新加载整个facebook“框架”的想法,你可以考虑做一些AJAX魔术,其中请求是“加香”的有额外的数据,你可以将它们识别为“你的”。