0

使用 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] => 
)

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

4

1 回答 1

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

于 2013-10-17T15:52:01.387 回答