我正试图在Facebook上构建一个简单的“应用程序”,根据用户“喜欢”我的页面,它将显示替代内容。
为什么会产生以下错误?
<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 :(得分: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)
查看facebook与js http://codethatworkedforme.blogspot.com/2011/08/facebook-connect.html
连接的链接答案 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'
},