Utilisation Api GMB avec Symfony PHP

L’utilisation de l’API Google My Buisness est assez complexe.

Les étapes sont :

  • Création d’un compte GMB (non expliqué ici)
  • Création d’un projet dans GMB
  • Activation de l’API GMB
  • Création d’un identifiant Auth02
  • Example PHP pour récupérer la liste des restaurants « locations »

Création d’un projet GMB

Maintenant que vous avez votre compte GMB.

Allez sur ce lien : https://console.cloud.google.com/cloud-resource-manager?hl=fr

Activation GMB

Pour l’activation de l’API GMB, il faut faire la demande via un formulaire de 10 pages.

Lien : https://developers.google.com/my-business/content/basic-setup?hl=fr

Une fois valider, vous pourrais appuyer sur les boutons bleus du même lien.

Création identifiant GMB

Maintenant que vous avez activé les APIs, vous pouvez les retrouvez dans votre projet (accèder au projet depuis le lien de création du projet).

Dans le menu en haut à droite, API puis Tableau de bord :

Vous arriver sur un vue des apis activés, et vous devez trouver en bas GMB :

Cliquer sur l’API GMB (Google My Buisness API), vous devez arriver ici :

Maintenant nous allons créer un identifiant pour se connecter via OAuth

Cliquez sur Identifiant > Créer un identifiant

Pour l’exemple nous prendrons « Application Web ».

Une fois l’identifiant créer vous pouvez télécharger le json.

Exemple page PHP

Afin de réaliser un test fonctionnel, nous avons créer une page pour récupérer les restaurants (locations).

Cette exemple est inspiré de : https://github.com/google/google-my-business-samples/blob/master/php/accounts-list.php

Utilisation du repo : https://github.com/bronhy/google-my-business-php-client

Action d’un controller (ne pas oublier d’ajouter URI dans l’identifiant GMB) :

    /**
     * @Route("/auth")
     */
    public function auth(Request $request): Response
    {

        //fichier json téléchargeable sur l'identifiant créer
        //mettre le chemin du fichier json
        $credentials_f = 'api_web.json';
        

        $client = new Google_Client();
        $client->setAuthConfig($credentials_f);
        $client->addScope("https://www.googleapis.com/auth/business.manage");
        $client->setAccessType('offline');        // offline access
        $client->setIncludeGrantedScopes(true);   // incremental auth

        //dev ajout http://localhost/auth dans les uri possible au niveau de l'identifiant GMB
        $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/auth';
       
             
        $client->setRedirectUri($redirect_uri);
        $my_business_account = new Google_Service_MyBusiness($client);

        if (isset($_GET['logout'])) { // logout: destroy token
            unset($_SESSION['token']);
            die('Logged out.');
        }

        if (isset($_GET['code'])) { // get auth code, get the token and store it in session
            $client->authenticate($_GET['code']);
            $_SESSION['token'] = $client->getAccessToken();
        }


        if (isset($_SESSION['token'])) { // get token and configure client
            $token = $_SESSION['token'];
            $client->setAccessToken($token);
        }

        if (!$client->getAccessToken()) { // auth call 
            $authUrl = $client->createAuthUrl();
            header("Location: " . $authUrl);
            die;
        }

        $list_accounts_response = $my_business_account->accounts->listAccounts();
        //renvoie la liste des locations du premier account
        dd($my_business_account->accounts_locations->listAccountsLocations($list_accounts_response[0]['name']));

    }

A la première connexion, l’application vous redirigera à la connexion « google » pour créer un nouveau token. Le token sera conserver en session.

Exemple batch PHP

Afin de lancer un traitement cron ou batch, vous aurez besoin de récupérez le token dans un fichier ou dans une base de données.

Attention, le token a une durée de vie (environ 6mois).

<?php

namespace App\Command;


use Exception;
use Google_Client;
use Google_Service_MyBusiness;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class GmbCommand extends Command
{
    // the name of the command (the part after "bin/console")
    protected static $defaultName = 'gmb';


    /**
     * Returns an authorized API client.
     * @return Google_Client the authorized client object
     */
    function getClient()
    {
        $client = new Google_Client();
        $client->setApplicationName('People API PHP Quickstart');
        $client->setScopes("https://www.googleapis.com/auth/business.manage");
        $client->setAuthConfig('[fichier json appli web]');
        $client->setAccessType('offline');
        $client->setPrompt('select_account consent');
        $client->setRedirectUri('http://127.0.0.1:8000/auth');//pour le serveur de test

        // 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 {
                // 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;
    }


    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $output->writeln([
            '<fg=blue>GMB : Google My Buisness</>',
            '============',
        ]);

        // Get the API client and construct the service object.
        $client = $this->getClient();

        $my_business_account = new Google_Service_MyBusiness($client);

       


        $list_accounts_response = $my_business_account->accounts->listAccounts();
        //renvoie la liste des locations du premier account
        dd($my_business_account->accounts_locations-listAccountsLocations($list_accounts_response[0]['name']));


}

Pour lancer le script il suffit d’appeler la commande :

Lors du premier lancement, l’application va demander de suivre un lien (identification) pour créer un code. Pour faire un exemple j’ai modifier le code du premier exemple en remplaçant cette condition :

 if (isset($_GET['code'])) { // get auth code, get the token and store it in session
       dd($_GET['code']);
 }

Ainsi on peut copier le code et le mettre dans la commande.

Le résultat est plus verbeux dans la console, mais il est exactement identique à celui du premier exemple.

Tips

  • ⚠️ Un seul projet peut être connecté en API sur un compte GMB
  • ⚠️ L’ API GMB semble être utilisable uniquement via OAuth 2, le compte de service ne fonctionne pas et surtout pas la clé API.