使用Google+ API for PHP - 需要向用户发送电子邮件

时间:2012-01-02 23:13:26

标签: php google-api

我正在使用Google PHP API。文档相当平淡...我希望允许用户连接他们的Google+信息,并使用它来在我的数据库中签署用户。为此,我需要获取他们用于Google帐户的电子邮件。我似乎无法弄清楚如何。当用户连接到我的应用程序时,通过强制许可在Facebook上很容易。任何人都有任何想法?这是我用来抓取用户google +个人资料的代码,它工作正常,除非用户可能没有列出他们的电子邮件。

include_once("$DOCUMENT_ROOT/../qwiku_src/php/google/initialize.php");

$plus = new apiPlusService($client);
if (isset($_GET['code'])) {
  $client->authenticate();
  $_SESSION['token'] = $client->getAccessToken();
  header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
}

if (isset($_SESSION['token'])) {
  $client->setAccessToken($_SESSION['token']);
}

if ($client->getAccessToken()) {
    $me = $plus->people->get('me');
    print "Your Profile: <pre>" . print_r($me, true) . "</pre>";
    // The access token may have been updated lazily.
    $_SESSION['token'] = $client->getAccessToken();
} else {
    $authUrl = $client->createAuthUrl();
    print "<a class='login' href='$authUrl'>Connect Me!</a>";
}

如果没有用户的电子邮件地址,就会失去允许用户注册Google+的目的。任何更熟悉Google API的人都知道如何获得它?

3 个答案:

答案 0 :(得分:10)

Google API PHP客户端现在支持UserInfo API。

这是一个小样本应用程序: http://code.google.com/p/google-api-php-client/source/browse/trunk/examples/userinfo/index.php

样本的重要部分在这里:

  $client = new apiClient();
  $client->setApplicationName(APP_NAME);
  $client->setClientId(CLIENT_ID);
  $client->setClientSecret(CLIENT_SECRET);
  $client->setRedirectUri(REDIRECT_URI);
  $client->setDeveloperKey(DEVELOPER_KEY);
  $client->setScopes(array('https://www.googleapis.com/auth/userinfo.email',
        'https://www.googleapis.com/auth/plus.me'));      // Important!

  $oauth2 = new apiOauth2Service($client);

  // Authenticate the user, $_GET['code'] is used internally:
  $client->authenticate();

  // Will get id (number), email (string) and verified_email (boolean):
  $user = $oauth2->userinfo->get();
  $email = filter_var($user['email'], FILTER_SANITIZE_EMAIL);
  print $email;

我假设使用包含授权代码的GET请求调用了此代码段。请记住包含或要求apiOauth2Service.php才能使其正常工作。在我的情况下是这样的:

  require_once 'google-api-php-client/apiClient.php';
  require_once 'google-api-php-client/contrib/apiOauth2Service.php';
祝你好运。

答案 1 :(得分:7)

使用今天的API更新:

$googlePlus = new Google_Service_Plus($client);
$userProfile = $googlePlus->people->get('me');
$emails = $userProfile->getEmails();

这假设如下:

  1. 您已使用适当的范围对当前用户进行了身份验证。
  2. 您已使用client_id和client_secret设置$ client。

答案 2 :(得分:2)

如果我遗漏了某些内容,请原谅我,但如果您没有他们的电子邮件地址,您如何知道要将他们与哪个Google帐户相关联?通常,您会提示用户输入其Google帐户的电子邮件,以便首先找到他们的个人资料。

使用OAuth2,您可以通过scope参数请求权限。 (Documentation.)我想你想要的范围是https://www.googleapis.com/auth/userinfo.emailhttps://www.googleapis.com/auth/userinfo.profile

然后,一旦获得访问令牌,get the profile info就会很简单。 (我假设您已经能够为返回的授权代码兑换访问令牌?)只需向https://www.googleapis.com/oauth2/v1/userinfo?access_token={accessToken}发送一个get请求,该请求返回一个包含电子邮件的JSON数据库数据:

{
 "id": "00000000000000",
 "email": "fred.example@gmail.com",
 "verified_email": true,
 "name": "Fred Example",
 "given_name": "Fred",
 "family_name": "Example",
 "picture": "https://lh5.googleusercontent.com/-2Sv-4bBMLLA/AAAAAAAAAAI/AAAAAAAAABo/bEG4kI2mG0I/photo.jpg",
 "gender": "male",
 "locale": "en-US"
}

在PHP库中必须有一个方法来发出请求,但我找不到它。没有保证,但试试这个:

$url = "https://www.googleapis.com/oauth2/v1/userinfo";
$request = apiClient::$io->makeRequest($client->sign(new apiHttpRequest($url, 'GET')));

if ((int)$request->getResponseHttpCode() == 200) {
        $response = $request->getResponseBody();
        $decodedResponse = json_decode($response, true);
        //process user info
      } else {
        $response = $request->getResponseBody();
        $decodedResponse = json_decode($response, true);
        if ($decodedResponse != $response && $decodedResponse != null && $decodedResponse['error']) {
          $response = $decodedResponse['error'];
        }
      }
 }

无论如何,在您发布的代码中,只需将所需范围传递给createAuthUrl()

else {
    $authUrl = $client->createAuthUrl("https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile");
    print "<a class='login' href='$authUrl'>Connect Me!</a>";
}