Неперехваченное исключение InvalidArgumentException: недопустимый токен json при аутентификации в календаре Google

#php #google-api #google-calendar-api #google-api-php-client

Вопрос:

Я студент, и сейчас это заключительный этап моего заключительного проекта. Я работаю с PHP. Документация, с которой я работал, такова: https://developers.google.com/calendar/quickstart/php

Моя проблема в том, что токен возвращает значение NULL.

Ошибка, которую я получаю: PHP Фатальная ошибка: Неперехваченный недопустимый аргумент Исключение: недопустимый токен json в C:wamp64wwwMarryMevendorgoogleapiclientsrcGoogleClient.php:420 Трассировка стека: #0 C:wamp64wwwMarryMeinsertevent.php(26): Google_Client->setAccessToken(NULL) #1 C:wamp64wwwMarryMeinsertevent.php(66): getClient() #2 {основной} брошен C:wamp64wwwMarryMevendorgoogleapiclientsrcGoogleClient.php на линии 420

Вот мой код:

 require_once('./conection/init.php');
require __DIR__ . '/vendor/autoload.php';


/**
 * Returns an authorized API client.
 * @return Google_Client the authorized client object
 */
function getClient()
{
  $client = new Google_Client();
  $client->setApplicationName('MarryMe');
  $client->setScopes(Google_Service_Calendar::CALENDAR_READONLY);
  $client->setAuthConfig('credentials.json');
  $client->setAccessType('offline');
  $client->setPrompt('select_account consent');

  // Load previously authorized token from a file, if it exists.
  // The file token.json stores the user's access and refresh tokens, and is
  // created automatically when the authorization flow completes for the first
  // time.
  $tokenPath = 'token.json';
  if (file_exists($tokenPath)) {
    $accessToken = json_decode(file_get_contents($tokenPath), true);
    $client->setAccessToken($accessToken);
  }

  // If there is no previous token or it's expired.
  if ($client->isAccessTokenExpired()) {
    // Refresh the token if possible, else fetch a new one.
    if ($client->getRefreshToken()) {
      $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
    } else {
      if (!isset($_GET['code'])) {
        // Request authorization from the user.
        $authUrl = $client->createAuthUrl();
        header("location: $authUrl");
      } else {
        $code = $_GET['code'];
        $authCode = trim($code);
        var_dump($authCode);
        // Exchange authorization code for an access token.
        $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
        var_dump($accessToken);
        $client->setAccessToken($accessToken);
        // Check to see if there was an error.
        if (array_key_exists('error', $accessToken)) {
          throw new Exception(join(', ', $accessToken));
        }
      }
    }
    // Save the token to a file.
    if (!file_exists(dirname($tokenPath))) {
      mkdir(dirname($tokenPath), 0700, true);
    }
    file_put_contents($tokenPath, json_encode($client->getAccessToken()));
  }
  return $client;
}



// Get the API client and construct the service object.

$client = getClient();

$service = new Google_Service_Calendar($client);

// Print the next 10 events on the user's calendar.
$calendarId = 'primary';
$optParams = array(
  'maxResults' => 50,
  'orderBy' => 'startTime',
  'singleEvents' => true,
  'timeMin' => date('c'),
);
$results = $service->events->listEvents($calendarId, $optParams);
$events = $results->getItems();


$event = new Google_Service_Calendar_Event(array(
  'summary' =>  $_SESSION['name'],
  'location' => ' ',
  'description' => $_SESSION['description'],
  'start' => array(
    'dateTime' => $_SESSION['start_date'],
    'timeZone' => 'UTC',
  ),
  'end' => array(
    'dateTime' => $_SESSION['due_date'],
    'timeZone' => 'UTC',
  ),

  'reminders' => array(
    'useDefault' => FALSE,
    'overrides' => array(
      array('method' => 'email', 'minutes' => 24 * 60),
      array('method' => 'popup', 'minutes' => 10),
    ),
  ),
));

$calendarId = 'primary';
$event = $service->events->insert($calendarId, $event);

header("location:./includes/tasksProcess/tasks.php");


//end of insert event ```


 

Комментарии:

1. Итак, вы проверили file_get_contents($tokenPath) , возвращает ли значение? Вы проверяли, не сбивается ли код json_decode, и в чем заключалась ошибка (используйте json_last_error_msg (), чтобы узнать)? Включены ли у вас общие отчеты об ошибках, чтобы появлялись какие-либо предупреждения о файлах. Сделайте, пожалуйста, некоторую базовую отладку (потому что мы не можем сделать это за вас).

2. Вы создали новый проект в облачной консоли Google и создали учетные данные для этого проекта. Вы должны были загрузить clientsecrete. файл json какой тип учетных данных вы создали? Учебник, которому вы следуете, предназначен для установленного приложения, в которое вы, по-видимому, внесли много изменений, которые сделали бы его более похожим на веб-приложение. Что ты пытаешься здесь сделать?

3. это действительно для веб-приложения, и в учетных данных есть секрет клиента

4. Это не то, о чем я спрашивал, создали ли вы клиент настольных приложений на облачной консоли Google в соответствии с инструкциями, приведенными в примере, который вы используете, или клиент веб-приложений, который понадобится вашему коду, если это веб-приложение? youtu.be/eiiktPs5z50 После двойной проверки того, что вы создали веб-клиент. Я бы также дважды проверил, действительно ли приложение может найти учетные данные.json

Ответ №1:

Убедитесь, что __DIR__ . это до того, как будут созданы ваши учетные данные, чтобы функция знала, где искать файл json:

так что это должно выглядеть так

$client->setAuthConfig( __DIR__ . 'credentials.json');