Я использую Graph API, но не могу понять, как получить адрес электронной почты вошедшего в систему пользователя.
Во введении к Graph говорится: «API Graph может предоставить доступ ко всем основным данным регистрации учетной записи, которые вы обычно запрашиваете в форме регистрации для своего сайта, включая имя, адрес электронной почты, изображение профиля и дату рождения».
Все хорошо, но как мне получить доступ к этой информации?
Вот что у меня есть на данный момент:
$json = $facebook->api('/me');
$first = $json['first_name']; // gets first name
$last = $json['last_name'];
php
json
facebook
facebook-graph-api
килекс
источник
источник
var_dump($obj);
выводит?Ответы:
Единственный способ получить адрес электронной почты пользователя - запросить расширенные разрешения для поля электронной почты. Пользователь должен разрешить вам это видеть, и вы не сможете получить адреса электронной почты друзей пользователя.
http://developers.facebook.com/docs/authentication/permissions
Вы можете сделать это, если используете подключение к Facebook, передав scope = email в строке получения вашего вызова диалоговому окну Auth.
Я бы рекомендовал использовать SDK вместо file_get_contents, так как это значительно упрощает проверку подлинности Oauth .
источник
FB.api('/me?scope=email', function(apiResponse) { ... });
// 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'] );
источник
/me
маршрута? Я продолжаю просматривать страницы Graph API и нигде не могу его найти :(Откройте base_facebook.php Добавьте Access_token в функцию
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, используя
email
разрешение. Используйте для этого Facebook PHP SDK ( см. На github ) следующим образом.Сначала проверьте, вошел ли пользователь в систему:
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; } }
Если это не так, вы можете отобразить ссылку для входа с запросом
email
разрешения: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
массиве.Надеюсь, это поможет !
источник
Просто добавьте этот блок кода при возврате статуса и начните передавать объект строки запроса {}. Для разработчиков 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 !'); } }
У этого также есть идентификатор пользователя, который устанавливается как переменная, затем вызывается функция getUserInfo для получения информации о пользователе с помощью 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); } ); }
После передачи идентификатора пользователя в качестве аргумента функция извлекает всю информацию, относящуюся к этому идентификатору пользователя . Примечание: в моем случае я искал электронную почту, чтобы разрешить мне запустить функцию, которая может войти в систему только по электронной почте.
// войти по электронной почте
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 !'); } }); }
источник
Вы можете получить адрес электронной почты из профиля вошедшего в систему пользователя. Вот фрагмент кода
<?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"]); } ?>
источник
$user_profile
не содержитПредполагая, что вы запросили разрешения электронной почты, когда пользователь вошел в систему из вашего приложения, и у вас есть действующий токен,
С помощью fetch api вы можете просто
const token = "some_valid_token"; const response = await fetch( `https://graph.facebook.com/me?fields=email&access_token=${token}` ); const result = await response.json();
результат будет:
{ "id": "some_id", "email": "name@example.org" }
id все равно будет возвращен.
Вы можете добавить к параметрам запроса полей больше информации, но вам нужны разрешения для них, если они не находятся в общедоступном профиле (имя публично).
https://developers.facebook.com/docs/facebook-login/permissions
источник
https://graph.facebook.com/me
предоставит вам информацию о текущем вошедшем в систему пользователе, но вам нужно будет предоставить токен oauth. Увидеть:
http://developers.facebook.com/docs/reference/api/user
источник
Электронный адрес в профиле можно получить с использованием расширенного разрешения, но я думаю, что невозможно получить адрес электронной почты, используемый для входа в fb. В моем приложении я хотел отобразить несколько учетных записей fb пользователя в списке, я хотел показать электронные письма для входа в учетные записи fb как уникальный идентификатор соответствующих учетных записей, но я не мог получить его из fb, все, что у меня было, было основной адрес электронной почты в профиле пользователя, но в моем случае мой адрес электронной почты для входа и мой основной адрес электронной почты отличаются.
источник
Убедитесь, что ваше приложение Facebook опубликовано. Чтобы получать данные для электронной почты, public_profile и user_friends, ваше приложение должно быть общедоступным.
Вы можете отключить его позже для целей разработки и по-прежнему получать поле электронной почты.
источник
Следующие инструменты могут быть полезны во время разработки:
https://developers.facebook.com/tools/debug/accesstoken/
https://developers.facebook.com/tools/explorer
источник
Не забудьте полностью указать номер версии API как что-то вроде,
"v2.11"
а не"2.11"
Я не уверен, что используется по умолчанию, если это неверно, но у меня возникли странные ошибки, пытаясь просто получить электронное письмо, когда я пропустил
v
.источник
Для меня проблема со сбором адресов электронной почты пользователя на стороне PHP (метод getGraphUser ()) заключалась в том, что поведение кнопки, отображаемой на facebook (на стороне WEBSIDE, созданной с помощью xfbml = 1) по умолчанию, заключается в неявном вызове FB.login () с объем НЕ включает "электронную почту".
Это означает, что вы ДОЛЖНЫ:
1) call
очевидно, создание собственной кнопки для запуска процесса входа в систему
ИЛИ
2) добавьте атрибут scope = "email" к кнопке xfbml
чтобы иметь возможность собирать адреса электронной почты на стороне PHP.
Надеюсь, это поможет.
источник
Сначала активируйте свое приложение в Центре разработчиков Facebook . Приложения в режиме разработки не могут получать поле электронной почты.
Если пользователь не вошел в систему, вам необходимо войти в систему и указать, что вашему приложению / сайту потребуется поле электронной почты.
FB.login( function(response) { console.log('Welcome!'); }, {scope: 'email'} );
Затем, после входа в систему или если пользователь уже вошел в систему, получите электронное письмо с помощью API Facebook, указав поле электронной почты:
FB.api('/me', {fields: 'name,email'}, (response) => { console.log(response.name + ', ' + response.email); console.log('full response: ', response); });
источник