Facebook登录已获用户姓名和ID,如何获取用户邮箱?
嘿,我来帮你搞定这个获取Facebook用户邮箱的问题!
你当前的代码之所以拿不到邮箱,核心原因是:Facebook Graph API默认调用/me时只会返回id和name两个基础字段——哪怕你在开发者后台配置了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




