【问题标题】:can't get email address from Facebook SDK v5 for PHP无法从 Facebook SDK v5 for PHP 获取电子邮件地址
【发布时间】:2015-07-14 16:25:47
【问题描述】:

我想在使用他们的 PHP SDK V5 从 Facebook 登录后获取用户的电子邮件地址,但遇到了我不太明白的问题。

根据他们的分步指南https://developers.facebook.com/docs/reference/php/5.0.0

我创建了 Login.php 和 Login-callback.php 文件

Login.php

session_start() ;
require_once __DIR__ . '/src/Facebook/autoload.php';

$fb = new Facebook\Facebook([
  'app_id' => $app_id,
  'app_secret' => $app_secret,
  'default_graph_version' => 'v2.2',
]);

$helper = $fb->getRedirectLoginHelper();
$permissions = ['email', 'public_profile']; // optional
$loginUrl = $helper->getLoginUrl('http://www.example.com/login-callback.php', $permissions);


echo '<a href="' . $loginUrl . '">Log in with Facebook!</a>';

登录回调.php

session_start() ;
require_once __DIR__ . '/src/Facebook/autoload.php';

# login-callback.php
$fb = new Facebook\Facebook([
  'app_id' => $app_id,
  'app_secret' => $app_secret,
  'default_graph_version' => 'v2.2',
]);

$helper = $fb->getRedirectLoginHelper();
try {
  $accessToken = $helper->getAccessToken();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
  // When Graph returns an error
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
  // When validation fails or other local issues
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}

if (isset($accessToken)) {
  // Logged in!
  $_SESSION['facebook_access_token'] = (string) $accessToken;

  // OAuth 2.0 client handler
$oAuth2Client = $fb->getOAuth2Client();

// Exchanges a short-lived access token for a long-lived one
$longLivedAccessToken = $oAuth2Client->getLongLivedAccessToken($_SESSION['facebook_access_token']);


// Sets the default fallback access token so we don't have to pass it to each request
$fb->setDefaultAccessToken($longLivedAccessToken);

try {
  $response = $fb->get('/me');
  $userNode = $response->getGraphUser();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
  // When Graph returns an error
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
  // When validation fails or other local issues
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}

echo 'Logged in as ' . $userNode->getName();

$graphObject = $response->getGraphObject();
$email = $graphObject->getProperty('email');  // This is not getting any thing

echo $email; // Empty

}

graphObject->getProperty('email');没有返回任何东西

【问题讨论】:

  • 您需要询问电子邮件字段
  • 我该怎么做?因为我试图发出这样的请求 $request = new FacebookRequest($longLivedAccessToken, 'GET', '/me'); $response = $request->execute(); $graphObject = $response->getGraphObject(); $email = $graphObject->getProperty('email');
  • 它给了我致命错误:找不到类“FacebookRequest”
  • $fb-&gt;get('/me?fields=email');
  • @WizKid,您应该将此作为答案发布

标签: php facebook facebook-graph-api


【解决方案1】:

我的问题是一样的。我的网站识别了登录名,我只收到了姓名和 ID。

我在这里看到了这个提示:

$fb->get('/me?fields=email');

这解决了我的问题!

【讨论】:

  • 但是如果用户添加了有效的电子邮件,您只会收到一封电子邮件。见这里:developers.facebook.com/docs/graph-api/reference/user
  • 正如@Norbert 所写,很明显是documented注意,即使您请求email 权限,也不能保证您会收到一个电子邮件地址。例如,如果有人使用电话号码而不是电子邮件地址注册 Facebook,则电子邮件字段可能为空。
【解决方案2】:

你也可以在你的 php 文件中使用 Facebook 自己的Login Button(通过他们的工具插件生成器生成),这样会更吸引人,但请记住要注意这个 HTML5 属性 data-scope。 检查这个例子:

<div class="fb-login-button" data-max-rows="1" 
   data-size="large" data-button-type="login_with" data-show-faces="false"
   data-scope="email" data-auto-logout-link="false" 
   data-use-continue-as="false">
</div>

【讨论】:

    【解决方案3】:

    我认为您应该使用 Facebook Graph API 方法获取用户帐户信息。获取成功访问令牌后,使用api graph方法。像这样:

    $userProfile = $facebook->api('/me?fields=id,first_name,last_name,email,gender,locale,picture');
    
    $userClass = new User;
    $userData = $userClass->checkFBUserData($userProfile);
    

    您可以打印这样的电子邮件地址:echo $userData['email'];

    更多详情请查看this tutorial

    这是工作源,我已经测试过了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      相关资源
      最近更新 更多