Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Facebook登录api返回用户电子邮件地址_Php_Facebook_Email_Facebook Graph Api_Facebook App Requests - Fatal编程技术网

Php Facebook登录api返回用户电子邮件地址

Php Facebook登录api返回用户电子邮件地址,php,facebook,email,facebook-graph-api,facebook-app-requests,Php,Facebook,Email,Facebook Graph Api,Facebook App Requests,我正在尝试在我的网站上实现facebook登录。我可以得到所有相关的数据,我需要除了电子邮件地址。数据将使用mysql存储 我遇到了一个有趣的博客,它创建了一个逐步从facebook创建登录的方法。所有这些都很有效,但我不能返回用户的电子邮件地址,这样就可以将其与他们的姓名、年龄、个人资料和图片一起存储在数据库中 这是我的fb_访问文件:注意,我并不是自己写的,如果有类似的东西,它会被告知 <?php $app_id = "XXXXX"; $app_secret = "XXXXX"

我正在尝试在我的网站上实现facebook登录。我可以得到所有相关的数据,我需要除了电子邮件地址。数据将使用mysql存储

我遇到了一个有趣的博客,它创建了一个逐步从facebook创建登录的方法。所有这些都很有效,但我不能返回用户的电子邮件地址,这样就可以将其与他们的姓名、年龄、个人资料和图片一起存储在数据库中

这是我的fb_访问文件:注意,我并不是自己写的,如果有类似的东西,它会被告知

<?php
$app_id     = "XXXXX";
$app_secret = "XXXXX";
$site_url   = "http://localhost/XXXXXX/";

try{
    include_once "src/facebook.php";
}catch(Exception $e){
    error_log($e);
}
$facebook = new Facebook(array(
    'appId'     => $app_id,
    'secret'    => $app_secret,
    ));

// Get User ID
$user = $facebook->getUser();

if($user){
    try{
        $user_profile = $facebook->api('/me');
    }catch(FacebookApiException $e){
        error_log($e);
        $user = NULL;
    }
}

if($user){
    // Get logout URL  logout add username to destroy cookie
    $logoutUrl = $facebook->getLogoutUrl(array(
   'next'=>'http://localhost/XXXXX/logout.php'));
    }else{
    // Get login URL
    $loginUrl = $facebook->getLoginUrl(array(
        'scope'         => 'read_stream, publish_stream, user_birthday, user_location, user_work_history, user_hometown, user_photos',
        'redirect_uri'  => $site_url."?profile_builder=".md5($user),
        ));
}

if($user){
    $queries = array(
        array('method' => 'GET', 'relative_url' => '/'.$user),
        array('method' => 'GET', 'relative_url' => '/'.$user.'/home?limit=50'),
        array('method' => 'GET', 'relative_url' => '/'.$user.'/friends'),
        array('method' => 'GET', 'relative_url' => '/'.$user.'/photos?limit=6'),
        );
    try{
        $batchResponse = $facebook->api('?batch='.json_encode($queries), 'POST');
    }catch(Exception $o){
        error_log($o);
    }
    $user_info      = json_decode($batchResponse[0]['body'], TRUE);
    $feed           = json_decode($batchResponse[1]['body'], TRUE);
    $friends_list   = json_decode($batchResponse[2]['body'], TRUE);
    $photos         = json_decode($batchResponse[3]['body'], TRUE);
    if(isset($_POST['pub'])){
        try{
            $statusUpdate = $facebook->api("/$user/feed", 'post', array(
                'message'       => 'Check out 25 labs',
                'link'          => 'http://25labs.com',
                'picture'       => 'http://25labs.com/images/25-labs-160-160.jpg',
                'name'          => '25 labs | A Technology Laboratory',
                'caption'       => '25labs.com',
                'description'   => '25 labs is a Technology blog that covers the tech stuffs happening around the globe. 25 labs publishes various tutorials and articles on web designing, Facebook API, Google API etc.',
                ));
        }catch(FacebookApiException $e){
            error_log($e);
        }
    }
    if(isset($_POST['status'])){
        try{
            $statusUpdate = $facebook->api("/$user/feed", 'post', array('message'=> $_POST['status']));
        }catch(FacebookApiException $e){
            error_log($e);
        }
    }
}
?>
这将返回名称,还有DOB,它可以工作,但是

echo $user_info['email'];
//or
echo $user_profile['email']; 
似乎不起作用,它会在浏览器中返回“注意:未定义索引:电子邮件”。
我明白这意味着什么,但我遇到了一个检索电子邮件的例子,我认为它必须工作,因为它没有说明任何地方它没有。我知道这篇文章是2年前创建的,但我不明白为什么现在它不起作用,或者电子邮件地址不能从facebook传递是一件新鲜事。

您没有在scope数组中插入
电子邮件
权限

$loginUrl = $facebook->getLoginUrl(array(
    'scope'         => 'read_stream, publish_stream, user_birthday, user_location, user_work_history, user_hometown, user_photos',
    'redirect_uri'  => $site_url."?profile_builder=".md5($user),
    ));
范围应为

 'scope'         => 'email, read_stream, publish_stream, user_birthday, user_location, user_work_history, user_hometown, user_photos'

请参阅和

您尚未在范围数组中插入
电子邮件
权限

$loginUrl = $facebook->getLoginUrl(array(
    'scope'         => 'read_stream, publish_stream, user_birthday, user_location, user_work_history, user_hometown, user_photos',
    'redirect_uri'  => $site_url."?profile_builder=".md5($user),
    ));
范围应为

 'scope'         => 'email, read_stream, publish_stream, user_birthday, user_location, user_work_history, user_hometown, user_photos'

请参见和

我已将电子邮件添加到范围中,但仍得到一个未识别的索引error@PaulLedger你试过。。。退出应用程序并重新登录。是否已删除应用程序,然后再次将其添加到您的帐户?它不会追溯添加权限,因为这将是一个主要的隐私问题!此外,您还应该使用graph api/权限端点来检查用户是否添加了权限,因为他们可以在选择时撤销扩展权限,所以您不应该总是依赖它,因为我在facebook上单击了“跳过”按钮。在我点击ok后,它得到了电子邮件地址。有没有一种方法可以避免这种情况,或者我应该只显示一个电子邮件字段,以防用户单击跳过。是的,你可以将电子邮件放在作用域的末尾,那么即使用户单击跳过而不是OK,它也是可访问的。我将电子邮件添加到作用域中,但我仍然得到一个未识别的索引error@PaulLedger你试过。。。退出应用程序并重新登录。是否已删除应用程序,然后再次将其添加到您的帐户?它不会追溯添加权限,因为这将是一个主要的隐私问题!此外,您还应该使用graph api/权限端点来检查用户是否添加了权限,因为他们可以在选择时撤销扩展权限,所以您不应该总是依赖它,因为我在facebook上单击了“跳过”按钮。在我点击ok后,它得到了电子邮件地址。有没有一种方法可以避免这种情况,或者我应该在用户单击跳过时显示一个电子邮件字段。是的,您可以将电子邮件放在范围的末尾,即使用户单击跳过而不是确定,也可以访问它