Подробности среды
- ОС: MacOS 10.14.6
- Версия PHP: 7.2
- Имя и версия пакета:
google/apiclient": "^2.0
Действия по воспроизведению
Я создал пользовательскую конечную точку с Wordpress для обработки отправки данных форм, которые будут записаны в Google Sheet. Я проверяю схему JSON через justinrainbow/json-schema
, а затем запускаю клиент Google.
Я импортирую секреты клиента для служебной учетной записи через массив PHP из WPDB
и передаю ихGoogle_Client
. Сейчас я просто жестко кодирую значения, чтобы убедиться, что они работают.
Этот код обернут в функцию. Если у меня стандартный php-проект без фреймворка, с автозагрузкой Google, скрипт работает нормально, существующий Sheet читается, затем в следующую доступную строку добавляются новые строки.
Однако, когда я включаю функцию, вызываемую из зарегистрированной конечной точки в API wp-json
, из класса пространства имен он выдает ошибку:
<br />
<b>Fatal error</b>: Uncaught Exception: Invalid JSON response in
/wordpress/wp-content/plugins/cbnmovies-google-sheets/vendor/google/auth/src/OAuth2.php:553
Stack trace:
#0 /wordpress/wp-content/plugins/cbnmovies-google-sheets/vendor/google/auth/src/OAuth2.php(503):
Google\Auth\OAuth2->parseTokenResponse(Object(GuzzleHttp\Psr7\Response))
#1
/wordpress/wp-content/plugins/cbnmovies-google-sheets/vendor/google/auth/src/Credentials/ServiceAccountCredentials.php(123):
Google\Auth\OAuth2->fetchAuthToken(Object(Google\Auth\HttpHandler\Guzzle6HttpHandler))
#2 /wordpress/wp-content/plugins/cbnmovies-google-sheets/vendor/google/auth/src/FetchAuthTokenCache.php(84):
Google\Auth\Credentials\ServiceAccountCredentials->fetchAuthToken(Object(Google\Auth\HttpHandler\Guzzle6HttpHandler))
#3 /wordpress/wp-content/plugins/cbnmovies-google-sheets/vendor/google/auth/src/Middleware/AuthTokenMiddleware.php(115):
Google\Auth\FetchAuthTokenCache->fetchAuthToken(Object(Google\Auth\HttpHandler\Guzzle6HttpHandler))
#4 /wordpress/wp-content/plugins/cbnmovie in
<b>/wordpress/wp-content/plugins/cbnmovies-google-sheets/vendor/google/auth/src/OAuth2.php</b> on line <b>553</b><br />
Пример кода
ИНФОРМАЦИЯ О NAMESPACE (с использованием автозагрузки), если вам интересно
<?php
/**
* @package CBNMovies-Google-Sheets
*/
namespace Inc\API;
use Inc\Base\BaseController;
use Inc\API\SheetsApiController;
use JsonSchema\Validator;
use JsonSchema\Constraints\Constraint;
use Google_Client;
use Google_Service_Sheets;
use Google_Service_Sheets_ValueRange;
НАСТРОЙКА GOOGLE_CLIENT
$config = array(
"type" => "service_account",
"project_id" => "some_proj_id",
"private_key_id" => "b4a*********",
"private_key" => "-----BEGIN PRIVATE KEY-----**********",
"client_email" => "some_proj_id@something.iam.gserviceaccount.com",
"client_id" => "1181*********",
"auth_uri" => "https://accounts.google.com/o/oauth2/auth",
"token_uri" => "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url" => "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url" => "https://www.googleapis.com/robot/v1/metadata/x509/something.iam.gserviceaccount.com"
);
$client = new Google_Client();
$client->setAuthConfig( $config );
$client->setApplicationName('cbn-movie-sites');
$client->setScopes([Google_Service_Sheets::SPREADSHEETS]);
ПОЛУЧЕНИЕ И ОБНОВЛЕНИЕ СУЩЕСТВУЮЩЕГО ЛИСТА
$spreadsheetId = "1gNM********";
$sheets_service = new Google_Service_Sheets( $client );
$first_row = 2;
$range = "A$first_row:I";
$rows = $sheets_service->spreadsheets_values->get( $spreadsheetId, $range, ['majorDimension' => 'ROWS'] );
$row = isset($rows['values']) ? count($rows['values']) + 1 : $first_row;
$range = "A$row:I$row";
$values = [
[
$data['First_Name'],
$data['Last_Name'],
$data['Ministry_Name'],
$data['Address'],
$data['City'],
$data['State'],
$data['Zip'],
$data['Email'],
$data['Phone'],
date('c')
]
];
$requestBody = new Google_Service_Sheets_ValueRange([
'range' => $updateRange,
'majorDimension' => 'ROWS',
'values' => $values,
]);
$result = $sheets_service->spreadsheets->update(
$spreadsheetId,
$range,
$requestBody,
['valueInputOption' => 'USER_ENTERED']
);
Я также открыл проблему на github .