Récemment, j’ai publié un article Comment intégrer l’API Google Sheets avec PHP où j’expliquais comment écrire des données dans la feuille Google à l’aide de PHP et des API Google. L’un des lecteurs a demandé de la même manière comment écrire des données sur la feuille OneDrive. Dans ce tutoriel, nous allons étudier comment utiliser l’API Microsoft Graph et PHP pour écrire les données dans la feuille OneDrive.
L’API Microsoft Graph suit le flux OAuth pour l’autorisation. Cela signifie que nous devons générer un jeton d’accès à l’aide du processus OAuth. Pour cela, vous devez d’abord enregistrer l’application et récupérer vos informations d’identification.
Enregistrer une application et créer des informations d’identification
Lors de l’intégration d’un processus OAuth, vous devez disposer d’un identifiant client et d’un secret client. Vous l’obtiendrez après avoir enregistré les applications. On peut suivre les étapes mentionnées sur cette page et enregistrer son application auprès de Microsoft.
Connectez-vous au portail Azure, puis recherchez Inscription d’application. Remplissez le formulaire. Vous devez transmettre une URL au champ URI de redirection. À ce champ, je passe une URL de serveur local. Je vais créer un callback.php
dans les prochaines étapes. J’ai rempli les détails comme indiqué dans la capture d’écran ci-dessous.
Lors de la soumission d’un formulaire, vous obtiendrez l’ID client à partir de l’onglet Aperçu.
Ensuite, allez dans l’onglet ‘Certificats et secrets’ et cliquez sur le ‘Nouveau secret client’.
Il ouvrira une fenêtre contextuelle dans laquelle vous devrez ajouter une description et choisir l’option Expire.
Après cela, vous obtiendrez votre secret client comme indiqué ci-dessous.
Installer les packages requis
Nous devons intégrer deux choses – OAuth et REST API. Pour l’OAuth, je vais utiliser la bibliothèque Hybridauth. Et pour interagir avec l’API Microsoft Graph, utilisons la bibliothèque Guzzle.
Nous pouvons facilement installer ces 2 packages à l’aide d’un Composer. Créez un composer.json
fichier dans le répertoire racine de votre projet et ajoutez-y les lignes ci-dessous.
{
"require": {
"hybridauth/hybridauth": "~3.0",
"guzzlehttp/guzzle": "^7.0"
}
}
Exécutez la commande ci-dessous qui installera ces packages.
composer install
Comme indiqué, l’API Microsoft Graph utilise OAuth pour effectuer les opérations de l’API. Il vous oblige à générer un jeton d’accès qui sert d’identifiant de votre compte. À l’aide de ce jeton d’accès, les API Microsoft Graph valident si la demande entrante est valide et autorisée.
Le jeton d’accès a une courte durée de vie. Ils expirent bientôt. Et une fois expiré, nous ne pouvons pas faire d’appels d’API car Microsoft traite la demande avec le jeton expiré comme une demande non autorisée. Pour résoudre ce problème, nous utilisons le ‘refresh_token’ pour régénérer le jeton d’accès en arrière-plan. C’est ainsi que fonctionne OAuth.
Configuration de la base de données
Pour atteindre notre objectif, nous devons stocker le jeton dans un endroit sûr. Nous avons besoin du jeton lors de l’appel des API. En outre, il devrait se régénérer après son expiration. Donc, pour stocker les détails du jeton, créez une table de base de données comme suit.
CREATE TABLE `token` ( `id` int(11) NOT NULL AUTO_INCREMENT,
`access_token` text NOT NULL,
PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Nous insérerons le jeton dans la base de données après avoir terminé le processus d’autorisation. De plus, nous mettrons à jour le jeton en arrière-plan. Pour cela, je vais créer une classe de base de données afin que nous puissions facilement effectuer les opérations d’insertion, de sélection et de mise à jour.
classe-db.php
<?php
class DB {
private $dbHost = "DB_HOST";
private $dbUsername = "DB_USERNAME";
private $dbPassword = "DB_PASSWORD";
private $dbName = "DB_NAME";
public function __construct(){
if(!isset($this->db)){
// Connect to the database
$conn = new mysqli($this->dbHost, $this->dbUsername, $this->dbPassword, $this->dbName);
if($conn->connect_error){
die("Failed to connect with MySQL: ". $conn->connect_error);
}else{
$this->db = $conn;
}
}
}
public function is_table_empty() {
$result = $this->db->query("SELECT id FROM token");
if($result->num_rows) {
return false;
}
return true;
}
public function get_access_token() {
$sql = $this->db->query("SELECT access_token FROM token");
$result = $sql->fetch_assoc();
return json_decode($result['access_token']);
}
public function get_refersh_token() {
$result = $this->get_access_token();
return $result->refresh_token;
}
public function update_access_token($token) {
if($this->is_table_empty()) {
$this->db->query("INSERT INTO token(access_token) VALUES('$token')");
} else {
$this->db->query("UPDATE token SET access_token = '$token' WHERE id = (SELECT id FROM token)");
}
}
}
Générer un jeton d’accès
Une fois que vous êtes prêt avec les packages et la classe de base de données requis, la partie suivante consiste à effectuer l’authentification et à stocker les détails du jeton dans la base de données.
La bibliothèque Hybridauth fournit son propre processus pour effectuer l’autorisation. Alors, suivons-les. Créez un config.php
fichier et ajoutez-y le code ci-dessous.
config.php
<?php
require_once 'vendor/autoload.php';
require_once 'class-db.php';
define('ONEDRIVE_CLIENT_ID', 'CLIENT_ID_HERE');
define('ONEDRIVE_CLIENT_SECRET', 'CLIENT_SECRET_HERE');
define('ONEDRIVE_SCOPE', 'files.read files.read.all files.readwrite files.readwrite.all offline_access');
define('ONEDRIVE_CALLBACK_URL', 'CALLBACK_URL_HERE'); // in my case it is http://localhost/sajid/onedrive/callback.php
$config = [
'callback' => ONEDRIVE_CALLBACK_URL,
'keys' => [
'id' => ONEDRIVE_CLIENT_ID,
'secret' => ONEDRIVE_CLIENT_SECRET
],
'scope' => ONEDRIVE_SCOPE,
'authorize_url_parameters' => [
'approval_prompt' => 'force',
'access_type' => 'offline'
]
];
$adapter = new HybridauthProviderMicrosoftGraph( $config );
Assurez-vous de remplacer tous les espaces réservés par leurs valeurs réelles. J’ai passé les portées requises pour notre objectif final, alors gardez-le tel quel. Maintenant, dans callback.php
quelle est mon URL de rappel, je vais écrire un code qui démarre le processus d’authentification, le redirige après une autorisation réussie et stocke les informations des jetons dans la table de la base de données.
rappel.php
<?php
require_once 'config.php';
try {
$adapter->authenticate();
$token = $adapter->getAccessToken();
$db = new DB();
if($db->is_table_empty()) {
$db->update_access_token(json_encode($token));
echo "Access token inserted successfully.";
}
}
catch( Exception $e ){
echo $e->getMessage() ;
}
Exécutez le callback.php
sur le navigateur, terminez le processus d’authentification. Une fois l’authentification terminée, vous devriez voir les détails du jeton stockés dans la table « jetons ».
Ajouter une table dans la feuille OneDrive
Pour ajouter les données via l’API Microsoft Graph, vous devez insérer un tableau dans la feuille OneDrive. Rendez-vous sur la page OneDrive. Cliquez sur le « classeur Excel » dans la liste déroulante « Nouveau ».
Une fois que vous êtes sur la page de la feuille, cliquez sur l’icône « Tableau » puis sur « OK » dans la fenêtre contextuelle ouverte.
Après cela, vous verrez le tableau inséré dans votre feuille OneDrive comme suit.
Ajustez les colonnes selon vos besoins. Dans mon cas, j’ai gardé 3 colonnes.
Maintenant, on peut se demander pourquoi avoir besoin d’insérer un tableau dans la feuille? Lors de mes recherches sur ce sujet, j’ai découvert que c’était le seul moyen d’écrire des données dans le classeur Excel. Vous pouvez en savoir plus à ce sujet sur leur documentation.
Notez que lorsque nous insérons le tableau pour la première fois dans la feuille, sa valeur est « Table1 ». Nous avons besoin de cette valeur au moment de l’appel des API. Si, pour une raison quelconque, vous supprimez le tableau et l’insérez à nouveau, sa valeur devient « Table2 » et ainsi de suite.
Copiez votre ID de feuille qui est requis dans un appel API. Vous pouvez l’obtenir à partir de l’URL du navigateur, comme indiqué dans la capture d’écran ci-dessous.
Écrire des données dans une feuille OneDrive avec l’API Microsoft Graph et PHP
Jusqu’à présent, nous avons terminé d’installer les packages requis, d’insérer des jetons dans la base de données, de créer un classeur Excel contenant un tableau. Maintenant, nous sommes prêts à écrire un code qui ajoute des données à la feuille OneDrive à l’aide de l’API Microsoft Graph et de PHP.
Je crée un fichier append-to-onedrive-sheet.php
et mon code sera comme écrit ci-dessous.
<?php
require_once 'config.php';
// here you can pass as many data as a separate array element
$arr_data = [
['John Doe', '[email protected]', '8888888888']
];
append_to_sheet($arr_data);
function append_to_sheet($arr_data = array()) {
$item_id = 'YOUR_SHEET_ID';
$table = 'Table1'; //in your case it can be Table2, Table3, ...
$db = new DB();
$arr_token = (array) $db->get_access_token();
$accessToken = $arr_token['access_token'];
try {
$client = new GuzzleHttpClient([
// Base URI is used with relative requests
'base_uri' => 'https://graph.microsoft.com',
]);
$response = $client->request("POST", "/v1.0/me/drive/items/$item_id/workbook/tables/$table/rows/add", [
'json' => [
'values' => $arr_data
],
'headers' => [
'Authorization' => 'Bearer '. $accessToken
],
'verify' => false,
]);
} catch(Exception $e) {
if( 401 == $e->getCode()) {
$refresh_token = $db->get_refersh_token();
$client = new GuzzleHttpClient(['base_uri' => 'https://login.microsoftonline.com']);
$response = $client->request('POST', '/common/oauth2/v2.0/token', [
'form_params' => [
"grant_type" => "refresh_token",
"refresh_token" => $refresh_token,
"client_id" => ONEDRIVE_CLIENT_ID,
"client_secret" => ONEDRIVE_CLIENT_SECRET,
"scope" => ONEDRIVE_SCOPE,
"redirect_uri" => ONEDRIVE_CALLBACK_URL,
],
]);
$db->update_access_token($response->getBody());
append_to_sheet($arr_data);
} else {
echo $e->getMessage(); //print the error just in case your video is not uploaded.
}
}
}
Dans le code ci-dessus, j’ai créé un tableau qui a l’élément de tableau avec 3 valeurs. Vous pouvez passer autant d’éléments de tableau. Vous devez passer votre identifiant de feuille à la $item_id
variable.
Ce code récupère un jeton d’accès dans la base de données et envoie une requête POST au point de terminaison d’API requis. Si le jeton expire, il le régénère automatiquement en arrière-plan et poursuit le processus.
Essayez-le et vous devriez voir que vos données sont ajoutées au classeur Excel de votre compte OneDrive.
J’espère que vous avez appris à écrire des données sur la feuille OneDrive à l’aide de l’API Microsoft Graph et de PHP. S’il vous plaît partager vos pensées et suggestions dans la section commentaires ci-dessous.
Articles Liés
- Speech-To-Text à l’aide d’Amazon Transcribe en PHP
- Envoyer un e-mail avec Mailjet en PHP
- Intégration de la passerelle de paiement PayPal dans PHP à l’aide de l’API REST PayPal