【问题标题】:Asynchronously get user data in facebook tab?在 facebook 选项卡中异步获取用户数据?
【发布时间】:2013-10-21 22:56:13
【问题描述】:

使用 php sdk,我检查标签内的用户是否喜欢相应的页面。

如果我将以下代码放入 index.php 并将该页面用作我的 page-tab-url,

<?php
require_once("facebook/facebook.php");

// Create our application instance
// (replace this with your appId and secret).
$facebook = new Facebook(array(
  'appId'  => '1399475990283166',
  'secret' => 'mysercret',
  'cookie' => true
));

$signed_request = $facebook->getSignedRequest();
echo $signed_request['page']['liked'];
?>

它输出'1'。

我想改为异步实现,所以我将 php 放在一个单独的文件中,并尝试使用 ajax 来访问它

$http.post('/facebook/likes.php').
    success(function(data){
        console.log(data);
    }).error(function(data){
        console.log(data);
        }
    );

此示例使用 angular,但我使用的 javascript 库可能无关紧要。

当我使用 javascript 访问信息时,Facebook 似乎没有获得我喜欢该页面的信息。添加一个 print_r($facebook);在页面上,我正在检索与不在 facebook-tab 中相同的值:

(
    [sharedSessionID:protected] => 
    [appId:protected] => 1399475990283166
    [appSecret:protected] => 679fb0ab947c2b98e818f9240bc793da
    [user:protected] => 
    [signedRequest:protected] => 
    [state:protected] => 
    [accessToken:protected] => 
    [fileUploadSupport:protected] => 
    [trustForwarded:protected] => 
)

我可以以某种方式异步访问这些值吗?

【问题讨论】:

  • “我想改为异步实现” – 为什么?在页面标签应用程序中“异步”执行此操作有什么好处?
  • 页面标签应用程序包含一个表单。如果您喜欢该页面,则仅假设您能够提交表单。
  • 所以你检查应用程序负载,服务器端,如果用户已经喜欢该页面 - 如果没有,你首先不要给他表单,而是一条消息,而不是他应该首先喜欢该页面。通过顶部的“赞”按钮赞页面将重新加载您的应用。这一次,你的check会发现他点赞了这个页面,你把表格给他,让他提交……这里根本不需要异步做任何事情。

标签: javascript facebook facebook-javascript-sdk


【解决方案1】:

这是因为只有当您可以访问signed_request 令牌时,您才会作为 Facebook 应用程序登录。此令牌与初始请求一起发送(作为 POST 参数),但不在任何 cookie 中。

使用您的实际代码最简单的方法是在您发出的每个 ajax 请求中重新发送此签名请求参数,以便服务器和 Facebook SDK 可以访问该信息。

但只是为了检查用户是否喜欢当前页面。我建议您直接在页面上打印数据,以便从一开始就可以使用。伪例子:

<script>
  window.data = {};
  window.data.page_liked = <?= encode_json((boolean)$signed_request['page']['liked']) ?>;
</script>

要知道用户在启动页面上是否喜欢该页面,您可以在 facebook 事件上放置一个侦听器:

FB.Event.subscribe("edge.create", function( response ) {`
  if ( response.match(/* RegExp matching your FB page url */) ) {
    // user liked!
  }
});

response 是被点赞的 URL,因此您只需将其与您的页面 url (facebook.com/MyPage) 进行比较,然后您就可以知道用户是否在您的应用程序中点击了点赞按钮。


附带说明,通常请求用户信息最简洁的方法是登录用户 (OAuth),然后将请求直接从 JS 传递到 Open Graph(无论如何您都使用 Angular,因此您的应用程序必须已经基于前端) .您的服务器不应用作 Open Graph 和您的应用程序之间的中间步骤,您将重复代码而没有任何好处。

这不适用于page.liked 属性,因为它是在应用加载时与signed_request 一起发送的页面属性(不是用户属性)。

【讨论】:

  • 如果您登录用户,您还必须请求user_likes 权限以及查询他是否喜欢当前页面(或任何,就此而言) - 因为页面信息是 不是通过FB.login登录返回的signed_request的一部分。
  • @CBroe 在类似上下文的页面中,您是正确的。我正在以更通用的方式解释这里提出的整体概念(为什么 ajax 请求中没有数据)。
  • 在页面标签应用程序中使用signed_request 的好处是,您不必请求user_likes 权限来检查用户是否喜欢该特定页面 - 因为该权限允许访问所有用户的喜欢,很有可能您不会获得该权限,而在signed_request中,如果您只希望应用程序运行的页面获得该信息,则您可以免费获得该信息开。
  • @CBroe 我编辑了我的答案以便更清楚。你是对的,我的回答在问题的背景下令人困惑。
  • @SimonBoudrias 感谢您提供非常广泛和有见地的回答。我可能会遗漏一些东西,但是通过您提供的代码示例,我看到了以下问题。不喜欢的用户访问选项卡,在页面加载时打印信息,用户喜欢该页面,但在重新加载页面之前信息不会更新,(在我的情况下,女巫是一个问题)。
猜你喜欢
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
相关资源
最近更新 更多