Неустранимая ошибка PHP: неверный JSON - ошибка OAuth учетной записи службы API Google Sheets - плагин Wordpress - PullRequest
0 голосов
/ 07 ноября 2019

Подробности среды

  • ОС: MacOS 10.14.6
  • Версия PHP: 7.2
  • Имя и версия пакета: google/apiclient": "^2.0

Действия по воспроизведению

  1. Я создал пользовательскую конечную точку с Wordpress для обработки отправки данных форм, которые будут записаны в Google Sheet. Я проверяю схему JSON через justinrainbow/json-schema, а затем запускаю клиент Google.

  2. Я импортирую секреты клиента для служебной учетной записи через массив PHP из WPDB и передаю ихGoogle_Client. Сейчас я просто жестко кодирую значения, чтобы убедиться, что они работают.

  3. Этот код обернут в функцию. Если у меня стандартный 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-&gt;parseTokenResponse(Object(GuzzleHttp\Psr7\Response))
#1
/wordpress/wp-content/plugins/cbnmovies-google-sheets/vendor/google/auth/src/Credentials/ServiceAccountCredentials.php(123):
Google\Auth\OAuth2-&gt;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-&gt;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-&gt;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 .

...