我正在使用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:如果您想尝试自己,页面是实时的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()经常失败?
答案 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
});
这与其他脚本的一些重新排序相结合,似乎解决了我的问题。