2013-10-17 53 views
0

使用php sdk,我檢查一個標籤內的用戶是否喜歡相應的頁面。異步獲取Facebook標籤中的用戶數據?

如果我把下面的代碼中的index.php,並使用該頁面作爲我的網頁標籤的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); 
     } 
    ); 

此示例使用的角度來訪問它,但我什麼JavaScript庫使用可能無所謂。

當我通過javascript訪問信息Facebook似乎沒有得到我喜歡的頁面信息。添加一個print_r($ facebook);在頁面上,我以便在檢索相同的值,如果我在Facebook的標籤可不是:

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

我可以訪問theese值asynchronosly不知何故?

+0

_「我想以異步方式實現此目的」_ - 爲什麼?在頁面標籤應用程序中「異步」執行此操作的好處是什麼? – CBroe

+0

頁面選項卡應用程序包含一個表單。如果您喜歡該頁面,您只能假定能夠提交表格。 – Himmators

+0

所以你檢查應用程序加載,服務器端,如果用戶已經喜歡的頁面 - 如果沒有,你不會給他的形式在第一位,但一個消息,而不是他應該首先喜歡的頁面。喜歡通過頂部的Like按鈕頁面將重新加載您的應用程序。這一次,你的支票會發現他喜歡這個頁面,你向他呈現表格並讓他提交......不需要在這裏異步做任何事情。 – CBroe

回答

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(使用角度,無論如何,所以您的應用程序必須是基於前端)。您的服務器不應該被用作Open Graph和您的應用程序之間的中間步驟,您將複製沒有優勢的代碼。

這不適用於page.liked屬性,因爲它是在應用加載時隨signed_request一起發送的頁面屬性(不是用戶)。

+0

如果你登錄用戶,你還必須要求'user_likes'權限以查詢他是否喜歡當前頁面(或者任何,對於這個問題) - 因爲頁面信息不是登錄的'signed_request'的一部分通過'FB.login'返回。 – CBroe

+0

@CBroe在上下文這樣的頁面中,你是對的。我用一個更通用的方式解釋了這裏提出的整體概念(爲什麼數據在ajax請求中不可用)。 –

+0

在頁面標籤應用程序中'signed_request'的好處是你不需要'user_likes'權限來檢查用戶是否喜歡那個特定的頁面 - 並且由於該權限允許訪問用戶的喜歡,所以很有可能你不會獲得該許可,而在'signed_request'中,如果你只希望爲應用程序運行的頁面提供免費信息, – CBroe