1

我像这样使用 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

在此处输入图像描述

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

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

编辑:错误提到了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() 经常失败?

4

3 回答 3

0

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

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

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

window.fbAsyncInit = ...和异步加载SDK的代码放在里面jQuery(document).ready(function($) { ... });就可以了。

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

我注意到的另一件事:您的网站头部有两个脚本标签,它们加载了 FB JavaScript SDK。您应该删除两者。

于 2012-07-03T19:42:58.633 回答
0

这是由于您的 redirect_uri 和您为 Facebook 应用程序指定的设置之间存在配置错误。请参阅此问题的答案。

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

例如:

应用域名:streetofwalls.com

站点 URL:/安全画布 URL:/安全页面选项卡 URL: http: //www.streetofwalls.com

于 2012-07-02T23:33:14.577 回答
-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
    });

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

于 2012-07-04T03:50:51.260 回答