Обновление листа Google с использованием ключа сервисной учетной записи и php

чтобы обновить лист Google с помощью php API, я создал ключ учетной записи сервера, используя https://console.developers.google.com/apis и сохранил этот файл в корневой папке, куда я загрузил структуру apiclient с помощью composer. И поделитесь листом с электронной почтой клиента, указанной в служебной учетной записи, и дайте ему полный доступ. Ниже приведен код m, используемый для обновления:

<?php

require 'vendor/autoload.php';

$service_account_file = 'credentials.json';

$spreadsheet_id = '13zWB1_uY5CdPGLuSXRWAgD0lE7QVrbTDW_9V5lqdNAY';


$spreadsheet_range = 'Sheet1';

putenv('GOOGLE_APPLICATION_CREDENTIALS=' . $service_account_file);
$client = new Google_Client();
$client->useApplicationDefaultCredentials();
$client->addScope(Google_Service_Sheets::SPREADSHEETS);
$service = new Google_Service_Sheets($client);

$options = array('valueInputOption' => 'RAW');
$values = [
["Name", "Roll No", "Contact"],
["AAA", "001", "12345"],
["BBB", "002", "6789"]
];
$body   = new Google_Service_Sheets_ValueRange(['values' => $values]);

$result = $service->spreadsheets_values->update($spreadsheet_id, $spreadsheet_range, $body, $options);
?>

Проблема в том, что он отлично работает на моем локальном хосте. но когда я загрузил папку на 000webhost и запустил ее оттуда, она выдает следующую ошибку:

Обнаружено исключение: не удалось загрузить учетные данные по умолчанию. Перейдите к https://developers.google.com/accounts/docs/application-default-credentials для получения дополнительной информации

Нужно ли мне использовать gcloud. насколько мне известно, мне не нужен gcloud для использования Google API. И если мне нужно использовать gcloud, чтобы этот код работал с моего веб-сайта 000webhost (https://www.000webhost.com).


person Sann    schedule 08.12.2018    source источник


Ответы (1)


Вы используете относительный путь для файла учетных данных. Вам нужно использовать полный путь. Строка в вашем коде:

$service_account_file = 'credentials.json';

Следует изменить на:

$service_account_file = '/mysecrets/credentials.json';

Измените каталог mysecrets на что угодно. Если это веб-сервер, не находите файл в каталоге html сервера.

Вы также можете указать файл вручную:

$client->setAuthConfig($service_account_file);

И удалите эти строки:

putenv('GOOGLE_APPLICATION_CREDENTIALS=' . $service_account_file); 
$client->useApplicationDefaultCredentials();
person John Hanley    schedule 08.12.2018
comment
Я тоже пробовал это (получил эту рекомендацию от Google), но это тоже не работает. - person Sann; 08.12.2018
comment
1) Используйте полный путь. 2) Если это не работает, то либо ваш файл поврежден, либо он не находится там, где указывает переменная среды, или неправильные права доступа к файлу. Примечание: gcloud не требуется и не поможет вам с этой проблемой. - person John Hanley; 08.12.2018
comment
Я изменил свой ответ, чтобы вы могли указать учетные данные вручную. - person John Hanley; 08.12.2018
comment
Правильно, putenv для useApplicationDefaultCredentials() - person John Hanley; 08.12.2018
comment
вау, это сработало :) большое спасибо, я узнал, что putenv() недоступен для бесплатных пользователей 000webhost. В любом случае это будет хорошая альтернатива. Принимаю ответ) - person Sann; 08.12.2018
comment
Интересная проблема. Я не знал, что некоторые веб-хосты блокируют переменные среды. - person John Hanley; 08.12.2018
comment
У меня возникли проблемы с поиском, где это задокументировано в документации Google. Не могли бы вы дать мне ссылку? - person Matthew Goheen; 27.03.2020
comment
@MatthewGoheen cloud.google.com/docs/authentication/production - person John Hanley; 27.03.2020