我在示例中集成了Google API,通过Google+登录我的网站,从他/她的个人资料中获取用户电子邮件、名字和姓氏的详细信息。当我使用以下功能时
public function getProfile()
{
$endpoint = 'https://www.googleapis.com/oauth2/v1/userinfo';
return (array) json_decode($this->_getData('profile', $endpoint));
}
我得到的输出是
Array ( [firstname] => xxxx [appid] => 11XXXXXXXXXXXXXXXXX92 [email] => [lastname] => YYYY [location] => [username] => XXXX YYYY )
其中,由于email
为空。
如何获取电子邮件id?必须在这里的$endpoint
中写入什么uri才能获得电子邮件id和其他数据?
您没有显示您请求的范围,但似乎您没有请求https://www.googleapis.com/auth/userinfo.email范围。
但是,用户信息作用域和终结点已被弃用,并将于2014年9月删除。
接下来,您应该将电子邮件作用域与其中一个配置文件作用域(如配置文件、https://www.googleapis.com/auth/plus.me或https://www.googleapis.com/auth/plus.login)访问用户的电子邮件,然后使用Google+neneneba API端点之一,如用户ID为"me"的people.get。
@囚犯在现场,如果您请求email
作用域,您将能够在plus.people.get
API调用中获取用户的电子邮件地址。我将向您展示如何在JavaScript中做到这一点:
在关闭body标记之前添加带有以下代码的GoogleAPI,这很难看,但却是异步加载外部库的标准:
<script type="text/javascript">
(function() {
var po = document.createElement('script');
po.type = 'text/javascript'; po.async = true;
po.src = 'https://plus.google.com/js/client:plusone.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(po, s);
})();
</script>
添加签名按钮:
<button class="g-signin"
data-scope="email"
data-clientId="YOUR_CLIENT_ID"
data-callback="onSignInCallback"
data-theme="dark"
data-cookiepolicy="single_host_origin">
</button>
处理签名响应:
function onSignInCallback(){
加载Google+API客户端并处理身份验证响应:
gapi.client.load('plus','v1', function(){
if (authResult['access_token']) {
gapi.client.plus.people.get({'userId':'me'}).execute(
function(resp){
alert(resp.emails[0].value)
});
} else if (authResult['error']) {
// There was an error, which means the user is not signed in.
// As an example, you can handle by writing to the console:
console.log('There was an error: ' + authResult['error']);
}
console.log('authResult', authResult);
});
}
此处提供演示。