【问题标题】:Facebook Graph API not returning emailFacebook Graph API 不返回电子邮件
【发布时间】:2017-09-29 23:10:52
【问题描述】:

我有以下代码:

$fb = new Facebook([
    'app_id' => $appId,
    'app_secret' => $appSecret,
    'default_graph_version' => 'v2.9',
]);

$oAuth2Client = $fb->getOAuth2Client();
$tokenMetaData = $oAuth2Client->debugToken($accessToken);
dump($tokenMetaData);

$graphUser = $fb->get('/me?fields=first_name,last_name,email', $accessToken)->getGraphUser()->asArray();
dump($graphUser);

上面的输出如下:

$元数据

 [
   "app_id" => "..."
   "application" => "My App Name"
   "expires_at" => "2017-07-01 11:40:09.000000"
   "is_valid" => true
   "issued_at" => "2017-05-02 11:40:09.000000"
   "metadata" => array:2 [
     "auth_type" => "rerequest"
     "sso" => "ios"
    ]
    "scopes" => array:2 [
      0 => "email"
      1 => "public_profile"
    ]
    "user_id" => "102..."
  ]
}

$graphUser

array:3 [
  "first_name" => "John"
  "last_name" => "Smith"
  "id" => "102...",
]

如您所见,$metaData 中的scopes 显然具有email,因此这不是权限问题。尽管如此,图用户 sometimes 没有电子邮件(尽管在某些情况下有)。

为什么会这样,我该如何解决这个问题?

【问题讨论】:

  • API 只会返回确认的电子邮件地址。还有许多其他因素,例如隐私设置也会影响这一点。因此,不要编写您的应用程序,使其依赖从 API 获取电子邮件地址。如果仅使用手机注册,许多用户在 Facebook 上没有存档。
  • @CBroe 请写下您的评论作为答案,以便我接受
  • @YahyaUddin,另外,有很多用户实际上是通过手机注册的,他们的帐户上根本没有电子邮件。很老了,可能会对某人有所帮助

标签: facebook facebook-graph-api facebook-php-sdk


【解决方案1】:

我今天遇到的一种可能性是,如果我正在注册一个我没有使用我的email ID 登录的帐户,可能会使用mobile numberlogin,甚至在我的个人资料中primary email 是未设置或设置为 mobile number,在这种情况下,facebookemail 返回 null。

我已经更新了帐户并将电子邮件添加到facebook pagesettings 下的primary email 字段,然后我能够从facebook 获得email id

希望这对某人有所帮助。

编码愉快...

【讨论】:

    【解决方案2】:

    您必须检查这些步骤。

    1. 检查您的访问令牌是否获得了用户对电子邮件的许可。登录到您的应用程序的开发者帐户,然后工具->graph api explorer,然后启用用户对电子邮件的权限。

    2. 检查 facebook 版本,使用最新版本。

    3. 在 Facebook 登录脚本中添加电子邮件范围,如下所示

      app.get(
          '/auth/facebook',
          passport.authenticate('facebook', {
            scope: ['user_location', 'email', 'user_friends']
          })
        );
      

      FB.login(function(response) { 
      
         // your ajax script
      
      },{
          scope: 'email', 
          return_scopes: true
      });
      

    【讨论】:

      【解决方案3】:

      将您需要的字段添加到您的请求的 URL:

      https://graph.facebook.com/me?fields=email,name
      

      【讨论】:

        【解决方案4】:

        首先检查您的访问令牌是否获得用户对电子邮件的许可

        https://graph.facebook.com/me/permissions?
          access_token=(access-token)
          &debug=all
        

        如果在答案中,此内容不出现:

        {
            "data": [
                {
                    "permission": "email",
                    "status": "granted"
                },
                {
                    "permission": "public_profile",
                    "status": "granted"
                }
            ]
        }
        

        也许在获取您的访问令牌时我不请求邮件所有权:将 scope=email 添加到请求中

        https://www.facebook.com/v2.10/dialog/oauth?
          client_id=(app-id)
          &redirect_uri=(redirect-uri)
          &scope=email
        

        【讨论】:

          【解决方案5】:

          我通过指定图形 api 版本解决了这个问题。

          我请求的字段first_name,last_name,email,picture

          到网址:https://graph.facebook.com/me

          没有回邮件。

          到网址:https://graph.facebook.com/v2.9/me

          确实回复了电子邮件。

          希望这会有所帮助。

          【讨论】:

          • 我指定了版本,所以这似乎不是问题
          • 我也更新到最新版本,但仍然无法返回电子邮件:/
          猜你喜欢
          • 2013-08-25
          • 2013-05-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-22
          • 1970-01-01
          相关资源
          最近更新 更多