Facebook Graph API没有返回电子邮件

时间:2017-05-02 12:17:20

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

我有以下代码:

$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...",
]

正如您所看到的,scopes中的$metaData显然有email所以它不是一个权限问题。尽管如此,图表用户有时没有电子邮件(尽管在某些情况下它确实如此)。

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

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

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

没有回复电子邮件。

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

回复电子邮件。

希望这有帮助。

答案 3 :(得分:1)

您必须检查以下步骤。

  1. 检查您的访问令牌是否获得了用户对电子邮件的许可。对于该登录名到您应用程序的开发人员帐户,然后使用tools-> graph api explorer,然后启用用户对电子邮件的许可。

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

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

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

答案 4 :(得分:1)

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

我已经更新了帐户,并向primary emailsettings下的facebook page的{​​{1}}字段中添加了电子邮件,然后我就可以从email id中获得facebook

希望这对某人有帮助。

快乐的编码...