使用PHP 4.0中的SDK 4.0登录,只返回用户的全名和ID,而不返回

时间:2015-08-08 04:36:24

标签: php facebook facebook-graph-api login

我正在将Facebook登录集成到我的网站中。我正在使用Facebook SDK 4.0。我的应用API版本是2.4。当用户使用Facebook成功登录时,我正在尝试获取基本的个人资料信息。但问题是 - 我只能获得用户ID和他的全名。其他东西,如名字,姓氏,性别等,都没有收到。当然,我也需要稍后在某个阶段的人和用户个人资料图片的电子邮件。这是我的工作代码,它只打印名称和ID:

<?php
// start session
session_start();

$app_id = 'app_id'; // Facebook App ID
$api_secret = 'app_secret'; // Facebook App Secret
$required_scope = 'public_profile, publish_actions, email'; // Permissions required
$redirect_url = 'site_url/index.php'; // FB redirects to this page with a code

require_once __DIR__ . "/facebook-php-sdk-v4.0/autoload.php";

use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRedirectLoginHelper;

// init app with app id (APPID) and secret (SECRET)
FacebookSession::setDefaultApplication($app_id,$api_secret);

// login helper with redirect_uri
$helper = new FacebookRedirectLoginHelper( $redirect_url  );

try {
  $session = $helper->getSessionFromRedirect();
} catch( FacebookRequestException $ex ) {
  // When Facebook returns an error
} catch( Exception $ex ) {
  // When validation fails or other local issues
}

// see if we have a session
if ( isset( $session ) ) {
  // graph api request for user data
  $request = new FacebookRequest( $session, 'GET', '/me' );
  $response = $request->execute();
  // get response
  $graphObject = $response->getGraphObject();

  // print data
  echo "<pre>";
  echo  print_r( $graphObject, 1 );
  echo "</pre>";
} else {
  // show login url
  echo '<a href="' . $helper->getLoginUrl() . '">Login</a>';
}

打印以下信息:

Facebook\GraphObject Object
(
    [backingData:protected] => Array
        (
            [name] => Fname Lname
            [id] => ID
        )

)

你可以看到我已经给出了范围参数。但它没有帮助我。然后我开始搜索STO并找到一些解决方案,建议我们添加以下代码行,如果您使用API​​ v2.4明确提及您想要的字段:

$request = (new FacebookRequest($this->session, 'GET', '/me/?fields=friends,id,name,birthday,email,picture,gender,location,address,email,hometown'))->execute()->getGraphObject()->asArray();   

但是当我使用上面的代码时,它再次没有工作,而是我的空白屏幕甚至没有ID和名称。

我也访问过Facebook开发人员文档,但它们太长,太复杂,用户友好程度不够,开发人员可以在短时间内轻松跟踪它们。

我认为关于Facebook登录存在很多困惑。网上有很多文章,每个都有自己的方法。有些人使用PHP,而其他人也使用JavaScript来弹出登录窗口。老实说,我在这个层面上非常困惑,无法理解哪个是完成任务的最佳,推荐和工作方法。因此,我正在寻找以下问题:

  1. 我希望帮助我的上述代码正常工作,以便它可以获取有关用户的所有信息,包括电子邮件和个人资料照片。
  2. 使用Facebook登录的某些方法需要用户完整登录页面,而其他一些方法则显示用于登录的弹出窗口,用户在成功登录后保留在同一页面上,最初生成弹出窗口。两者有何不同?
  3. 使用Facebook登录的最佳做法是什么?还应该使用哪个SDK和Graph API版本?

1 个答案:

答案 0 :(得分:4)

在生成登录网址时,您必须传递您获得许可的scopes。您可以通过修改

来生成此内容
echo '<a href="' . $helper->getLoginUrl() . '">Login</a>';

echo '<a href="' . $helper->getLoginUrl(array('public_profile','email', 'user_friends')) . '">Login</a>';

这只是一个例子,可能无法满足您的所有要求。您可能需要根据您的要求添加更多范围。

默认情况下允许超过三个范围,您不必通过Facebook进行应用验证。但是,如果您添加任何其他范围,您可能必须先经过审批流程才能使用应用程序。

当然,从v2.4起,你必须明确要求每个领域。在默认情况下email提供/me之前,不再提供。你必须添加它,

 /me?fields=id,first_name,last_name,friends,email

如果用户已登录,则使用Facebook登录将不会要求登录,如果用户之前未获得此应用的许可,则会立即转到权限屏幕。如果用户已经获得了所有权限并且他已经登录了facebook,点击登录facebook链接会立即将用户重定向到重定向处理程序。

我建议,你应该总是使用最新稳定的facebook apis。

<强>更新

刚刚意识到facebook允许使用电话号码创建帐户。因此,如果用户使用电话号码而不是电子邮件创建了帐户,则在api回复中,您将收到电话号码,而不是如下所示的电子邮件,

...
'email' => '465454654654'
...

因此,您的代码必须处理这种情况。