Nyligen har jag publicerat en artikel Hur man integrerar Google Sheets API med PHP där jag förklarade hur man skriver data till Google Sheet med PHP och Google API. En av läsarna frågade på liknande sätt hur man skulle skriva data till OneDrive-arket. I den här handledningen studerar vi hur man använder Microsoft Graph API och PHP för att skriva data i OneDrive-arket.
Microsoft Graph API följer OAuth-flödet för auktoriseringen. Det betyder att vi måste skapa en åtkomsttoken med OAuth-processen. För detta måste du först registrera applikationen och ta dina referenser.
Registrera en ansökan och skapa referenser
När du integrerar en OAuth-process måste du ha ett klient-id och en klienthemlighet. Du får det efter att du registrerat ansökningarna. Man kan följa stegen som nämns på den här sidan och registrera deras applikation hos Microsoft.
Logga in på Azure Portal och sök sedan efter appregistrering. Fyll i formuläret. Du måste skicka en URL till URI-fältet Redirect. Till det här fältet skickar jag en lokal server-URL. Jag skapar en callback.php
i nästa steg. Jag har fyllt i detaljerna som visas på skärmdumpen nedan.
När du skickar ett formulär får du klient-ID från fliken Översikt.
Gå sedan till fliken ‘Certifikat och hemligheter’ och klicka på ‘Ny klienthemlighet’.
Det öppnar en popup där du behöver lägga till en beskrivning och välja alternativet Utgår.
Efter detta får du din klienthemlighet som visas nedan.
Installera obligatoriska paket
Vi måste integrera två saker – OAuth och REST API. För OAuth ska jag använda Hybridauth- biblioteket. Och för att interagera med Microsoft Graph API, låt oss använda Guzzle- biblioteket.
Vi kan enkelt installera dessa två paket med en Composer. Skapa en composer.json
fil i din projektkatalog och lägg till nedanstående rader i den.
{
"require": {
"hybridauth/hybridauth": "~3.0",
"guzzlehttp/guzzle": "^7.0"
}
}
Kör kommandot nedan som kommer att installera dessa paket.
composer install
Som sagt använder Microsoft Graph API OAuth för att utföra API-operationerna. Det kräver att du genererar en åtkomsttoken som fungerar som en identifierare för ditt konto. Med hjälp av denna åtkomsttoken validerar Microsoft Graph API: er om den inkommande begäran är giltig och auktoriserad.
Åtkomsttoken har kort livslängd. De upphör snart. Och när den har löpt ut kan vi inte göra API-samtal eftersom Microsoft behandlar begäran med den utgångna token som en obehörig begäran. För att lösa problemet använder vi ‘refresh_token’ för att återskapa åtkomsttoken i bakgrunden. Så här fungerar OAuth.
Databaskonfiguration
För att uppnå vårt mål måste vi lagra symbolen på en säker plats. Vi behöver token när vi ringer till API: er. Det bör också regenereras när det har löpt ut. Så för att lagra tokeninformation skapar du en databastabell enligt följande.
CREATE TABLE `token` ( `id` int(11) NOT NULL AUTO_INCREMENT,
`access_token` text NOT NULL,
PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Vi sätter in token i databasen efter att auktoriseringsprocessen har slutförts. Vi kommer också att uppdatera token i bakgrunden. För detta ska jag skapa en databasklass så att vi enkelt kan göra insättnings-, markerings- och uppdateringsåtgärder.
klass-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)");
}
}
}
Skapa åtkomsttoken
När du är redo med de obligatoriska paketen och databasklassen gör nästa del autentisering och lagring av tokeninformation i databasen.
Hybridauth-biblioteket tillhandahåller sin egen process för att utföra auktorisering. Så, låt oss följa dem. Skapa en config.php
fil och lägg till koden nedan i den.
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 );
Se till att ersätta alla platshållare med deras faktiska värden. Jag har klarat de nödvändiga räckvidden för vårt slutmål så håll det som det är. Nu, i callback.php
vilken är min återuppringnings-URL, skriver jag en kod som startar autentiseringsprocessen, omdirigerar till den efter lyckad auktorisering och lagrar tokensinformationen i databastabellen.
callback.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() ;
}
Kör i callback.php
webbläsaren, slutför autentiseringsprocessen. När autentiseringen är klar bör du se tokeninformation lagrad i tabellen ‘tokens’.
Lägg till tabell i OneDrive-ark
För att lägga till data via Microsoft Graph API måste du infoga en tabell i OneDrive-arket. Gå över till OneDrive-sidan. Klicka på "Excel-arbetsbok" under rullgardinsmenyn "Ny".
När du väl är på arksidan klickar du på "Tabell" -ikonen och sedan "OK" från det öppnade popup-fönstret.
Efter detta ser du tabellen infogad i ditt OneDrive-ark enligt följande.
Justera kolumnerna enligt dina behov. I mitt fall behöll jag tre kolumner.
Nu kan man fråga varför behovet av att infoga en tabell i arket? När jag undersökte detta ämne fann jag att det här är det enda sättet att skriva data till Excel-arbetsboken. Du kan läsa mer om detta i deras dokumentation.
Notera när vi sätter in tabellen första gången i arket, dess värde är ‘Tabell1’. Vi behöver det här värdet när vi ringer API: er. Om du av någon anledning tar bort tabellen och sätter in den igen blir dess värde ‘Table2’ och så vidare.
Kopiera ditt ark-ID som krävs i ett API-samtal. Du kan hämta det från webbläsarens URL som visas på skärmdumpen nedan.
Skriv data till OneDrive-ark med Microsoft Graph API och PHP
Hittills är vi klara med att installera de nödvändiga paketen, infoga tokens i databasen, skapa en Excel-arbetsbok med en tabell i den. Nu är det bra att gå vidare och skriva en kod som bifogar data till OneDrive-arket med hjälp av Microsoft Graph API och PHP.
Jag skapar en fil append-to-onedrive-sheet.php
och min kod kommer att vara som skrivet nedan.
<?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.
}
}
}
I ovanstående kod skapade jag en array som har arrayelementet med 3 värden. Du kan skicka så många matriselement. Du måste skicka ditt ark-id till $item_id
variabeln.
Den här koden hämtar en åtkomsttoken från databasen och skickar en POST-begäran till det nödvändiga API-slutpunkten. Om token upphör, regenererar den automatiskt i bakgrunden och fortsätter processen.
Prova det och du bör se att dina data läggs till i Excel-arbetsboken för ditt OneDrive-konto.
Jag hoppas att du fick lära dig att skriva data till OneDrive-arket med Microsoft Graph API och PHP. Dela dina tankar och förslag i kommentarsektionen nedan.
relaterade artiklar
- Tal till text med Amazon Transcribe i PHP
- Skicka e-post med Mailjet i PHP
- PayPal Payment Gateway-integration i PHP med PayPal REST API