Facebook Graph API, как получить электронную почту пользователей?
Я использую API Graph, но я не могу понять, как получить адрес электронной почты зарегистрированных пользователей.
введение в Graph гласит: "API Graph может предоставить доступ ко всем основным регистрационным данным учетной записи, которые вы обычно запрашиваете в форме регистрации для вашего сайта, включая имя, адрес электронной почты, фотографию профиля и день рождения"
все хорошо и хорошо, но как мне получить доступ к этой информации?
Это то, что у меня есть до сих пор:
$json = $facebook->api('/me');
$first = $json['first_name']; // gets first name
$last = $json['last_name'];
11 ответов:
единственный способ получить адрес электронной почты пользователя-запросить расширенные разрешения на поле электронной почты. Пользователь должен позволить вам увидеть это, и вы не можете получить адреса электронной почты друзей пользователя.
http://developers.facebook.com/docs/authentication/permissions
вы можете сделать это, если вы используете Facebook connect, передавая scope=email в строке get вашего вызова в диалоговом окне Auth.
Я бы рекомендовал использовать SDK вместо file_get_contents, как это делает его гораздо проще выполнить Oauth проверка подлинности.
// 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'] );
открыть base_facebook.РНР Добавить маркер доступа в функции
getLoginUrl()
array_merge(array( 'access_token' => $this->getAccessToken(), 'client_id' => $this->getAppId(), 'redirect_uri' => $currentUrl, // possibly overwritten 'state' => $this->state), $params);
и использовать область для разрешения электронной почты
if ($user) { echo $logoutUrl = $facebook->getLogoutUrl(); } else { echo $loginUrl = $facebook->getLoginUrl(array('scope' => 'email,read_stream')); }
чтобы получить электронную почту пользователя, вы должны войти в систему пользователя с его учетной записью Facebook, используя
сначала проверьте, если пользователь уже вошел в систему :
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; } }
если у него его нет, вы можете отобразить ссылку для входа просят
if (!$user) { $args = array('scope' => 'email'); echo '<a href="' . $facebook->getLoginUrl() . '">Login with Facebook</a>'; } else { echo '<a href="' . $facebook->getLogoutUrl() . '">Logout</a>'; }
когда он вошел в систему электронной почты можно найти в разделе
$user_profile
массив.надеюсь, что это поможет !
вы можете получить адрес электронной почты из профиля вошедшего в систему пользователя. Вот фрагмент кода
<?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"]); } ?>
даст вам информацию о текущем зарегистрированном пользователе, но вам нужно будет предоставить маркер oauth. Смотрите:
электронная почта в профиле может быть получена с помощью расширенного разрешения, но я думаю, что это не возможно, чтобы получить электронную почту, используемую для входа в fb. В мое приложение я хочу, чтобы отобразить несколько аккаунтов в социальной сети пользователя в список, я хотел показать логин письма из аккаунтов в социальной сети в качестве уникального идентификатора соответствующего счета, но я не могу получить его из ФБ, все, что я получил на основной адрес электронной почты в профиле пользователя, но в моем случае мой логин электронной почты и мой основной адрес электронной почты разные.
убедитесь, что ваше приложение Facebook Опубликовано. Для получения данных для электронной почты, public_profile и user_friends ваше приложение должно быть доступно для общественности.
вы можете отключить его позже для целей разработки и по-прежнему получить поле электронной почты.
следующие инструменты могут быть полезны при разработке:
отладчик маркера доступа: вставьте маркер доступа для деталей
https://developers.facebook.com/tools/debug/accesstoken/
Graph API Explorer: тестовые запросы к graph api после вставки в маркер доступа
убедитесь, что полностью указать номер версии API, как что-то вроде
"v2.11"
, а не"2.11"
Я не уверен, что он по умолчанию, если это неверно, но я получил некоторые странные ошибки, пытаясь просто получить электронную почту, когда я пропустил
v
.
просто добавьте этот блок кода при возврате состояния и начните передавать объект строки запроса {}. Для разработчиков JavaScript
после инициализации вашего sdk.
Шаг 1: // получить статус логина
$(document).ready(function($) { FB.getLoginStatus(function(response) { statusChangeCallback(response); console.log(response); }); });
это будет проверить на загрузку документа и получить статус входа проверить, если пользователи были зарегистрированы.
функция checkLoginState вызывается, и ответ передается statusChangeCallback
function checkLoginState() { FB.getLoginStatus(function(response) { statusChangeCallback(response); }); }
Шаг 2: позвольте вам получить данные ответа из состояния
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 !'); } }
Это userid который устанавливается в переменную, то a getUserInfo func вызывается для получения информации о пользователе с помощью Graph-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); } ); }
после прохождения userid в качестве аргумента функция затем извлекает всю информацию, относящуюся к этому userid. Отмечать: в моем случае я искал электронную почту, так как позволил мне запустить функцию, которая может войти в систему только по электронной почте.
// вход по электронной почте
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 !'); } }); }