Tengo un complemento de calendario que funciona con mi WordPress y quiero integrar la API de Google Calendar para crear, leer, actualizar y eliminar eventos de Google Calendar. Este es el proceso que seguí.
Creé una función dentro de una clase de complemento de calendario diferente, que obtuve de la documentación de la API de Google Calendar (https://developers.google.com/calendar/quickstart/php):
function getClient() {
try{
$client = new Google_Client();
$client->setApplicationName('Google Calendar API');
$client->setScopes(Google_Service_Calendar::CALENDAR);
$client->setAuthConfig(AEC_PATH .'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)) {
$accessToken = json_decode(file_get_contents($tokenPath), true);
$client->setAccessToken($accessToken);
} else {
print 'Access Token not generated!!';
}
// 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%sn", $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;
} catch(Exception $e) {
print_r($e->getMessage());
}
Ahora agregué un gancho de acción en el constructor para inicializar esta función.
add_action('init', array($this, 'getClient'));
Ahora estoy llamando a esta función getClient() en otra función para llamar en un intervalo de tiempo particular.
try{
// Get the API client and construct the service object.
$client = $this->getClient();
$service = new Google_Service_Calendar($client);
$calendarId = '<Google_Calendar_ID>';
$event = new Google_Service_Calendar_Event(array(
'summary' => $input->title,
'location' => $input->address.''.$input->city.''.$input->state.''.$input->country.''.$input->zip,
'description' => $input->description,
'start' => array(
'dateTime' => '2019-09-22T09:00:00-07:00'
),
'end' => array(
'dateTime' => '2019-09-22T17:00:00-07:00'
),
'reminders' => array(
'useDefault' => FALSE,
'overrides' => array(
array('method' => 'email', 'minutes' => 24 * 60),
array('method' => 'popup', 'minutes' => 10),
),
),
));
$event = $service->events->insert($calendarId, $event);
echo "--Google Event Created-->";
print_r($event);
} catch(Exception $e) {
print_r($e->getMessage());
}
En lugar de un nuevo evento creado en mi Calendario de Google, recibo un error de autorización.
{
"error": {
"errors": [
{
"domain": "global",
"reason": "insufficientPermissions",
"message": "Insufficient Permission: Request had insufficient authentication scopes."
}
],
"code": 403,
"message": "Insufficient Permission: Request had insufficient authentication scopes."
}
¿Podría ayudarme a comprender por qué recibo este error y cómo puedo resolverlo?
.