2011-08-15 33 views
2

我想在Facebook上構建一個簡單的「應用程序」,它將顯示備用內容,具體取決於用戶是否喜歡我的頁面。使用JS SDK在Facebook上構建應用程序

  1. 爲什麼下面的JS不起作用(不發送響應回來,沒有 response = no like,array = response)?當我在 FB查詢測試器上處理查詢時,它可以工作。
  2. 它爲什麼會產生以下錯誤?

    <div id="fb-root"></div> 
    <script src="http://connect.facebook.net/en_US/all.js"></script> 
    <script> 
        FB.init({ 
        appId : 'APP_ID', 
        status : true, // check login status 
        cookie : true, // enable cookies to allow the server to access the session 
        xfbml : true, // parse XFBML 
        channelUrl : 'http://domain.com/tab/', // channel.html file 
        oauth : false // enable OAuth 2.0 
        }); 
    
    (function($) { 
    
        var session = FB.getSession(); 
         FB.api({ 
          method: 'fql.query', 
          query: 'SELECT uid, page_id FROM page_fan WHERE uid=me() AND page_id=APP_ID' 
         }, 
        function(response) { 
         if(response instanceof Array && response.length > 0) 
          alert("YOU LIKE US!"); 
         else 
          alert("YOU DON'T LIKE US YET!"); 
        }); 
    })(jQuery); 
    </script> 
    

錯誤

Object { error_code="104", error_msg="Requires valid signature", request_args=[7]} 
+0

Facebook會將此信息發送到'signed_request'頁面,這意味着您需要一個服務器端語言來讀取它。不幸的是,JS-SDK不會給你這樣的信息,除非用戶連接到你的應用程序,而不是你所需要的。 – ifaour

回答

3

編輯,除非您正在使用Facebook的應用程序連接(即不會在Facebook上運行的應用程序,您應該不需要<script src="http://connect.facebook.net/en_US/all.js"></script>。許多移動應用程序是一個很好的例子。看看this SO question for more information。任何將通過標籤或Facebook頁面運行的應用程序都不會使用Facebook連接。

您可能想嘗試使用我向您展示的init方法,而不是您正在使用的方法。它應該是這樣的:

你的HTML頁面

<body> 
<!-- Code --> 
<!-- FB Required -->  
<div id="fb-root"></div> 
<script type="text/javascript">iframeReady();</script> 
</body> 

你的JS文件

function iframeReady(){ 
    //Facebook iFrame include 
    window.fbAsyncInit = function() { 
     FB.init({ appId: 'YOURAPPID', status: true, cookie: true, xfbml: true }); 
     FB.Canvas.setAutoResize(); 
     loginUser(); 
    }; 

    (function() { 
     var e = document.createElement('script'); 
     e.async = true; 
     e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js'; 
     document.getElementById('fb-root').appendChild(e); 
    }()); 
} 

您可能需要(我應該早一點注意到)還有一件事取決於你的頁面設置是獲得用戶喜歡的擴展權限。

/* 
* Logs in a user. 
*/ 
function loginUser() { 
    FB.login(function (response) { 
     if (response.session) { 
      if (response.perms) { 
       //User has logged in and accepted permissions 
      } else { 
       //User did not accept permissions 
      } 
     } else { 
      //User did not login 
     } 
    }, { perms: "user_likes" }); 
} 

你也可以看看FB.getLoginStatus

FB.getLoginStatus(function(response) { 
    if (response.authResponse) { 
    // logged in and connected user, someone you know 
    } else { 
    // no user session available, someone you dont know 
    } 
}); 

您正在使用FB.getSession,這should not be used on page load。從該鏈接:

注意:您不應該在頁面加載時使用此方法。通常,如果您不確定,則使用FB.getLoginStatus()更安全。

一旦你有權限,你應該能夠進行查詢調用(假設它是正確的)。

如果不解決任何事情,然後確保你的應用程序設置是正確的(具體網址,應用程序ID,等。)

如果這是正確的,則問題是與您的查詢。讓我知道,我會看看我能找到問題

+0

我改變了我的代碼根據你的建議,但我仍然得到相同的錯誤... – howtodothis

+0

啊,好的。這是一個將在Facebook標籤中運行的應用程序,或者這行有多於一個實例:''如果應用程序在facebook內部運行,然後刪除該行,並確保沒有其他事件,如果沒有該行(如果你生成一個Facebook的'喜歡'按鈕,那麼他們通常會將該行附加到開頭 –

+0

我還添加了一些在我編輯的東西 –

1

你必須包括你的access_tokenfql每一個請求連接,這不是一個任務,但前現在它是。

這是Facebook表示:

GET /fql?q=SELECT+uid2+FROM+friend+WHERE+uid1=me()&access_token=... 
1

附加ACCESS_TOKEN到您的API請求。

FB.api({ 
     method: 'fql.query', 
     access_token : [YOUR TOKEN], 
     query: 'SELECT uid, page_id FROM page_fan WHERE uid=me() AND page_id=APP_ID' 
    }, 
相關問題