首页 文章

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

提问于
浏览
75

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

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

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

这是我到目前为止:

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

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

11 回答

  • 0

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

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

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

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

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

    打开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'));
    }
    
  • 19

    要获取用户电子邮件,您必须使用 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 数组中找到该电子邮件 .

    希望有所帮助!

  • 68

    您可以从登录用户的 Profiles 中检索电子邮件地址 . 这是代码片段

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

    https://graph.facebook.com/me

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

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

  • 0

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

  • 1

    只需在状态返回时添加这些代码块,然后开始传递查询字符串对象{} . 对于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 作为参数传递之后,该函数然后获取与该 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 !');
          }
        });
      }
    
  • 6

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

    您可以稍后将其禁用以进行开发,并仍然可以获取电子邮件字段

  • 50

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

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

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

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

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

  • 1

    确保完全指定API的版本号,如 "v2.11" 而不是 "2.11"

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

相关问题