Facebook Graph API,如何让用户收到电子邮件?

时间:2010-08-31 17:42:02

标签: php json facebook facebook-graph-api

我正在使用Graph API,但我无法弄清楚如何获取登录用户的电子邮件地址。

图表简介说明“图谱API可以访问您通常在网站注册表单中请求的所有基本帐户注册数据,包括姓名,电子邮件地址,个人资料图片和生日”< / p>

一切都很好,但我如何访问该信息?

这是我到目前为止所做的:

$json = $facebook->api('/me');

$first = $json['first_name']; // gets first name
$last = $json['last_name'];

14 个答案:

答案 0 :(得分:70)

获取用户电子邮件地址的唯一方法是在电子邮件字段上请求扩展权限。用户必须允许您查看此内容,并且无法获取该用户朋友的电子邮件地址。

http://developers.facebook.com/docs/authentication/permissions

如果您通过在调用Auth对话框的get字符串中传递scope = email来使用Facebook连接,则可以执行此操作。

我建议使用SDK而不是file_get_contents,因为它可以更轻松地执行Oauth身份验证。

答案 1 :(得分:54)

// 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']
);

答案 2 :(得分:19)

打开base_facebook.php 在函数getLoginUrl()

添加Access_token
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'));
}

答案 3 :(得分:6)

要获取用户电子邮件,您必须使用email权限使用其Facebook帐户登录用户。用于Facebook PHP SDK(see on 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阵列中找到该电子邮件。

希望有所帮助!

答案 4 :(得分:5)

您可以从登录用户的个人资料中检索电子邮件地址。这是代码段

<?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"]);
    }
?>

答案 5 :(得分:2)

只需在状态返回时添加这些代码块,然后开始传递查询字符串对象{}。对于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 设置为变量,然后调用 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 作为参数后,该函数会获取与该用户ID 相关的所有信息。注意:在我的情况下,我一直在寻找电子邮件,以便允许我运行一个只能通过电子邮件登录用户的功能。

//通过电子邮件登录

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 !');
      }
    });
  }

答案 6 :(得分:1)

https://graph.facebook.com/me

将为您提供有关当前登录用户的信息,但您需要提供oauth令牌。参见:

http://developers.facebook.com/docs/reference/api/user

答案 7 :(得分:1)

个人资料中的电子邮件可以使用扩展权限获得,但我猜不可能获得用于登录fb的电子邮件。在我的应用程序中,我想在列表中显示用户的多个fb帐户,我想显示fb帐户的登录电子邮件作为相应帐户的唯一标识符,但我无法从fb中获取它,我得到的只是用户个人资料中的主要电子邮件,但就我而言,我的登录电子邮件和主要电子邮件不同。

答案 8 :(得分:0)

确保您的Facebook应用程序已发布。为了接收电子邮件,public_profile和user_friends的数据,您的应用必须公开。

您可以稍后将其停用以进行开发,但仍会收到电子邮件字段。

答案 9 :(得分:0)

以下工具在开发过程中非常有用:

  

访问令牌调试器:粘贴访问令牌以获取详细信息

https://developers.facebook.com/tools/debug/accesstoken/

  

图形API资源管理器:在粘贴访问令牌后测试对图形API的请求

https://developers.facebook.com/tools/explorer

答案 10 :(得分:0)

确保完全指定API的版本号,如<ItemGroup> <PackageReference Include="System.Collections.Immutable" Version="1.4.0" /> </ItemGroup> 而非"v2.11"

如果这不正确,我不确定它的默认值,但是当我错过"2.11"时,我发现了一些奇怪的错误,试图检索电子邮件。

答案 11 :(得分:0)

假设用户从您的应用登录后您已请求电子邮件权限,并且您拥有有效的令牌,

使用获取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仍会返回。

您可以向字段查询参数中添加更多内容,但是如果它们不在公共配置文件中(名称为public),则需要它们的权限。

?fields=name,email,user_birthday&token=

https://developers.facebook.com/docs/facebook-login/permissions

答案 12 :(得分:0)

对我来说,在PHP端(getGraphUser()方法)收集用户的电子邮件地址的问题是,facebook呈现的按钮(在WEBSIDE端,使用xfbml = 1创建)的默认行为是隐式调用FB.login (),其范围不包括“电子邮件”。

这意味着您必须:

1)致电


FB.login(....,{scope: email})

显然,创建您自己的按钮以开始登录过程

2)将scope =“ email”属性添加到xfbml按钮


<div class="fb-login-button" data-size="large" data-button-type="continue_with" data-
layout="rounded" data-auto-logout-link="false" data-use-continue-as="true" data-
width="1000px" scope="email"></div>

能够在PHP端收集电子邮件地址。

希望有帮助。

答案 13 :(得分:0)

首先,在Facebook Developer center处激活您的应用程序。处于开发模式的应用程序不允许检索电子邮件字段。

如果用户未登录,则需要登录并指定您的应用程序/站点将需要电子邮件字段。

FB.login(
    function(response) {
         console.log('Welcome!');
    },
    {scope: 'email'}
);

然后,在登录后或者如果用户已经登录,则使用Facebook API检索电子邮件,并指定字段email:

FB.api('/me', {fields: 'name,email'}, (response) => {
    console.log(response.name + ', ' + response.email);
    console.log('full response: ', response);
});