在Facebook标签中异步获取用户数据?

时间:2013-10-17 14:26:39

标签: javascript facebook facebook-javascript-sdk

使用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'];
?>

它输出&#39; 1&#39;。

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

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

此示例使用的是角度,但我使用的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] => 
)

我能以某种方式异步访问theese值吗?

1 个答案:

答案 0 :(得分: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是喜欢的网址,因此您只需将其与网址网址(facebook.com/MyPage)进行比较,然后您就会知道用户是否点击了应用中的“赞”按钮。


在旁注中,通常最简单的请求用户信息的方法是登录用户(OAuth),并将请求直接从JS传递到Open Graph(无论如何都使用Angular,因此您的应用必须已经基于前端) 。您的服务器不应该用作Open Graph和您的应用程序之间的中间步骤,您将在没有优势的情况下重复代码。

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