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

kyl*_*lex 82 php json facebook facebook-graph-api

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

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

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

这是我到目前为止:

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

$first = $json['first_name']; // gets first name
$last = $json['last_name'];
Run Code Online (Sandbox Code Playgroud)

Gaz*_*ler 73

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

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

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

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

  • 基于这个答案,对我来说并不是很明显......如果你使用的是JavaScript API,你想使用`FB.api('/ me?scope = email',function(apiResponse){... });` (12认同)
  • 没关系,我想通了:$ facebook-> getLoginUrl(array('req_perms'=>'email')) (10认同)

mas*_*tic 56

// 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']
);
Run Code Online (Sandbox Code Playgroud)

  • / me?locale = en_US&fields = name,电子邮件是我唯一想办法让它返回电子邮件地址,找不到任何其他在线参考 (3认同)
  • 是否有某个描述`/ me`路线的参考页面?我一直在浏览[Graph API](https://developers.facebook.com/docs/graph-api/reference)上的页面,但无法在任何地方找到它:( (2认同)

Kal*_*tha 19

打开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);
Run Code Online (Sandbox Code Playgroud)

和使用范围的电子邮件权限

if ($user) {
   echo $logoutUrl = $facebook->getLogoutUrl();
} else {
   echo $loginUrl = $facebook->getLoginUrl(array('scope' => 'email,read_stream'));
}
Run Code Online (Sandbox Code Playgroud)


Que*_*tin 6

要获取用户电子邮件,您必须使用该email权限使用他的Facebook帐户登录用户.用于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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果他不是,你可以显示要求email许可的登录链接:

if (!$user) {
    $args = array('scope' => 'email');
    echo '<a href="' . $facebook->getLoginUrl() . '">Login with Facebook</a>';
} else {
    echo '<a href="' . $facebook->getLogoutUrl() . '">Logout</a>';
}
Run Code Online (Sandbox Code Playgroud)

当他登录时,可以在$user_profile阵列中找到电子邮件.

希望有所帮助!


小智 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"]);
    }
?>
Run Code Online (Sandbox Code Playgroud)

  • 这不适合我.`$ user_profile`不包含电子邮件 (4认同)

Del*_*ino 5

只需在状态返回时添加这些代码块,然后开始传递查询字符串对象{}。对于JavaScript开发人员

初始化您的SDK之后。

步骤1://获取登录状态

$(document).ready(function($) {
    FB.getLoginStatus(function(response) {
        statusChangeCallback(response);
        console.log(response);
    });
  });
Run Code Online (Sandbox Code Playgroud)

如果用户已经登录,这将检查文档加载并获取您的登录状态。

然后调用函数checkLoginState,并将响应传递给statusChangeCallback

function checkLoginState() {
    FB.getLoginStatus(function(response) {
      statusChangeCallback(response);
    });
  }
Run Code Online (Sandbox Code Playgroud)

步骤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 !');
    }
  }
Run Code Online (Sandbox Code Playgroud)

它还具有被设置为变量的userid,然后调用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);
      }
    );
  }
Run Code Online (Sandbox Code Playgroud)

在将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 !');
      }
    });
  }
Run Code Online (Sandbox Code Playgroud)


Gab*_* P. 5

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

使用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();
Run Code Online (Sandbox Code Playgroud)

结果将是:

{
    "id": "some_id",
    "email": "name@example.org"
}
Run Code Online (Sandbox Code Playgroud)

无论如何,id 都会被返回。

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

?fields=name,email,user_birthday&token=
Run Code Online (Sandbox Code Playgroud)

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