Facebook用户Graph不会返回电子邮件PHP

时间:2015-08-06 14:24:17

标签: 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门户,点击允许权限等等,然后它将我重定向到login-callback

login-callback上的代码是:

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
        )

)

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

我还检查过登录页面上的按钮是否有“&amp; 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。

3 个答案:

答案 0 :(得分:3)

我解决了这个问题。

您需要在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");
        }
    }
}

答案 1 :(得分:0)

我的一位朋友在过去5天内试图解决这个问题。 huummm非常恼火。在2分钟内得到了爱...

假设:使用PHP进行O2Authentication 解决方案:

$loginURL =  $fb->getLoginUrl({your redirect URL},['email']);

工作完成了。

谢谢&amp;此致

Jaiswar Vipin Kumar R。

答案 2 :(得分:-1)

检查应用程序版本是否为2.2或更低版本,它将正常工作,它不会返回。为此,您必须请求具有电子邮件访问范围的api。