API de Facebook Graph, ¿cómo recibir un correo electrónico a los usuarios?
-
26-09-2019 - |
Pregunta
Estoy usando la API de gráficos, pero no puedo entender cómo obtener una dirección de correo electrónico de usuarios iniciadas.
La introducción al gráfico establece que "la API de gráficos puede proporcionar acceso a todos los datos básicos de registro de cuentas que normalmente solicitaría en un formulario de registro para su sitio, incluido el nombre, la dirección de correo electrónico, la foto del perfil y el cumpleaños".
Todo bien y bueno, pero ¿cómo accedo a esa información?
Esto es lo que tengo hasta ahora:
$json = $facebook->api('/me');
$first = $json['first_name']; // gets first name
$last = $json['last_name'];
Solución
La única forma de obtener la dirección de correo electrónico de los usuarios es solicitar permisos extendidos en el campo de correo electrónico. El usuario debe permitirle ver esto y no puede obtener las direcciones de correo electrónico de los amigos del usuario.
http://developers.facebook.com/docs/authentication/permissions
Puede hacer esto si está utilizando Facebook Connect pasando Scope = Correo electrónico en la cadena Get de su llamada al cuadro de diálogo Auth.
Recomendaría usar un Sdk en lugar de file_get_contents, ya que hace que sea mucho más fácil realizar el Oauth autenticación.
Otros consejos
// Facebook SDK v5 for PHP
// https://developers.facebook.com/docs/php/gettingstarted/5.0.0
$fb = new Facebook\Facebook([
'app_id' => '{app-id}',
'app_secret' => '{app-secret}',
'default_graph_version' => 'v2.4',
]);
$fb->setDefaultAccessToken($_SESSION['facebook_access_token']);
$response = $fb->get('/me?locale=en_US&fields=name,email');
$userNode = $response->getGraphUser();
var_dump(
$userNode->getField('email'), $userNode['email']
);
Abrir base_facebook.php Agregar access_token en la función getLoginUrl()
array_merge(array(
'access_token' => $this->getAccessToken(),
'client_id' => $this->getAppId(),
'redirect_uri' => $currentUrl, // possibly overwritten
'state' => $this->state),
$params);
y use el alcance para el permiso de correo electrónico
if ($user) {
echo $logoutUrl = $facebook->getLogoutUrl();
} else {
echo $loginUrl = $facebook->getLoginUrl(array('scope' => 'email,read_stream'));
}
Para recibir el correo electrónico del usuario, debe iniciar sesión en el usuario con su cuenta de Facebook utilizando el email
permiso. Úselo para eso el Facebook PHP SDK (Ver en Github) como siguiendo.
Primero verifique si el usuario ya ha iniciado sesión:
require "facebook.php";
$facebook = new Facebook(array(
'appId' => YOUR_APP_ID,
'secret' => YOUR_APP_SECRET,
));
$user = $facebook->getUser();
if ($user) {
try {
$user_profile = $facebook->api('/me');
} catch (FacebookApiException $e) {
$user = null;
}
}
Si él no, puede mostrar el enlace de inicio de sesión pidiendo el email
permiso :
if (!$user) {
$args = array('scope' => 'email');
echo '<a href="' . $facebook->getLoginUrl() . '">Login with Facebook</a>';
} else {
echo '<a href="' . $facebook->getLogoutUrl() . '">Logout</a>';
}
Cuando inicia sesión en el correo electrónico se puede encontrar en el $user_profile
formación.
Espero que ayude !
Puede recuperar la dirección de correo electrónico del perfil de usuario registrado. Aquí está el fragmento de código
<?php
$facebook = new Facebook(array(
'appId' => $initMe["appId"],
'secret' => $initMe["appSecret"],
));
$facebook->setAccessToken($initMe["accessToken"]);
$user = $facebook->getUser();
if ($user) {
$user_profile = $facebook->api('/me');
print_r($user_profile["email"]);
}
?>
Simplemente agregue estos bloqueos de código en el retorno de estado y comience a pasar un objeto de cadena de consulta {}. Para los desarrolladores de JavaScript
Después de inicializar su SDK.
Paso 1: // Obtener el estado de inicio de sesión
$(document).ready(function($) {
FB.getLoginStatus(function(response) {
statusChangeCallback(response);
console.log(response);
});
});
Esto verificará la carga del documento y obtendrá su estado de inicio de sesión, verifique si los usuarios han sido iniciados.
Entonces la función checkloginstate se llama y la respuesta se pasa a statuschangecallback
function checkLoginState() {
FB.getLoginStatus(function(response) {
statusChangeCallback(response);
});
}
Paso 2: le permita obtener los datos de respuesta del estado
function statusChangeCallback(response) {
// body...
if(response.status === 'connected'){
// setElements(true);
let userId = response.authResponse.userID;
// console.log(userId);
console.log('login');
getUserInfo(userId);
}else{
// setElements(false);
console.log('not logged in !');
}
}
Esto también tiene el ID de usuario que se está estableciendo en variable, entonces un getUserInfo FUNC está llamado a obtener información del usuario utilizando el gráfico de API.
function getUserInfo(userId) {
// body...
FB.api(
'/'+userId+'/?fields=id,name,email',
'GET',
{},
function(response) {
// Insert your code here
// console.log(response);
let email = response.email;
loginViaEmail(email);
}
);
}
Después de pasar el ID de usuario Como argumento, la función luego obtiene toda la información relacionada con esa ID de usuario. Nota: En mi caso, estaba buscando el correo electrónico, ya que me permitió ejecutar una función que puede registrar el usuario solo por correo electrónico.
// Iniciar sesión por correo electrónico
function loginViaEmail(email) {
// body...
let token = '{{ csrf_token() }}';
let data = {
_token:token,
email:email
}
$.ajax({
url: '/login/via/email',
type: 'POST',
dataType: 'json',
data: data,
success: function(data){
console.log(data);
if(data.status == 'success'){
window.location.href = '/dashboard';
}
if(data.status == 'info'){
window.location.href = '/create-account';
}
},
error: function(data){
console.log('Error logging in via email !');
// alert('Fail to send login request !');
}
});
}
Le dará información sobre el usuario iniciado actualmente, pero deberá proporcionar un token OAuth. Ver:
El correo electrónico en el perfil se puede obtener utilizando el permiso extendido, pero supongo que no es posible obtener el correo electrónico utilizado para iniciar sesión FB. En mi aplicación quería mostrar cuentas de Mulitple FB de un usuario en una lista, quería mostrar los correos electrónicos de inicio de sesión de las cuentas de FB como un identificador único de las cuentas respectivas, pero no pude sacarlo de FB, todo lo que obtuve fue El correo electrónico principal en el perfil de usuario, pero en mi caso mi correo electrónico de inicio de sesión y mi correo electrónico principal son diferentes.
Asegúrese de que se publique su aplicación de Facebook. Para recibir datos por correo electrónico, public_profile y user_friends, su aplicación debe estar disponible para público.
Puede deshabilitarlo más tarde con fines de desarrollo y aún así obtener un campo de correo electrónico.
Las siguientes herramientas pueden ser útiles durante el desarrollo:
Access Token Depugger: Peque en un token de acceso para más detalles
https://developers.facebook.com/tools/debug/accesstoken/
Graph API Explorer: pruebe las solicitudes de la API de gráficos después de pegar en su token de acceso
Asegúrese de especificar completamente el número de versión de la API como algo así como "v2.11"
y no "2.11"
No estoy seguro de lo que está por defecto si esto es incorrecto, pero obtuve algunos errores extraños tratando de recuperar el correo electrónico cuando me perdí el v
.