我的应用主页网址顶部有以下内容。
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({
appId: '123456789',
status: true,
cookie: true,
xfbml: true,
oauth: true
});
FB.getLoginStatus(function(response) {
if(response.status === 'connected') {
if(response.authResponse != 'undefined'){
window.location = '<?php echo $base_url; ?>register';
}
} else if(response.status === 'not_authorized')
{
//it means we have a user but he hasn't granted any permissions to our app
//we're going to redirect him to the permission page
window.location = 'https://www.facebook.com/dialog/oauth?client_id=456109407732505&response_type=code&redirect_uri=<?php echo $base_url; ?>register&scope=email,publish_actions,user_likes';
} else
{
//the user is not logged in, as you already have a login button you don't have to do nothing
}
});
FB.Event.subscribe('auth.login', function(response) {
window.location = '<?php echo $base_url; ?>register';
});
};
(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 = '//connect.facebook.net/en_US/all.js';
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
</script>
<div class="fb-login-button"
data-show-faces="false"
data-scope="email,publish_actions,manage_notifications,user_likes"
size="large"
data-width="200"
data-max-rows="1">
</div>
此代码抛出错误的唯一时间是查看站点的用户登录到FB但未接受应用程序的权限。在这种情况下,用户将被重定向到JS中指定的链接(“https://www.facebook.com/dialog/oauth?client_id=456109407732505&response_type=code&redirect_uri= register&amp; scope = email,publish_actions,user_likes”),他们可以选择接受或拒绝所请求的权限。如果用户选择通过该链接接受权限,那么一切都很顺利。但是,单击FB登录按钮后,将出现一个弹出窗口,该弹出窗口还允许用户接受或拒绝该权限。在弹出窗口上接受所请求的权限后,由于某种原因,未提取用户的电子邮件。用户被重定向到register.php文件并引发错误。但是,当register.php页面刷新时,它可以正常工作。
在我的register.php文件中。我有
require_once('application/third_party/facebook_api/src/facebook.php');
$facebook = new Facebook(array('appId' => '123456789',
'secret' => 'app_secret',
'cookie' => true));
$access_token = $facebook->getAccessToken();
if($access_token != '')
{
$user = $facebook->getUser();
if($user != 0)
{
// Get the user's info
$user_profile = $facebook->api('/'.$user);
// Get the user's permissions
$perms = $facebook->api('/'.$user.'/permissions');
$perms = $perms['data'][0];
$installed = $perms['installed'];
if($installed == 1)
{
$fb_first_name = $user_profile['first_name'];
$fb_last_name = $user_profile['last_name'];
// Find out if they accepted the email permission
$email_perm = $perms['email'];
if($email_perm == 1)
{
$fb_email = $user_profile['email'];
} else
{
$fb_email = '';
}
}
}
PHP给我一个错误,读取“未定义索引'电子邮件'。”它可以刷新页面,但不是第一次。您可以转到my app查看一个有效的示例。
非常感谢
答案 0 :(得分:0)
你应该“不能”不再混合读写权限 使用登录按钮 你必须得到基本的和阅读,然后在你的网站流程中要求在需要时写作
https://developers.facebook.com/docs/facebook-login/permissions/
以下是一些在请求权限时使用的准则 在登录期间和之后:
仅询问对应用程序至关重要的权限。
在需要它们的上下文中请求许可。对于 例如,如果您的应用想要在一个人附近显示感兴趣的地方 home,在显示之前询问user_location 信息会让人更好地理解为什么 正在申请许可。
在要求之前使用任何可用的公开个人资料信息 允许。例如,有一个age_range字段 安装您的应用的任何人的公开个人资料。这个字段可能是 足以满足您的应用,而不是请求user_birthday 权限。
分离读取和发布权限的请求。更多 详情见下文。
永远不要求您认为可能需要的权限。 人们会怀疑并拒绝您的应用。