Facebook Login PHP无法获取邮箱问题求助,已配置email scope
问题分析与解决方案
嘿,我帮你排查出代码里的两个核心问题,这就是你拿不到邮箱的关键原因:
Graph API请求错误携带了
scope=email参数
scope是用来在登录授权阶段向用户申请权限的,后续调用Graph API获取用户数据时根本不需要加这个参数,你在/me?scope=email里加它完全无效,反而可能干扰正常请求。未明确指定要获取的
email字段
从Facebook Graph API v2.4版本开始,默认调用/me只会返回id和name两个基础字段——哪怕你已经拿到了email权限,也必须主动指定fields参数,才能让接口返回邮箱数据。
下面是修正后的完整代码,我标注了修改的关键位置:
if ( isset( $session ) ) { // 修正:移除无效的scope参数,添加fields指定要获取的字段 $request = new FacebookRequest( $session, 'GET', '/me?fields=id,name,email' ); $response = $request->execute(); // 获取响应数据 $graphObject = $response->getGraphObject(); var_dump($graphObject); $fbid = $graphObject->getProperty('id'); // 获取Facebook ID $fbfullname = $graphObject->getProperty('name'); // 获取Facebook全名 $femail = $graphObject->getProperty('email'); // 获取Facebook邮箱地址 /* ---- 会话变量 -----*/ $_SESSION['FBID'] = $fbid; $_SESSION['FULLNAME'] = $fbfullname; $_SESSION['EMAIL'] = $femail; /* ---- 会话设置后跳转页面 ----*/ header("Location: /ico/"); } else { // 这里的scope设置是正确的,保持不变即可 $loginUrl = $helper->getLoginUrl(array('scope' => 'email')); header("Location: ".$loginUrl); }
最后再补充几个排查要点:
- 确认你的Facebook应用已经完成基础审核(面向公众的应用需要),否则部分权限会被限制
- 检查用户的Facebook账号确实绑定了有效邮箱,且该邮箱被设置为主邮箱
- 调试时可以仔细查看
var_dump($graphObject)的输出,如果还是没有email字段,可能需要确认授权流程是否真的成功获取到了email权限
内容的提问来源于stack exchange,提问作者Egīls Fīze
相关产品推荐
相关产品推荐

