php - Facebook 用户图不返回电子邮件 PHP

标签 php facebook facebook-graph-api

我是整个 Facebook API 的新手。 我正在为用户创建一个登录页面,其想法是他们使用 Facebook 登录。

在登录页面的顶部我有以下代码:

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

然后再低一点,我有登录按钮:

if(isset($fb)){
    $helper = $fb->getRedirectLoginHelper();
    $permissions = ['email']; // optional
    $fb_login_url = $helper->getLoginUrl("$server_url/public/facebook/login-callback", $permissions);
} else $fb_login_url = "";

if(strlen($fb_login_url) >= 1) echo "<a href='$fb_login_url'><i class='fa fa-2x fa-facebook-square'></i></a>";
else echo "<a href='#' disabled='disabled'><i class='fa fa-2x fa-facebook-square'></i></a>";

代码一直运行到那里,如果我点击按钮,我就会进入 Facebook 门户,点击允许权限等等,然后它会将我重定向到登录回调

登录回调上的代码是:

if(isset($fb)){
    $helper = $fb->getRedirectLoginHelper();
    try {
        $accessToken = $helper->getAccessToken();
    } catch(Facebook\Exceptions\FacebookResponseException $e) {
        $err_message = 'Graph returned an error: ' . $e->getMessage();
        access_log("facebook_login","IP:$client_ip\r\nFacebook Error: $err_message");
    } catch(Facebook\Exceptions\FacebookSDKException $e) {
        $err_message = 'Facebook SDK returned an error: ' . $e->getMessage();
        access_log("facebook_login","IP:$client_ip\r\nFacebook Error: $err_message");
    }

    if (strlen($err_message) <= 0 && isset($accessToken)) {
        $_SESSION['facebook_access_token'] = (string) $accessToken;
        $fb->setDefaultAccessToken("$accessToken");

        try {
            $response = $fb->get('/me');
            $userNode = $response->getGraphUser();

//            $username = $userNode->getName();
//            $firstname = $userNode->getFirstName();
//            $lastname = $userNode->getLastName();
            print_r($userNode);
        } catch(Facebook\Exceptions\FacebookResponseException $e) {
            $err_message =  'Graph returned an error: ' . $e->getMessage();
            access_log("facebook_login","IP:$client_ip\r\nFacebook Error: $err_message");
        } catch(Facebook\Exceptions\FacebookSDKException $e) {
            $err_message =  'Facebook SDK returned an error: ' . $e->getMessage();
            access_log("facebook_login","IP:$client_ip\r\nFacebook Error: $err_message");
        }
    }
}

$userNode 看起来像这样:

Facebook\GraphNodes\GraphUser Object
(
    [items:protected] => Array
        (
            [name] => Jacques Koekemoer
            [id] => xxxxxxxxxxxxxxxxxx
        )

)

我已设置允许发送电子邮件的权限,如果我没有记错的话,公开个人资料会自动发送。

我还检查了登录页面上的按钮是否有“&scope=email”。下面是我现在在页面上的登录按钮中的代码:

https://www.facebook.com/v2.2/dialog/oauth?client_id=xxxxxxxx&state=xxxxxxxx&response_type=code&sdk=php-sdk-5.0.0&redirect_uri=http%3A%2F%2Fxxxxxxx.xxxxxxxxxxxx。 co.za%2Fpublic%2Ffacebook%2Flogin-callback&scope=email

我替换了 client_idstate 和域名,因为我不希望这些信息公开,因为我不知道人们可以用它做什么。

如果需要解决问题,请告诉我。

我使用了 Facebook 指南 here设置并下载 SDK。

最佳答案

我解决了这个问题。

您需要在 get 函数中向 Facebook 请求特定字段。

$response = $fb->get('/me?fields=id,name,email');

可以找到here .

您可以查询的字段的完整列表可以在 here 中找到.

示例

if (isset($fb)) {
    $helper = $fb->getRedirectLoginHelper();
    try {
        $accessToken = $helper->getAccessToken();
    } catch (Facebook\Exceptions\FacebookResponseException $e) {
        $err_message = 'Graph returned an error: ' . $e->getMessage();
        access_log("facebook_login", "IP:$client_ip\r\nFacebook Error: $err_message");
    } catch (Facebook\Exceptions\FacebookSDKException $e) {
        $err_message = 'Facebook SDK returned an error: ' . $e->getMessage();
        access_log("facebook_login", "IP:$client_ip\r\nFacebook Error: $err_message");
    }

    if (strlen($err_message) <= 0 && isset($accessToken)) {
        $_SESSION['facebook_access_token'] = (string)$accessToken;
        $fb->setDefaultAccessToken("$accessToken");

        try {
           // this here is where you specify the fields
            $response = $fb->get('/me?fields=id,name,email');
            $userNode = $response->getGraphUser();
            /* handle the result */
        } catch (Facebook\Exceptions\FacebookResponseException $e) {
            $err_message = 'Graph returned an error: ' . $e->getMessage();
            access_log("facebook_login", "IP:$client_ip\r\nFacebook Error: $err_message");
        } catch (Facebook\Exceptions\FacebookSDKException $e) {
            $err_message = 'Facebook SDK returned an error: ' . $e->getMessage();
            access_log("facebook_login", "IP:$client_ip\r\nFacebook Error: $err_message");
        }
    }
}

关于php - Facebook 用户图不返回电子邮件 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31858341/

相关文章:

PHP 警告 PHP 启动无法加载动态库 php_pdo_sqlsrv_7_ts_x64.dll

Google App Engine 上的 PHP

facebook - 保存电子邮件地址 Facebook + Parse (Swift)

javascript - 分享后关闭手机上的 FB 选项卡

javascript - 使用 facebook graph api 获取照片的缩略图

exception - curl 异常 : 28: connect() timed out?

javascript - 如何将 php 变量传递给 javascript 数组?

javaScript 函数在第一次点击时不起作用

android - 插页式广告未显示,但正在计算展示次数

c# - 通过 WebClient 请求 JSON 返回 URL 抛出异常