You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Facebook登录已获用户姓名和ID,如何获取用户邮箱?

嘿,我来帮你搞定这个获取Facebook用户邮箱的问题!

你当前的代码之所以拿不到邮箱,核心原因是:Facebook Graph API默认调用/me时只会返回idname两个基础字段——哪怕你在开发者后台配置了email权限,也需要显式指定要获取的字段才行。下面分两步帮你修改代码:

1. 修改API请求,明确声明要获取email字段

把你原来的FB.api('/me')调用改成下面这样,通过fields参数指定需要的字段:

FB.api('/me', { fields: 'id,name,email' }, function(response){
  console.log(response); // 现在控制台应该能看到email字段(前提是用户授权了)
});

也可以用URL参数的写法:FB.api('/me?fields=id,name,email', ...),效果完全一致。

2. 确保登录流程中请求了email权限

虽然你在后台开启了email权限,但如果用户登录时没有被触发授权这个权限,Facebook还是不会返回邮箱信息。所以如果用户未登录,你需要在调用FB.login时加上scope参数声明权限:

// 可以把这个函数绑定到你的登录按钮点击事件上
function loginWithFacebook() {
  FB.login(function(response) {
    if (response.status === 'connected') {
      // 登录成功后再调用API获取完整信息
      FB.api('/me', { fields: 'id,name,email' }, function(userResponse){
        console.log(userResponse);
      });
    }
  }, { scope: 'email' }); // 这里明确请求email权限
}

整合后的完整代码示例

把这些修改融入你的现有代码,最终版本大概是这样:

window.fbAsyncInit = function(){
  FB.init({
    appId:'326746698293638',
    cookie:true,
    xfbml:true,
    version:'v7.0'
  });

  // 检查用户当前登录状态
  FB.getLoginStatus(function(response){
    if(response.status === 'connected'){
      // 修改API请求,指定要获取的字段
      FB.api('/me', { fields: 'id,name,email' }, function(response){
        console.log(response);
      });
    } else {
      // 可选:给登录按钮绑定点击事件(根据你的页面UI调整)
      // document.getElementById('fb-login-btn').addEventListener('click', loginWithFacebook);
    }
  });
};

// Facebook登录触发函数
function loginWithFacebook() {
  FB.login(function(response) {
    if (response.status === 'connected') {
      FB.api('/me', { fields: 'id,name,email' }, function(userResponse){
        console.log(userResponse);
      });
    }
  }, { scope: 'email' });
}

// 加载Facebook SDK的脚本
(function(d,s,id){
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "https://connect.facebook.net/en_US/sdk.js";
  fjs.parentNode.insertBefore(js, fjs);
}(document,'script','facebook-jssdk'));

额外提醒

  • 如果用户的Facebook账号没有绑定邮箱,或者用户拒绝了email权限的请求,返回结果里还是不会有email字段,所以你的业务代码要做好字段不存在的容错处理
  • 再确认一下你的应用已经通过Facebook的权限审核(email属于非公开权限,即使应用上线,权限未通过审核也可能无法正常获取)。

内容的提问来源于stack exchange,提问作者Paddy Hallihan

火山引擎 最新活动