Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php FB登录回调函数在用户已登录facebook时不响应_Php_Facebook_Facebook Login - Fatal编程技术网

Php FB登录回调函数在用户已登录facebook时不响应

Php FB登录回调函数在用户已登录facebook时不响应,php,facebook,facebook-login,Php,Facebook,Facebook Login,我使用fb连接使用js。这是我的代码: <script> window.fbAsyncInit = function() { FB.init({ appId : 'xxxxxxxxxxxxxxxx', status : true, cookie : true, xfbml : true, oauth : true });

我使用fb连接使用js。这是我的代码:

<script>
    window.fbAsyncInit = function() {
      FB.init({
        appId      : 'xxxxxxxxxxxxxxxx',
        status     : true, 
        cookie     : true,
        xfbml      : true,
        oauth      : true
      });

      FB.Event.subscribe('auth.login', function(response) {
        obj=response.authResponse;
        token=obj.accessToken;
        setCookie("access_token_fb", token, '2');

        window.location.reload();
      },true);
    };
    (function(d){
       var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
       js = d.createElement('script'); js.id = id; js.async = true;
       js.src = "//connect.facebook.net/en_US/all.js";
       d.getElementsByTagName('head')[0].appendChild(js);
     }(document));
  </script>

window.fbAsyninit=函数(){
FB.init({
appId:'XXXXXXXXXXXXXX',
状态:正确,
曲奇:是的,
xfbml:是的,
真的吗
});
FB.Event.subscribe('auth.login',函数(响应){
obj=response.authResponse;
token=obj.accessToken;
setCookie(“访问令牌”,令牌,“2”);
window.location.reload();
},对);
};
(职能(d){
var js,id='facebook jssdk';if(d.getElementById(id)){return;}
js=d.createElement('script');js.id=id;js.async=true;
js.src=“//connect.facebook.net/en_US/all.js”;
d、 getElementsByTagName('head')[0].appendChild(js);
}(文件);
对于登录,我使用:

 <div class="fb-login-button" scope="email,user_checkins"  >Login with Facebook</div>
使用Facebook登录
订阅功能中的“auth.login”有一个响应处理程序。只有当用户单击fb按钮并且尚未登录fb时,才会调用该响应处理程序。在fb窗口中输入他/她的电子邮件地址和密码。如果用户已经登录facebook,则fb对话框将打开和关闭。然后它不会将控制传递给响应处理程序。我在某处读到force=“true”使其能够检测状态变化和回调功能。但我不知道该在哪里增加力量。我认为应该在登录部分。这是真的还是有其他方法


谢谢您的时间。

当您使用
status:true
初始化FB SDK时,它将从用户处获取登录状态并将其存储。从那时起,当您调用
FB.getLoginStatus()
时,它不是访问从FB获取最新数据,而是引用在
FB.init()
点设置的本地存储变量-我认为它每20分钟只刷新一次(请参阅)-但是您可以通过执行以下操作强制刷新:

FB.getLoginStatus(function() {...}, /*FORCE*/ true);
然后,这将触发您的
auth.login
事件,或者您也可以将为该事件定义的处理程序传递给
FB.getLoginStatus

甚至可以更进一步,轮询此函数,如:

setTimeout(function() {
    FB.getLoginStatus(function() {...}, /*FORCE*/ true);
}, 10000); // poll every 10 seconds

我建议让Facebook帮你做这件事。 请注意一些变化:1。指定的频道URL,2。使用FB.getLoginStatus 3。删除设置cookie。4.更改要侦听的事件(以防他们在其他窗口注销,或在其他地方取消应用程序的授权等)


window.fbAsyninit=函数(){
FB.init({
appId:'XXXXXXXXXXXXXX',
状态:正确,
曲奇:是的,
xfbml:是的,
真的,
channelUrl:'//WWW.YOUR_DOMAIN.COM/channel.html'//频道文件
});
FB.getLoginStatus(函数(响应){
如果(response.status===“已连接”){
var uid=response.authResponse.userID;
var accessToken=response.authResponse.accessToken;
//对访问令牌执行一些操作
}否则{
//订阅事件“auth.authResponseChange”并等待用户自动验证
FB.Event.subscribe('auth.authResponseChange',函数(响应){
//只需重新加载页面即可
window.location.reload();
},对);
//现在动态显示登录插件
$('#mydiv').show();
}
});
};
(职能(d){
var js,id='facebook jssdk';if(d.getElementById(id)){return;}
js=d.createElement('script');js.id=id;js.async=true;
js.src=“//connect.facebook.net/en_US/all.js”;
d、 getElementsByTagName('head')[0].appendChild(js);
}(文件);

方法1:

虽然我相信DMCS为这个问题提供了一个正确的解决方案,但这里有另一种方法。使用带有自定义登录链接的FB.login方法

<script>
window.fbAsyncInit = function() {
    FB.init({
        appId: 'YOUR-APP-ID',
        status: true,
        cookie: true,
        xfbml: true,
        oauth: true
    });
};

function facebookLogin() {
    FB.login(function(response) {
        if (response.authResponse) {
            console.log('Authenticated!');
            // location.reload(); //or do whatever you want
        } else {
            console.log('User cancelled login or did not fully authorize.');
        }
    },
    {
        scope: 'email,user_checkins'
    });
}

(function(d) {
    var js,
    id = 'facebook-jssdk';
    if (d.getElementById(id)) {
        return;
    }
    js = d.createElement('script');
    js.id = id;
    js.async = true;
    js.src = "//connect.facebook.net/en_US/all.js";
    d.getElementsByTagName('head')[0].appendChild(js);
} (document));
</script>
注意:如果您使用的是fb登录按钮插件,并且用户已经登录并连接到应用程序,则不会显示任何登录按钮(请在文档中阅读)

您需要更换

FB.Event.subscribe('auth.authResponseChange', function(response){     

As auth.authStatusChange事件在状态更改时触发,无论是已登录还是通过提供凭据登录

谢谢

将“状态:正确”更改为“状态:错误”,我相信它会满足您的需求。问题是status:true使状态检查发生在init上,因此当用户单击按钮时,没有什么可以更改的

在这里的最后一条评论旁找到了答案:

这很有效:

FB.getLoginStatus(function(response) {
//only works when page loads, use FB.Event.subscribe for status change      
    statusChangeCallback(response);
    FB.Event.subscribe('auth.statusChange', function(response){
        //yay! do whatever here, there was a status change
    },true);  

});

我也有同样的问题。我注意到,如果它是应用程序链接的用户,那么它会显示这种行为。请提供帮助。如果所有用户都已准备好登录应用程序,我想在单击“登录”按钮后调用事件(与登录后的事件相同)。@SomnathMuluk因为您似乎正在使用fb登录插件,如果用户已登录并已连接到您的应用程序,请单击“登录”按钮(阅读此处的说明)。如果仍要订阅,可以使用自定义按钮订阅
auth.statusChange
事件。我在回答中解释了。我也有同样的问题。不管文档怎么说,登录按钮总是显示在我的网站上,即使用户已经登录。我对按钮总是出现没有问题。但是,如果用户从我的网站注销,然后想使用FB登录按钮再次登录,他们不能,因为该按钮似乎没有任何作用。@EastofNowhere用您正在使用的代码问另一个问题,然后把这个问题的链接放在这里,这样我们就可以看到你们的代码并告诉你们更好的答案。这个问题将在加载页面后调用。我想在单击“登录”按钮后调用。它将在单击“登录”按钮时调用。请参阅FB.Event.Subscribe方法。再说一次,这个
FB.Event.subscribe('auth.statusChange', function(response) {
  // check for status in the response
});
FB.Event.subscribe('auth.authResponseChange', function(response){     
FB.Event.subscribe('auth.statusChange', function(response){ 
FB.getLoginStatus(function(response) {
//only works when page loads, use FB.Event.subscribe for status change      
    statusChangeCallback(response);
    FB.Event.subscribe('auth.statusChange', function(response){
        //yay! do whatever here, there was a status change
    },true);  

});