2011-09-23 17 views
8

Tengo un problema difícil. Difícil significa que busqué a través de la red y StackOverflow así como toda la documentación FBJS SDK y no he encontrado respuesta.FB.getLoginStatus no dispara la función de devolución de llamada

Estoy construyendo una aplicación de pestaña de página donde me gustaría dejar que los fans realicen eventos de rsvp. Así que tengo que verificar si el usuario está conectado y si no es así, debo iniciar sesión. Eso suena bastante fácil, pero FB.getLoginStatus no dispara la función de devolución de llamada. Este es el extracto de código:

FB.init({ 
    appId: window.appID, 
    status: true, 
    xfbml: true, 
    cookie: true, 
    oauth: true, 
    channelUrl: 'http://example.com/fb/channel.html' 
}); 

y luego simplemente - por supuesto, después el usuario hace clic en un botón - llamar FB.getLoginStatus, pero parece que no hace nada.

Ya he comprobado el modo sandbox, el éxito de FB.init, las URL en la configuración de la aplicación y el entorno en desarrollo. Puedo llamar a FB.ui, aunque FB.ui con el método: 'oauth' aparece un mensaje de error que dice "El parámetro" redirect_uri "no se puede usar junto con el parámetro" siguiente ", que está en desuso.". Lo cual es muy extraño porque no usé el parámetro "siguiente". Pero cuando configuro al lado de indefinido, funciona bien, obtengo la ventana, pero dice "La URL dada no está permitida por la configuración de la aplicación". Espere a partir de eso, puedo iniciar sesión, luego tengo el access_token. Pero en la nueva ventana, getLoginStatus todavía no hace nada.

Así que cualquier consejo es bienvenido.

Gracias, Tamas

ACTUALIZACIÓN:

function onBodyLoad() { //on body onload 
    FB.init({ 
    appId: window.appID, 
    status: true, 
    xfbml: true, 
    cookie: true, 
    oauth: true, 
    channelUrl: 'http://example.com/fb/channel.html' 
    });  
    } 
... 
function getName() { // on button onclick 
FB.getLoginStatus(function(response){ 
    if (response.authResponse) 
    { 
    window.loggedIn = true; 
    debugString('Logged in'); 
    } else 
    { 
    window.loggedIn=false; 
    debugString('Not logged in'); 
    } 
}, true); 
if (window.loggedIn === undefined) { 
    debugString('getLoginStatus did not exec'); // I always get this message 
    } 

}

ACTUALIZACIÓN 2: He creado una nueva aplicación en una URL diferente, que se configura como un sitio web independiente . Allí estos códigos funcionan perfectamente, puedo obtener Logstart, puedo iniciar sesión, etc. ¿Hay alguna diferencia trabajando en el contexto de FB, y en un sitio web independiente, usando FB JavaScript SDK?

+0

¿Podría proporcionarnos más códigos? – ifaour

Respuesta

16

FB.getLoginStatus no se dispara la devolución de llamada cuando se está ejecutando el sitio web en un dominio diferente que el que se registró la aplicación con. Normalmente me encuentro en esta situación cuando desarrollo localmente o en un servidor intermedio.

Por ejemplo, si se ha registrado el sitio con example.com y el servidor de transición es example.mystagingserver.com, el fuego de devolución de llamada de costumbre.En este caso, debe crear una segunda aplicación en Facebook y usar la ID de aplicación y el secreto para la nueva aplicación.

+0

I no sé qué pasó, pero ayer volví a consultar la configuración de la aplicación, y el dominio de la aplicación se mostró como una etiqueta eliminable, no como una cadena que solía ver, y - voilá - todo funciona como una máquina sin problemas. –

0

Usted puede utilizar el código siguiente para comprobar si el usuario se registra en:

FB.getLoginStatus(function(response) { 
    if (response.authResponse) { 
     // logged in and connected user, someone you know 
    } else { 
     // no user session available, someone you dont know 
    } 
}); 

De FB JS SDK Documentation.

se puede envolver todo el código en jQuery listo:

$('document').ready(function(){ 
    ... above code 
}) 

También es posible que desee comprobar this question StackOverflow.

+1

esa es la parte mala, porque la función de devolución de llamada no se ejecutará en getLoginStatus ... como dije en la pregunta original. Y leí la pregunta que mencionaste, pero no ayudó. –

+0

Estoy teniendo el mismo problema, FB.getLoginStatus solo se ejecutará si el usuario inició sesión. – thesmart

+0

Estoy conectado y no tuve suerte: O –

2

Estoy usando este código, con éxito. No estoy seguro de dónde están las diferencias ... pero estoy usando el ASYNC FB Loader.

window.fbAsyncInit = function() { 
    FB.init({ appId: 'XXXXXX', //change the appId to your appId 
      status: true, 
      cookie: true, 
      xfbml: true, 
      oauth: true}); 

function authEvent(response) { 

    if (response.authResponse) { 
      //user is already logged in and connected 
      FB.api('/me', function(info) { 
       login(response, info); 
      }); 
    } else { 
      //user is not connected to your app or logged out 
      button.onclick = function() { 
      FB.login(function(response) { 
      if (response.authResponse) { 
       FB.api('/me', function(info) { 
        login(response, info); 
       }); 
       } else { 
       //user cancelled login or did not grant authorization 
      } 
     }, {scope:'email,rsvp_event,status_update,publish_stream,user_about_me'});  
        } 
       } 
      } 

      // run once with current status and whenever the status changes 
      FB.getLoginStatus(updateButton); 
      FB.Event.subscribe('auth.statusChange', updateButton); 
     }; 
     (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); 
     }()); 


     function login(response, info){ 
      if (response.authResponse) { 
       accessToken = response.authResponse.accessToken; 
     userid = info.id; 


       userInfo.innerHTML = '<img src="https://graph.facebook.com/' + info.id + '/picture">' + info.name+"<br /> Your Access Token: " + accessToken; 
      } 
     } 
+0

Intenté, pero no ayudó ... gracias, de todos modos –

3

Acabo de tener el mismo problema, aunque solo le sucedió a algunos usuarios.

Finalmente descubrí que si su aplicación es el modo de espacio aislado, los usuarios que no sean desarrolladores todavía pueden ver su aplicación como una pestaña de página. Pero al llamar a getLoginStatus fallará de manera silenciosa (incluso con el inicio de sesión activado).

Me tomó un tiempo darme cuenta de eso, espero que esto pueda salvar a alguien más en algún momento.

0

Para mí después de numerosas pruebas puede confirmar el diálogo para registrar el usuario no se mostrará a menos que utilice una válida Application ID

Estos se pueden encontrar en

https://developers.facebook.com/apps/{{Application__Id}}/settings/ 

Sólo asegúrese de llamar a la API con la identificación correcta.

Cuestiones relacionadas