使用facebook SDK 4.0获取电子邮件


Get email with facebook SDK 4.0

这是我的代码。我正在尝试获取用户电子邮件,但无法。昨天我收到了正确的电子邮件,但我错误地删除了文件。我现在缺少什么?

在login_fb.php中,我这样调用电子邮件:echo $_SESSION['email'];

session_start();
//added in v4.0.0
require_once 'autoload.php';
use Facebook'FacebookSession;
use Facebook'FacebookRedirectLoginHelper;
use Facebook'FacebookRequest;
use Facebook'FacebookResponse;
use Facebook'FacebookSDKException;
use Facebook'FacebookRequestException;
use Facebook'FacebookAuthorizationException;
use Facebook'GraphObject;
use Facebook'Entities'AccessToken;
use Facebook'HttpClients'FacebookCurlHttpClient;
use Facebook'HttpClients'FacebookHttpable;
//init app with app id and secret
FacebookSession::setDefaultApplication( '','' );
//login helper with redirect_uri
$helper = new FacebookRedirectLoginHelper('http://www.myurl/facebook/fbconfig.php' );
try {
    $session = $helper->getSessionFromRedirect();
} catch( FacebookRequestException $ex ) {
    //when facebook returns an error
} catch( Exception $ex ) {
    //when validation fails or other local issues
}
if (isset($session)) {
    $request = new FacebookRequest( $session, 'GET', '/me?locale=en_US&fields=name,first_name,last_name,email,gender' );
    $loginUrl = $helper->getLoginUrl( array(
        'scope' => 'email'
    ));  
    $response = $request->execute();
    //response
    $graphObject    = $response->getGraphObject();
    $fbid           = $graphObject->getProperty('id');          // Facebook ID
    $full_name      = $graphObject->getProperty('name');        // Facebook full name
    $first_name     = $graphObject->getProperty('first_name');  // Facebook first name
    $last_name      = $graphObject->getProperty('last_name');   // Facebook last name 
    $email          = $graphObject->getProperty('email');       // Facebook email
    $birthday       = $graphObject->getProperty('birthday');    // Facebook birthday
    $gender         = $graphObject->getProperty('gender');      // Facebook gender
    /* ---- session variables -----*/
    $_SESSION['fbid']       = $fbid;           
    $_SESSION['full_name']  = $full_name;
    $_SESSION['first_name'] = $first_name;
    $_SESSION['last_name']  = $last_name;
    $_SESSION['email']      = $email;
    $_SESSION['birthday']   = $birthday;
    $_SESSION['gender']     = $gender;
    /* ---- header location after session ----*/
    header("Location: ../login_fb.php");
} else {
    $loginUrl = $helper->getLoginUrl();
    header("Location: ".$loginUrl);
}

您正在调用$helper->getLoginUrl两次。第一次在作用域中有email,但没有对函数的返回值执行任何操作;第二次你根本不要求任何权限。

完全删除对该方法的第一个调用。多次调用它将导致存储到会话中的随机state值出现问题。然后在重定向到该URL之前,将权限添加到剩余调用中的作用域。


仅供参考:自动将用户重定向到登录对话框被认为是糟糕的做法和糟糕的用户体验;为了测试的目的,在一个真正的面向用户的应用程序中,你应该只在用户请求时触发登录。