使用JS SDK在Facebook上构建应用程序

时间:2011-08-15 20:07:45

标签: javascript facebook

我正试图在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>
    
  3. 错误

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

4 个答案:

答案 0 :(得分: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
  }
});

您正在使用should not be used on page load的FB.getSession。从那个链接:

  

注意:在页面加载时不应使用此方法。通常,   如果您不确定,使用FB.getLoginStatus()会更安全。

获得权限后,您应该能够进行该查询调用(假设它是正确的)。

如果这不能解决问题,请确保所有应用设置都正确(确认网址,应用ID,等等)

如果这一切都正确则问题出在您的查询中。让我知道,我会看看能否找到问题

答案 1 :(得分:1)

答案 2 :(得分:1)

您必须在access_token的每个请求中加入fql,这不是之前的授权,而是现在的授权。

这就是Facebook所说的:

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

答案 3 :(得分: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'
  },