Cómo acceder a Google Drive usando PHP

El escenario que voy a analizar es este: Una aplicación desarrollada en PHP requiere acceder a archivos que sus usuarios tienen almacenados en sus propios documentos en Google Drive.

Configuración de la API De Google

1. Crear un proyecto en Google (yendo a https://console.developers.google.com/apis/credentials):

  1. Habilitar el acceso a la API via OAuth (https://console.developers.google.com/apis/api/drive/overview?project=MI_PROYECTO):
  1. Crear las credenciales de acceso vía OAuth:

Seleccionar OAuth:

  1. Descargar las credenciales a un lugar seguro:
  1. Autorizar la URI de redireccionamiento

Uso de la API de Google desde PHP

Con esto hecho ya tenés lo básico para empezar a programar.

Si bien podés hacer todo en un solo archivo, no es muy recomendable, es mejor tener un archivo para cada paso del trabajo.

Ante todo, vas a necesitar la librería google/apiclient (Te recomiendo incorporarla con composer), acá podés ver un ejemplo de composer.json:

{
 "name": "leeway/google-drive",
 "require": {
 "google/apiclient": "^2.1"
 },
 "authors": [
 {
 "name": "Mauro Chojrin",
 "email": "mauro.chojrin@leewayweb.com"
 }
 ]
}

No olvides después correr el comando

composer install

Este codigo (config.php) va a ser común a todos los archivos .php que vendrán luego:

<?php
require_once 'vendor/autoload.php';
session_start();
$redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/paso2.php';
$client = new Google_Client();
$client->setAuthConfig('<PATH_AL_ARCHIVO_JSON_DE_CREDENCIALES>');
$client->setRedirectUri($redirect_uri);
$client->addScope("https://www.googleapis.com/auth/drive");

El primer paso:

Ofrecer al usuario un formulario para conectarse a su Drive (paso1.php):

<?php require_once 'config.php' ?>
<div class="request">
 <a class='login' href='<?php echo $client->createAuthUrl() ?>'>Conectame!</a>
</div>

Contar con una URL a la que Google informe que la autenticación fue exitosa (paso2.php):

<?php 
require_once 'config.php';

if (isset($_GET['code'])) {
 $token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
 $client->setAccessToken($token);

 $_SESSION['upload_token'] = $token;

 header('Location: paso3.php');
}

Muy importante: este archivo (paso2.php) debe ser accesible para el cliente (Para eso es importante que su URL completa esté ingresada en la configuración de URI de redireccionamiento, sin eso nada de esto funcionará.

Paso 3 (Completar la autenticación):

<?php

require_once 'config.php';

if (!empty($_SESSION['upload_token'])) {
 $client->setAccessToken($_SESSION['upload_token']);
 if ($client->isAccessTokenExpired()) {
  unset($_SESSION['upload_token']);
  echo 'La sesion expiro. <a href="paso1.php">Volver a comenzar</a>';
  die;
 }
}
echo 'Autenticacion completa <a href="paso4.php">Descargar archivo</a>';

Paso 4:

Hacer lo que uno quiera en el drive autorizado :).

Ejemplo: descargar un archivo desde Google Drive usando PHP

<?php
require_once 'config.php';

echo '<p>Descargando el archivo "Mi archivo"</p>';
$service = new Google_Service_Drive($client);
$files = $service->files->listFiles([
 'q' => "name='Mi archivo'",
 'fields' => 'files(id,size)'
 ]);

if ( count($files) < 1 ) {
 echo 'No se encontro el archivo :(';
 die;
}
$fileId = $files[0]->id;
$fileSize = intval($files[0]->size);

$http = $client->authorize();

$fp = fopen('Mi archivo', 'w');

$chunkSizeBytes = 1 * 1024 * 1024;
$chunkStart = 0;

while ($chunkStart < $fileSize) {
 $chunkEnd = $chunkStart + $chunkSizeBytes;

 $response = $http->request(
  'GET',
  sprintf('/drive/v3/files/%s', $fileId),
  [
   'query' => ['alt' => 'media'],
   'headers' => [
       'Range' => sprintf('bytes=%s-%s', $chunkStart, $chunkEnd)
   ]
  ]
  );
  $chunkStart = $chunkEnd + 1;
  fwrite($fp, $response->getBody()->getContents());
 }
 fclose($fp);
echo '<p>Listo! Archivo disponible en: "'.realpath('Mi archivo').'"</p>';

Y listo, tenemos el archivo buscado descargado a nuestro disco.

Para probar esta aplicación (suponiendo que fuiste guardando cada porción de código en su propio archivo), iniciá el servidor de php:

php -S localhost:8080

y abrí en tu navegador:

http://localhost:8080/paso1.php

Claramente, no se trata de magia, lo que hay detrás de esto es un WebService, al que se está accediendo usando la clase Google_Service_Drive. Podes ver más información entrando a https://github.com/google/google-api-php-client.

Y ahora que sabés cómo manipular archivos que están en el drive… ¡cuidado con lo que hacés!

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes

57 comentarios

  1. gracias por la explicación, solo tengo una consulta como podria buscar un archivo no por nombre exacto sino por coincidencia me traiga n cantidad de archivos y eliga cual descargar

  2. Hola, muchas gracias por este aporte, me pareció muy apropiada la forma en la que segmentaste las cosas, y me dio una mejor comprensión de cada paso.
    Aprovechando su publicación, me gustaría saber si tiene algún ejemplo de cómo eliminar un archivo en google drive con el API, he visto algunos ejemplos, pero soy novato en programación, y por más que he intentado cosas no lo logro.
    Gracias de antemano

      1. Buenos días mchojrin,

        la idea es subir archivos desde PHP a Google Drive. Toda la conexión la hace bien, la sube a una carpeta específica y sino existe la crea, etc.

        El caso es que en el archivo token.json hay una variable «expires_in»:3599, es decir, el token caduca a la hora de haberse generado.

        Lo que quiero es que el token no expire, ya que tendría que estar siempre generando uno nuevo y en la API dice que poniendo la siguiente línea, se soluciona, pero no logro que lo haga: $client->setAccessType(‘offline’);.

        Pongo el código que estoy agregando (Está sacado de la API de Goolge Drive).

        <?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('Google Drive API PHP Quickstart');
        $client->setRedirectUri('http://localhost/proyectoDrive/index.php');

        $client->setScopes(Google_Service_Drive::DRIVE);
        $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)) {
        $client->setApprovalPrompt("force");
        $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 {
        // 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);
        $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();

        Muchas gracias de antemano

        1. Creo que no termino de ver el problema. Si el token está expirado, la renovación debería ser transparente para tí, salvo que se haya eliminado el archivo de autorización original, en cuyo caso sí te requeriría que te autentiques nuevamente.

          ¿Es eso lo que te está sucediendo?

  3. Hola, estoy obteniendo un error forbidden al recibir el redireccionamiento de parte de Google, chequeando y descartando, el error ocurre porque google envía parámetro como «www.google.com» al eliminar los puntos el error se va, el tema es que así lo envía google ¿hay una forma de resolver esto por nuestra parte? Gracias de antemano

    1. Hola Johan,

      Si puedes publicar algo de código será más fácil responderte.

      A priori te diría que si quitando los puntos funciona, ¿Por qué no los eliminas del string que recibes?

  4. Hola estoy tratando de realizar tu código para listar los archivos de drive con la autentificación auth2 eh llevado acabo todos los pasos y eh investigado pero no logro dar en por que mi siguiente error, agradecería mucho si me pudieras ayudar

    Fatal error: Uncaught Google_Service_Exception: { «error»: { «errors»: [ { «domain»: «usageLimits», «reason»: «dailyLimitExceededUnreg», «message»: «Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.», «extendedHelp»: «https://code.google.com/apis/console» } ], «code»: 403, «message»: «Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.» } } in C:\xampp\htdocs\SubirArchivosDrive\google-api-php-client\src\Google\Http\REST.php:118 Stack trace: #0 C:\xampp\htdocs\SubirArchivosDrive\google-api-php-client\src\Google\Http\REST.php(94): Google_Http_REST::decodeHttpResponse(Object(GuzzleHttp\Psr7\Response), Object(GuzzleHttp\Psr7\Request), ‘Google_Service_…’) #1 C:\xampp\htdocs\SubirArchivosDrive\google-api-php-client\src\Google\Task\Runner.php(176): Google_Http_REST::doExecute(Object(GuzzleHttp\Client), Object(GuzzleHttp\Psr7\Request), ‘Google_Service_…’) #2 C:\xampp\htdocs\SubirArchivosDrive\google-api-php-client\src\Google\Http\REST.php(58) in C:\xampp\htdocs\SubirArchivosDrive\google-api-php-client\src\Google\Http\REST.php on line 118

    1. Hola Sara:

      Gracias por tu pregunta 🙂

      Por lo que veo en tu error parece que te excediste de la cantidad de peticiones permitidas por la API.

      Deberías consultar en la documentación oficial a ver cuál es ese límite y, en todo caso, volver a intentar pasado un día.

      Otra cosa que se me ocurre que puede estar fallando es la autenticación… ¿puede ser que no estés enviando las credenciales correctas?

      Saludos!

  5. Amigos, quiero saber si puedo hacer una pagina en PHP utilizando laravel y luego guardar información atraves de un formulario y luego rescatarla.

    1. Hola Benjamín!

      No estoy seguro de comprender bien tu pregunta. Lo que quieres lograr es perfectamente posible usando Laravel.

      Los detalles específicos dependen de una serie de otras cuestiones como ser qué tipo de base de datos utilizarás, dónde alojarás tu sitio, etc…

      Exitos!

  6. Buen día,
    Tengo un problema con un aplicativo que vengo desarrollando hace meses, lo que pasa es que quiero subir a una carpeta en drive, un archivo de excel que tengo alojado en el servidor de la aplicación, pero para loguearse en la misma aplicación se utiliza un OAuth de Google y se genera un access_token con permisos únicamente para la información de la cuenta, y tengo entendido que los permisos (o scope, o alcance) deben ser «/drive», para poder hacer cambios en Drive, he estado viendo toturiales y blogs y no he encontrado ninguna solución,
    Gracias.

  7. Mauro, sigo avanzando poco a poco.
    Llego bien hasta el paso3.php (Autenticación completa: Descargar archivo) – en el paso4.php puse un nombre archivo que tengo en drive (‘q’ => «name=’Julieta.pdf'») y me sale el siguiente error:

    Fatal error: Uncaught Google_Service_Exception: { «error»: { «errors»: [ { «domain»: «usageLimits», «reason»: «dailyLimitExceededUnreg», «message»: «Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.», «extendedHelp»: «https://code.google.com/apis/console» } ], «code»: 403, «message»: «Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.» } } in C:\wamp64\www\vendor\google\apiclient\src\Google\Http\REST.php:118 Stack trace: #0 C:\wamp64\www\vendor\google\apiclient\src\Google\Http\REST.php(94): Google_Http_REST::decodeHttpResponse(Object(GuzzleHttp\Psr7\Response), Object(GuzzleHttp\Psr7\Request), ‘Google_Service_…’) #1 C:\wamp64\www\vendor\google\apiclient\src\Google\Task\Runner.php(181): Google_Http_REST::doExecute(Object(GuzzleHttp\Client), Object(GuzzleHttp\Psr7\Request), ‘Google_Service_…’) #2 C:\wamp64\www\vendor\google\apiclient\src\Google\Http\REST.php(58): Google_Task_Runner->run() #3 C:\wamp64\www\vendor\google\apiclient\src\Goo in C:\wamp64\www\vendor\google\apiclient\src\Google\Http\REST.php on line 118

    1. Vaya… no me había cruzado antes con ese error… Por lo que he podido leer puede deberse a dos cosas:

      1. Uso de un token vencido (Fijate la documentación sobre métodos de refresco de token)
      2. Efectivamente estás haciendo demasiados requests en poco tiempo (Para verificar esto simplemente volvé a probar tu código después de un rato de no hacer requests). Si este fuera el caso una opción que podés probar es agrupar requests de modo de no excederte de los límites establecidos.

      Algo más de info podés ver acá

  8. Mauro, estoy tratando de ver la solución al tema.
    Mientras te comento una inquietud. Me gustaría utilizar google drive para almacenar archivos (ej: .pdf) y desde una aplicación web en php, buscar un archivo determinado por su nombre.
    Ejemplo: usuario se logea en una página y la misma muestra que tiene 3 (tres) archivos, (los datos vienen de phpmyadmin):
    1.pdf
    2.pdf
    3.pdf
    al seleccionar uno, (ej: 2.pdf), tendría que buscar ese archivo en google drive y mostrar el contenido del mismo.
    Espero me entiendas.

  9. Mauro, limpie todo, reinstale y puedo ejecutarlo:
    pasa a: Conectar
    luego: accounts.google.com — muestra el inicio de sesión con el nombre del proyecto
    me logeo con la cuenta de correo y password
    y muestra lo siguiente:

    Fatal error: Uncaught GuzzleHttp\Exception\RequestException: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see http://curl.haxx.se/libcurl/c/libcurl-errors.html) in C:\wamp64\www\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php:187 Stack trace: #0 C:\wamp64\www\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php(150): GuzzleHttp\Handler\CurlFactory::createRejection(Object(GuzzleHttp\Handler\EasyHandle), Array) #1 C:\wamp64\www\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php(103): GuzzleHttp\Handler\CurlFactory::finishError(Object(GuzzleHttp\Handler\CurlHandler), Object(GuzzleHttp\Handler\EasyHandle), Object(GuzzleHttp\Handler\CurlFactory)) #2 C:\wamp64\www\vendor\guzzlehttp\guzzle\src\Handler\CurlHandler.php(43): GuzzleHttp\Handler\CurlFactory::finish(Object(GuzzleHttp\Handler\CurlHandler), Object(GuzzleHttp\Handler\EasyHandle), Object(GuzzleHttp\Handler\CurlFactory)) #3 C:\wamp64\www\vendor\guzzlehttp\guzzle\src\Handler\Proxy.php(28): GuzzleHttp\Handler\CurlHandler->__invoke(Ob in C:\wamp64\www\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php on line 187

    1. Bien, vamos avanzando 🙂

      Tuve un problema similar recientemente y, en mi caso, lo resolví apagando el Firewall de Windows.

      En tu caso, no creo que eso funcione ya que composer te funciona ok (Yo no podía instalar librerías vía composer ni hacer git pull)…

      Acá tenés información de un problema similar al tuyo.

      Suerte!

  10. Mauro, no tengo esa carpeta, ni archivo. Tengo el problema en composer.
    Al ejecutar el: composer-setup.exe – y desde un ventana de command de windows, ejecutar el
    composer install – me pide el archivo composer.json — este es el archivo que no encuentro para la
    instalación – por lo tanto si le pongo cualquier composer.json, en vendor/ aparecen cualquier carpetas
    que nada tienen que ver y por lo tanto la que vos describes no está.
    Estuve leyendo en getcomposer.org, pero no me doy cuenta de que código incluir en ese archivo composer.json.
    Si sabes como solucionar esto, te agradecería me tires un hilo.
    Muchísimas gracias

    1. Ok, ok… bueno, por lo menos ahora sabemos cuál es el problema :).

      Para empezar, veo que estás usando Windows… Me ha pasado recientemente de tener problemas para usar las herramientas de CLI en Windows (Composer por ejemplo).

      Mi recomendación es que uses todo desde la terminal de Windows. O mejor, si podés instalar y usar cygwin vas a tener una terminal POSIX (Casi como si estuvieses en Linux).

      Lo que deberías hacer es ejecutar composer install desde el directorio donde tenés el proyecto.

      Otra forma que podría servirte es, desde algún directorio que quieras (Mis Documentos, por ejemplo) y siempre desde la terminal, usar el comando composer init e ir definiendo las dependencias desde ahí.

      Una vez que tengas el directorio vendor y dentro de él google/apiclient entonces vas a poder empezar a crear los scripts propios del ejemplo.

      Saludos

  11. require_once ‘vendor/autoload.php’;
    session_start();
    $redirect_uri = ‘http://’ . $_SERVER[‘HTTP_HOST’] . ‘/paso2.php’;
    $client = new Google_Client();
    //$client->setAuthConfig(»);
    $client->setAuthConfig(‘client_secret08.09.18.json’);
    $client->setRedirectUri($redirect_uri);
    $client->addScope(«https://www.googleapis.com/auth/drive»);

    1. Así parece estar ok… ¿podés fijarte si tenés el archivo vendor/google/apiclient/src/Google/Client.php?

      Otra cosa que veo raro es que te de el error en el paso1.php… Ese archivo debería ejecutarse únicamente al comienzo (es el que genera el link «conectame»).

      Una vez seleccionada la cuenta debería llevarte a paso2.php (Lo que está en la varaible $redirect_uri).

      Si nada de esto te funciona diría que trates de debugearlo usando XDebug o similar.

      Ya sin ver el código en su contexto me temo que no voy a poder ayudarte… si querés que lo veamos juntos podemos coordinar una sesión de consulta.

      Saludos

  12. Disculpa Mauro, creo haber copiado bien el config.php – pero en el post muestra menos código, nuevamente te lo paso al config.php

    setAuthConfig(»);
    $client->setAuthConfig(‘client_secret08.09.18.json’);
    $client->setRedirectUri($redirect_uri);
    $client->addScope(«https://www.googleapis.com/auth/drive»);
    ?>

  13. Así está el config.php

    setAuthConfig(‘client_secret08.09.18.json’);
    $client->setRedirectUri($redirect_uri);
    $client->addScope(«https://www.googleapis.com/auth/drive»);
    ?>

    y el autoload.php

    <?php

    // autoload.php @generated by Composer

    require_once __DIR__ . '/composer/autoload_real.php';

    return ComposerAutoloaderInitcefa83e962c7304c4fad88596dfee348::getLoader();

    1. Bien.

      El autoload que muestras es el generado por composer. Eso está ok.

      Lo que parece faltar (a juzgar por el código que muestras) es el require_once 'vendor/autoload.php' en el archivo config.php.

  14. Hola Mauro, esto es lo que muestra composer.json luego de actualizar y reinstalar composer:

    {
    «require»: {
    «guzzlehttp/guzzle»: «^6.0»
    }
    }

    1. hola ! sera posible puedas hacer un copy paste de todo para solo cambiar la direccion y usar la propia para que funcione todo bien gracias

  15. Hola, ejecuto paso1, me sale Conectame! – al hacer click me lleva a elegir una cuenta de gmail.
    Luego de elegida muestra el siguiente error:

    Fatal error: Cannot use lexical variable $eventName as a parameter name in C:\wamp64\www\vendor\guzzlehttp\guzzle\src\Event\Emitter.php on line 48

    Espero me puedas guiar.
    Muchas gracias

      1. Estimado Mauro, muchas gracias por tu tiempo. Actualice guzzle con: composer update – lo reinstalé nuevamente, ahora me sale que no encuentra una clase:

        Fatal error: Uncaught Error: Class ‘Google_Client’ not found in C:\wamp64\www\config.php:5 Stack trace: #0 C:\wamp64\www\paso1.php(2): require_once() #1 {main} thrown in C:\wamp64\www\config.php on line 5

        del config.php

  16. Hola, estoy necesitando un script al que puedan acceder varios usuarios de google para buscar documentos dentro de una carpeta compartida. Es posible esto utilizando esta api?
    Puedo llegar a suponer (o exigir) que todos estos usuarios ya se encuentren logeados con su correspondiente cuenta.
    Me podrian guiar a un ejemplo?

    1. Hola Claudio:

      ¿Cómo estás? No tengo un caso específico de lo que buscas, pero me imagino que se podría usar la API para resolver tu problema. ¿Hiciste alguna prueba con la que hayas tenido dificultades?

      Acá veo una pregunta similar a la tuya.

      ¿Eso resuelve tu problema?

  17. Hola Eder:

    ¡No es ninguna molestia! Haz todas las preguntas que necesites y trataré de ayudarte :). No llego a entender cuál es exactamente el problema que tienes… ¿qué tiene de malo esa URL?

  18. bien en URIs de redirección autorizados tengo http://localhost/paso2.php

    y en pantalla de autorizacion de OAuth estan los siguientes campos como deben de ir y disculpa las molestias.
    en URL de pagina principal:
    URL de logotipo de producto:
    URL de la politica de privacidad
    URL de las condiciones de servicio:

  19. Gracias, ya la coloque y me pasa a la pantalla que dice:

    Te damos la bienvenida
    ederantonyo@gmail.com

    Ver y administrar los archivos en Google Drive
    ¿Quieres permitir a prueba hacer esto?

    Al hacer clic en Permitir, esta aplicación podrá usar tu información de conformidad con sus condiciones de servicio y políticas de privacidad. Puedes retirar esta aplicación (o cualquiera que esté conectada a tu cuenta) en Mi Cuenta

    ->Permitir y al darle en permitir ya no me manda a ningun lado :/ ¡Objeto no localizado! Error 404 localhost

    1. Seguramente te quedó mal configurada la URI de redireccionamiento.

      Es fácil de ver. Empezá por hacerlo vos mismo desde tu navegador, intentá ingresar directamente al archivo paso2.php

      Una vez que lo logres, esa es la URI que tiene que estar en la configuración de Google.

  20. En realidad no es correcto decir que Google debe poder acceder, ya que el callback lo realiza el mismo visitante (Su navegador en rigor de verdad)… Podés ver todo esto si vas siguiendo las URLs que se generan en los links y a través de tu navegador.

    Es por eso que, para un entorno productivo, deberías poner una dirección accesible públicamente (Por ejemplo http://academy.leewayweb.com/google_callback.php)

    En el caso de una prueba como esta, la dirección que debe figurar en el cuadro de URI de redireccionamiento debe ser «http://localhost/paso2.php» (O la que uses para acceder a tu sitio en localhost).

    En mi caso sería http://localhost:8080/paso2.php

  21. muchas gracias , tengo una duda en esta parte :

    Muy importante: este archivo (paso2.php) debe ser accesible desde Google (Para eso es importante que su URL completa esté ingresada en la configuración de URI de redireccionamiento, sin eso nada de esto funcionará.
    que dire

  22. Ahora me marca este error:

    Notice: Undefined variable: oauth_credentials in C:\xampp\htdocs\composer\config.php on line 5
    C:\xampp\htdocs\composer\vendor\google\auth\src\OAuth2.php on line 644

    1. Bueno… parece que vamos avanzando 🙂

      La variable $oauth_credentials debe contener la ruta al archivo json que descargaste al crear las credenciales.

      Lo voy a especificar en el post. Gracias!

  23. revisando si lo instale en xampp, creo que lo que me falta es hacer el archivo vendor/autoload.php pero no se como hacerlo o como generarlo.

  24. Hola que tal buen día, me marca el siguiente error que me estara faltando:

    Warning: require_once(C:\xampp\htdocs\composer\vendor/composer/autoload_real.php): failed to open stream: No such file or directory in C:\xampp\htdocs\composer\vendor\autoload.php on line 5

    Fatal error: require_once(): Failed opening required ‘C:\xampp\htdocs\composer\vendor/composer/autoload_real.php’ (include_path=’C:\xampp\php\PEAR’) in C:\xampp\htdocs\composer\vendor\autoload.php on line 5

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.