Facebook图形API未返回电子邮件

19

我有以下代码:

$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);

以上的输出结果如下:

$metaData

 [
   "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,因此问题不在权限上。尽管如此,图形用户有时候没有电子邮件(虽然有些情况下会有)。

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


9
API仅返回已确认的电子邮件地址。还有很多其他因素,例如隐私设置也可能会影响这一点。因此,请不要编写依赖于从API获取电子邮件地址的应用程序。许多用户在Facebook上注册时只使用移动设备,并没有填写电子邮件地址。 - CBroe
@CBroe请将您的评论写成答案,这样我就可以接受它了。 - Yahya Uddin
@YahyaUddin,此外,有很多用户实际上是通过他们的手机注册的,他们的帐户上根本没有电子邮件。虽然很老,但可能会对某些人有所帮助。 - Kasun Rajapaksha
6个回答

20

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

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

那是正确的答案。 - Nathan B

6
今天我遇到的一种情况是,如果我注册一个帐户,不使用我的电子邮件ID登录,而是使用手机号码登录,即使在我的个人资料中设置了主要电子邮件地址或将其设置为手机号码,在这种情况下,Facebook会返回空值以获取电子邮件地址。
我已经更新了帐户,并在Facebook页面的设置下添加了电子邮件到主要电子邮件字段,然后我能够从Facebook获取电子邮件地址。
希望这能帮助某些人。
快乐编程...

5

首先检查您的访问令牌是否获得了用户的电子邮件权限

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

4
你需要检查以下几个步骤。
  1. check if your access token gets the user's permission for the email . for that login to your developer account of your app, then tools->graph api explorer then enable user's permission for the email.

  2. check the facebook version, use the latest version.

  3. add email scope in face book login script as below

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

    or

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

3

进入您的应用程序 > 应用审核 > 权限和特性

请求电子邮件的高级访问权限,这应该会将标准访问权限转换为高级访问权限


1
我通过指定图形 API 版本解决了这个问题。
我的请求字段 first_name,last_name,email,picture 到 URL: https://graph.facebook.com/me 未返回电子邮件。
到 URL: https://graph.facebook.com/v2.9/me 已返回电子邮件。
希望这有所帮助。

我指定了版本,所以那似乎不是问题。 - Yahya Uddin
我也更新到了最新版本,但仍然无法返回电子邮件:/ - Ibad Shaikh
我只收到了姓名和ID字段,没有收到电子邮件。 - Nathan B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接