FB.ui拼图:不一致的错误代码191 ...(似乎FB.init经常不起作用)

时间:2012-06-28 23:36:04

标签: facebook facebook-graph-api facebook-javascript-sdk

我正在使用FB.ui():

<script>
      window.fbAsyncInit = function() {
        FB.init({
          appId      : '##########', // App ID
          channelUrl : '//www.xxxxxxxxxx.com/channel.php', // Channel File
          status     : true, // check login status
          cookie     : true, // enable cookies to allow the server to access the session
          xfbml      : true  // parse XFBML
        });

        // Additional initialization code here
      };

      // Load the SDK Asynchronously
      (function(d){
         var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
         if (d.getElementById(id)) {return;}
         js = d.createElement('script'); js.id = id; js.async = true;
         js.src = "//connect.facebook.net/en_US/all.js";
         ref.parentNode.insertBefore(js, ref);
       }(document));
    </script>

然后,这是发送消息的链接:

<a href='#' onClick="
        FB.ui({
          method: 'send',
          name: 'Bla bla bla',
          link: 'http://www.xxxxxxxxxxx.com',
          to: ###########,
          //redirect_uri: 'http://www.xxxxxxxxxxx.com/fb/'
          });
        ">Send a message</a>

问题: 这对我和我测试过的每台计算机/浏览器都很有吸引力。但我的客户端经常收到以下错误消息:

API Error Code: 191
API Error Description: The specified URL is not owned by the application
Error Message: redirect_uri is not owned by the application

enter image description here

这让我完全难过!我的代码有什么问题吗?如果是这样,为什么我不能在我的客户端始终可以在多台计算机/浏览器上重现此错误?

PS:如果您想尝试自己,页面是实时的here。你必须授权该应用程序,但我保证不会发生任何令人毛骨悚然的事情。

编辑:错误提及redirect_uri,您会注意到我的代码中已注释掉了该内容。原因是当我包含该参数时,当我点击“关闭”时对话框不会关闭。

EDIT2:我能够在朋友的电脑上重现这个错误,而且CBroe也证实了这一点。所以,(撇开为什么我仍然无法自己生产它的秘密),让我最困难的事情是为什么这只发生了一半的时间?如果我的代码不正确,它应该永远不会工作,对吧?

以下是错误消息中的网址:

https://www.facebook.com/dialog/send?display=popup&link=http%3A%2F%2Fwww.streetofwalls.com&locale=en_US&name=Career%20Networking%20powered%20by%20Street%20of%20Walls&next=http%3A%2F%2Fstatic.ak.facebook.com%2Fconnect%2Fxd_arbiter.php%3Fversion%3D8%23cb%3Df2c657ef78%26origin%3Dhttp%253A%252F%252Fwww.streetofwalls.com%252Ff3575a615c%26domain%3Dwww.streetofwalls.com%26relation%3Dopener%26frame%3Df1ca46b43c%26result%3D%2522xxRESULTTOKENxx%2522&sdk=joey&show_error=true&to=573501273 

url_decode()版之后:

https://www.facebook.com/dialog/send?display=popup&link=http://www.streetofwalls.com&locale=en_US&name=Career Networking powered by Street of Walls&next=http://static.ak.facebook.com/connect/xd_arbiter.php?version=8#cb=f2c657ef78&origin=http%3A%2F%2Fwww.streetofwalls.com%2Ff3575a615c&domain=www.streetofwalls.com&relation=opener&frame=f1ca46b43c&result=%22xxRESULTTOKENxx%22&sdk=joey&show_error=true&to=573501273

EDIT3: 解决了这个难题的一部分。发生错误的时间是FB.init()无效的结果。我已将FB.ui()包裹在FB.getLoginStatus(function(response){ \\... }中,所以现在您可以在控制台中看到更有用的错误。开放的问题是......为什么FB.init()经常失败?

3 个答案:

答案 0 :(得分:0)

这是由于您的redirect_uri与您为Facebook应用指定的设置之间的配置错误。请参阅this question的答案。

redirect_uri应与您在Facebook应用设置中设置的网站网址相等(或相对)。因此,请确保您的站点URL已设置,并且它指向一个等于或低于redirect_uri的目录。此外,请确保您已在Facebook的设置中正确设置应用的域名。

例如:

应用域名:streetofwalls.com

网站网址:/安全画布网址:/安全网页标签网址:http://www.streetofwalls.com

答案 1 :(得分:0)

首先,在页面的头部加载以下脚本:

<script type="text/javascript" src="http://www.streetofwalls.com/wp-content/themes/streetofwalls/js/main.js"></script>

在该脚本中,您尝试异步加载FB JavaScript SDK。 SDK需要fb-root元素才能按照docs中的说明正确加载。但是你的fb-root元素可能还没有渲染,所以这就是我猜的问题。

window.fbAsyncInit = ...和用于在jQuery(document).ready(function($) { ... });内异步加载SDK的代码放在一起,你应该没问题。

对于调试,您还可以尝试同步加载Facebook SDK。

我注意到的另一件事: 您的站点头部有两个脚本标记,用于加载FB JavaScript SDK。你应该删除它们。

答案 2 :(得分:-1)

所以Nitzan因其富有洞察力的评论而值得赞扬,但这是解决方案。

我收到的错误消息是由于FB.init()未加载,或者至少没有按照与页面其余部分相关的正确顺序加载的结果。我从Facebook开发人员文档中复制了代码,并且它异步加载...这对于屁股来说是一种巨大的痛苦......

所以我改用旧式的方式来代替我所拥有的东西:

FB.init({
      appId      : '##########', // App ID
      channelUrl : '//www.xxxxxxxxxx.com/channel.php', // Channel File
      status     : true, // check login status
      cookie     : true, // enable cookies to allow the server to access the session
      xfbml      : true  // parse XFBML
    });

这与其他脚本的一些重新排序相结合,似乎解决了我的问题。