如何在Zend Framework1中使用Google+ API获取用户的电子邮件地址?

时间:2014-04-17 07:18:09

标签: zend-framework google-api google-plus google-oauth google-authentication

我已在我的示例中集成了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和其他数据吗?

2 个答案:

答案 0 :(得分:2)

您没有显示您要求的范围,但您可能不会要求 https://www.googleapis.com/auth/userinfo.email 范围。

但是,已弃用userinfo范围和端点,并将于2014年9月删除

接下来,您应该将电子邮件范围与其中一个配置文件范围(例如配置文件 https://www.googleapis.com/auth/plus.me 一起使用,或 https://www.googleapis.com/auth/plus.login )访问用户的电子邮件,然后使用其中一个Google+ API端点,例如people.get,用户ID为"我"

答案 1 :(得分:0)

@prison是现货,如果您请求email范围,您将能够在plus.people.get API调用中获取用户的电子邮件地址。我将在JavaScript中向您展示如何执行此操作:

在关闭正文标记之前使用以下代码添加Google API,这很丑陋,但却是异步加载外部库的标准:

<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);
  });
}

Demo is available here.