6 votes

Erreur 'Access token is invalid' dans la bibliothèque de feuilles de calcul php

J'ai besoin de télécharger une feuille de calcul via Google Drive dans cakephp. google-api-php-client pour générer un jeton d'accès et php-google-spreadsheet-client pour accéder aux feuilles. Le code est le suivant :

function test() {
    require_once '../vendors/google-api-php-client-2.1.1/vendor/autoload.php';
    $client = new \Google_Client();
    $client->setApplicationName("spreadsheet");
    $client->setDeveloperKey("//My developerkey");
    $client = new Google_Client();
    $client->setAuthConfig('client_id.json');
    if( !isset($_GET['code']) ) {

        $client->addScope(Google_Service_Drive::DRIVE);
        $client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/test' );
        $auth_url = $client->createAuthUrl();
        header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
    } else {

        $client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/test' );
        $auth_url = $client->createAuthUrl();
        $token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
        $client->setAccessToken($token);

        $serviceRequest = new Google\Spreadsheet\DefaultServiceRequest($token['access_token']);
        Google\Spreadsheet\ServiceRequestFactory::setInstance($serviceRequest);
        $spreadsheetService = new Google\Spreadsheet\SpreadsheetService();
        $spreadsheetFeed = $spreadsheetService->getSpreadsheetFeed();
        $spreadsheet = $spreadsheetFeed->getByTitle('Test');
    }

Mais j'obtiens l'erreur que le jeton d'accès est invalide comme montré dans l'image suivante :

enter image description here

Qu'est-ce que je fais de mal ?

1voto

Amitesh Kumar Points 2132

Bonjour, ceci pourrait vous aider, tout d'abord, veuillez créer votre compte de développeur sur Google et générer un jeton d'accès, un identifiant client, etc. Ensuite, suivez ces étapes.

Conditions préalables

Pour exécuter ce quickstart, vous aurez besoin de :

PHP 5.4 ou supérieur avec l'interface de ligne de commande (CLI) et l'extension JSON installées. L'outil de gestion des dépendances Composer. Accès à Internet et à un navigateur Web. Un compte Google.

Étape 1 : activer l'API Google Sheets

Utilisez cet assistant pour créer ou sélectionner un projet dans la console des développeurs Google et activer automatiquement l'API. Cliquez sur Continuer, puis sur Aller aux informations d'identification. Sur la page Ajouter des informations d'identification à votre projet, cliquez sur le bouton Annuler. En haut de la page, sélectionnez l'onglet de l'écran de consentement OAuth. Sélectionnez une adresse électronique, saisissez un nom de produit s'il n'est pas déjà défini, puis cliquez sur le bouton Enregistrer. Sélectionnez l'onglet Informations d'identification, cliquez sur le bouton Créer des informations d'identification et sélectionnez ID client OAuth. Sélectionnez le type d'application Autre, entrez le nom "Google Sheets API Quickstart", puis cliquez sur le bouton Créer. Cliquez sur OK pour fermer la boîte de dialogue qui s'affiche. Cliquez sur le bouton file_download (Télécharger JSON) à droite de l'ID client. Déplacez ce fichier dans votre répertoire de travail et renommez-le client_secret.json.

Étape 2 : Installer la bibliothèque du client Google

Exécutez la commande suivante pour installer la bibliothèque à l'aide de composer :

php composer.phar require google/apiclient:^2.0

Consultez la page d'installation de la bibliothèque pour connaître les autres options d'installation. Étape 3 : Mise en place de l'échantillon

Créez un fichier nommé quickstart.php dans votre répertoire de travail et copiez-y le code suivant :

<?php
require_once __DIR__ . '/vendor/autoload.php';

define('APPLICATION_NAME', 'Google Sheets API PHP Quickstart');
define('CREDENTIALS_PATH', '~/.credentials/sheets.googleapis.com-php-quickstart.json');
define('CLIENT_SECRET_PATH', __DIR__ . '/client_secret.json');
// If modifying these scopes, delete your previously saved credentials
// at ~/.credentials/sheets.googleapis.com-php-quickstart.json
define('SCOPES', implode(' ', array(
  Google_Service_Sheets::SPREADSHEETS_READONLY)
));

if (php_sapi_name() != 'cli') {
  throw new Exception('This application must be run on the command line.');
}

/**
 * Returns an authorized API client.
 * @return Google_Client the authorized client object
 */
function getClient() {
  $client = new Google_Client();
  $client->setApplicationName(APPLICATION_NAME);
  $client->setScopes(SCOPES);
  $client->setAuthConfig(CLIENT_SECRET_PATH);
  $client->setAccessType('offline');

  // Load previously authorized credentials from a file.
  $credentialsPath = expandHomeDirectory(CREDENTIALS_PATH);
  if (file_exists($credentialsPath)) {
    $accessToken = json_decode(file_get_contents($credentialsPath), true);
  } else {
    // Request authorization from the user.
    $authUrl = $client->createAuthUrl();
    printf("Open the following link in your browser:\n%s\n", $authUrl);
    print 'Enter verification code: ';
    $authCode = trim(fgets(STDIN));

    // Exchange authorization code for an access token.
    $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);

    // Store the credentials to disk.
    if(!file_exists(dirname($credentialsPath))) {
      mkdir(dirname($credentialsPath), 0700, true);
    }
    file_put_contents($credentialsPath, json_encode($accessToken));
    printf("Credentials saved to %s\n", $credentialsPath);
  }
  $client->setAccessToken($accessToken);

  // Refresh the token if it's expired.
  if ($client->isAccessTokenExpired()) {
    $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
    file_put_contents($credentialsPath, json_encode($client->getAccessToken()));
  }
  return $client;
}

/**
 * Expands the home directory alias '~' to the full path.
 * @param string $path the path to expand.
 * @return string the expanded path.
 */
function expandHomeDirectory($path) {
  $homeDirectory = getenv('HOME');
  if (empty($homeDirectory)) {
    $homeDirectory = getenv('HOMEDRIVE') . getenv('HOMEPATH');
  }
  return str_replace('~', realpath($homeDirectory), $path);
}

// Get the API client and construct the service object.
$client = getClient();
$service = new Google_Service_Sheets($client);

// Prints the names and majors of students in a sample spreadsheet:
// https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
$spreadsheetId = '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms';
$range = 'Class Data!A2:E';
$response = $service->spreadsheets_values->get($spreadsheetId, $range);
$values = $response->getValues();

if (count($values) == 0) {
  print "No data found.\n";
} else {
  print "Name, Major:\n";
  foreach ($values as $row) {
    // Print columns A and E, which correspond to indices 0 and 4.
    printf("%s, %s\n", $row[0], $row[4]);
  }
}

Étape 4 : Exécuter l'échantillon

Exécutez l'échantillon en utilisant la commande suivante :

php quickstart.php

La première fois que vous exécutez l'échantillon, il vous demandera d'autoriser l'accès :

Browse to the provided URL in your web browser.

If you are not already logged into your Google account, you will be prompted to log in. If you are logged into multiple Google accounts, you will be asked to select one account to use for the authorization.
Click the Accept button.
Copy the code you're given, paste it into the command-line prompt, and press Enter.

En savoir plus sur google sheets

0voto

M A SIDDIQUI Points 1155

Après avoir rencontré de nombreux problèmes avec le tableur Google, j'ai finalement réussi à le faire. Dans votre console de développement, créez un compte web_service et téléchargez ses informations d'identification au format .json qui ressemble à ceci

{
      "type": "service_account",
      "project_id": "rank********er",
      "private_key_id": "*****************************",
      "private_key": "-----BEGIN PRIVATE KEY-----\nkey here\n",
      "client_email": "rank***@appspot.gserviceaccount.com",
      "client_id": "1066978********************",
      "auth_uri": "https://accounts.google.com/o/oauth2/auth",
      "token_uri": "https://accounts.google.com/o/oauth2/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/ra*******r%40appspot.gserviceaccount.com"
    }

Puis dans votre classe / fichier où vous voulez utiliser google spreadsheet utiliser ce code. Avant d'utiliser la feuille de calcul, vous devez partager cette feuille avec l'adresse e-mail du client indiquée dans le fichier json.

<?php
include dirname(__DIR__) . "/vendor/autoload.php";

use Google\Spreadsheet\DefaultServiceRequest;
use Google\Spreadsheet\ServiceRequestFactory;

$credential = dirname(__FILE__) . "/client_secret.json";
putenv('GOOGLE_APPLICATION_CREDENTIALS=' . $credential);
$client = new \Google_Client;
$client->useApplicationDefaultCredentials();

$client->setApplicationName("Some App");
$client->setScopes([
    'https://www.googleapis.com/auth/drive',
    'https://spreadsheets.google.com/feeds'
    ]);

if ($client->isAccessTokenExpired()) {
    $client->refreshTokenWithAssertion();
}
$accessToken = $client->fetchAccessTokenWithAssertion()["access_token"];

$serviceRequest = new DefaultServiceRequest($accessToken);
ServiceRequestFactory::setInstance($serviceRequest);

$spreadsheetService = new Google\Spreadsheet\SpreadsheetService();
$spreadsheetFeed = $spreadsheetService->getSpreadsheetFeed();
$spreadsheet = $spreadsheetFeed->getByTitle('Spreadsheet Name');
$worksheet = $spreadsheet->getWorksheetFeed()->getEntries()[0];

$listFeed = $worksheet->getListFeed();
$cellFeed = $worksheet->getCellFeed();
$entries = $listFeed->getEntries();

foreach ($listFeed->getEntries() as $entry) {
    $proxy = $entry->getValues();
    $proxy['status'] = $status_message;
    $entry->update($proxy);
}

Changez le titre / nom de l'application selon vos besoins. Vous pouvez installer les bibliothèques ci-dessous via composer pour utiliser les lignes de code ci-dessus.

"google/apiclient":"^2.0",
"asimlqt/php-google-spreadsheet-client": "3.0.*",

Pour une utilisation de référence : https://github.com/asimlqt/php-google-spreadsheet-client

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X