Я использую API Google PHP. Документация довольно тускловатна … Я хочу, чтобы пользователи могли подключать свою информацию 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+. Любой, кто знаком с API Google, знает, как я могу его получить?
API UserInfo теперь поддерживается клиентом API API Google.
Вот небольшое примерное приложение: 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';
Удачи.
Обновлен с использованием современных API:
$googlePlus = new Google_Service_Plus($client); $userProfile = $googlePlus->people->get('me'); $emails = $userProfile->getEmails();
Это предполагает следующее:
Простите меня, если я что-то упустил, но откуда вы знаете, к какой учетной записи Google их связывать, если у вас нет своего адреса электронной почты? Обычно вы запрашиваете у пользователя ввод электронной почты своего аккаунта Google, чтобы найти свой профиль в первую очередь.
Используя OAuth2, вы можете запрашивать разрешения через параметр области. ( Документация. ) Я предполагаю, что области, которые вы хотите, https://www.googleapis.com/auth/userinfo.email
и https://www.googleapis.com/auth/userinfo.profile
.
Тогда просто получить информацию о профиле, как только вы получите свой токен доступа. (Я предполагаю, что вы смогли выкупить возвращенный код авторизации для токена доступа?) Просто сделайте запрос на https://www.googleapis.com/oauth2/v1/userinfo?access_token={accessToken}
, который возвращает массив данных профиля JSON, включая электронную почту:
{ "id": "00000000000000", "email": "fred.example@gmail.com", "verified_email": true, "name": "Fred Example", "given_name": "Fred", "family_name": "Example", "picture": "http://img.ruphp.com/php/photo.png", "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>"; }