I am trying to update Google Calendar using the PHP API. I have successfully been able to create Google Calendar Events and automatically get the ID for the event, but when I try and update the event, I get this error:
PHP Fatal error: Call to undefined function dateTime() in public_html/googleapi/calendarupdate.php on line 45. It is referring to the line:
$event->setStart.dateTime($startdatetime);
Here is my current PHP Code for the error:
<?php
header('Content-type: application/json');
require_once __DIR__ . '/google-api-php-client/src/Google/autoload.php';
$summary = $_POST["summary"];
$location = $_POST["location"];
$description = $_POST["description"];
$startdatetime = $_POST["startdatetime"];
$enddatetime = $_POST["enddatetime"];
$clientemail = $_POST["clientemail"];
$privatekey = $_POST["privatekey"];
$useremail = $_POST["useremail"];
$calendarid = $_POST["calendarid"];
$client_email = $clientemail;
$private_key = file_get_contents($privatekey);
$scopes = array('https://www.googleapis.com/auth/calendar');
$user_to_impersonate = $useremail;
$credentials = new Google_Auth_AssertionCredentials(
$client_email,
$scopes,
$private_key,
'notasecret', // Default P12 password
'http://oauth.net/grant_type/jwt/1.0/bearer', // Default grant type
$user_to_impersonate
);
$client = new Google_Client();
$client->setAssertionCredentials($credentials);
if ($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion();
}
$service = new Google_Service_Calendar($client);
$event = $service->events->get($useremail, $calendarid);
$event->setSummary($summary);
$event->setLocation($location);
$event->setStart.dateTime($startdatetime);
$event->setStart.timeZone('America/Los_Angeles');
$event->setEnd.dateTime($enddatetime);
$event->setEnd.timeZone('America/Los_Angeles');
$event->setDescription($description);
$updatedEvent = $service->events->update($useremail, $event->getId(), $event);
echo json_encode($updatedEvent);
My PHP code is based off of Google's API Documentation found here.
Ok, I actually managed to figure it out. I just had to change the line:
$event->setStart.dateTime($startdatetime);
To This:
$event->start->setDateTime($startdatetime);
I do the same general thing for the end datetime, except where it says start, I just put end. Just tested it and it worked perfectly. The site that helped me out can be found here.
Related
I am getting 400 Bad Request in REST.php on line 79 implementing GMAIL Api PHP
I have used below code to implement:
// Get the API client and construct the service object.
$client = new Google_Client();
$client->setDeveloperKey(API_KEY);
$client->setClientId(OAUTH_CLIENT_ID);
$client->setClientSecret(OAUTH_CLIENT_SECRET);
$client_email = MY_SERVICE_ACCOUNT_ID;
$private_key = file_get_contents('MYP12.p12');
$scopes = array(
'https://www.googleapis.com/auth/userinfo.email',
'https://mail.google.com'
);
$credentials = new Google_Auth_AssertionCredentials(
$client_email,
$scopes,
$private_key
);
$client->setApplicationName("Gmail Sample");
$client->setAssertionCredentials($credentials);
//Refresh the token if it's expired.
if ($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion();
}
$token = $client->getAccessToken();
$client->setAccessToken($token);
$service = new Google_Service_Gmail($client);
$user = 'me';
$date_last = date('Y-m-d');
$newdate = strtotime('-1 day', strtotime($date_last));
$newdate = date('Y-m-d', $newdate);
$q = " 'after:".$newdate."'";
$messagesResponse = $service->users_messages->listUsersMessages($user, ['maxResults'=>1000 , 'q'=> $q]);
echo '<pre>';
print_r($messagesResponse);exit;
Fatal error: Uncaught exception 'Google_Service_Exception' with
message 'Error calling GET
https‍://www.googleapis.com/gmail/v1/users/me/messages?maxResults=1000&q=+%27after%3A2017-12-26%27&key=[API_KEY]:
(400) Bad Request' in
C:\wamp\www\google\google_calendar\src\Google\Http\REST.php on line 79
You have to replace API_KEY, OAUTH_CLIENT_ID, OAUTH_CLIENT_SECRET, [MY_SERVICE_ACCOUNT_ID] with your credentials.
$client->setDeveloperKey(API_KEY);
$client->setClientId(OAUTH_CLIENT_ID);
$client->setClientSecret(OAUTH_CLIENT_SECRET');
$client_email = '[MY_SERVICE_ACCOUNT_ID]';
With the following code using Google's PHP API Client I am receiving this response.
Google_Service_Exception with message 'Error calling POST https://www.googleapis.com/dns/v1/projects/PROJECT-NAME/managedZones/DNSZONE/changes: (400) The 'entity.change' parameter is required but was missing.
Where PROJECT-NAME and DNSZONE are my project and zone.
$client_email = MYCLIENT;
$private_key = file_get_contents('config/credentials/KEY.p12');
$scopes = array('https://www.googleapis.com/auth/ndev.clouddns.readwrite');
$project = "PROJECT-NAME";
$managedZone = "DNSZONE";
$creds = new Google_Auth_AssertionCredentials($client_email,$scopes,$private_key);
$client = new Google_Client();
$client->setAssertionCredentials($creds);
$resource = new Google_Service_Dns_ResourceRecordSet();
$resource->kind = "dns#resourceRecordSet";
$resource->name = "testing.DNSZONE.net.";
$resource->rrdatas[] = "testing.otherhost.com.";
$resource->ttl = 800;
$resource->type = "CNAME";
$dns = new Google_Service_Dns($client);
$change = new Google_Service_Dns_Change();
$change->kind = "dns#change";
$change->setAdditions($resource);
$dns->changes->create($project,$managedZone,$change);
I am a bit confused as to how to set this parameter. Or where I am even am to define it.
Just for clarify what the answer is, setAdditions expects an array.
$change->setAdditions([ $resource ]);
i'm tring to migrate my google calendar access from Zend to new google API since they closed the service in november. My web app uses google api to create some events.
I'm facing a recurring message that i could not resolve : Uncaught exception 'Google_Auth_Exception' with message 'Invalid code'
Here's my code :
define('STDIN',fopen("php://stdin","r"));
require_once '../../utils/google-api-php-client-master/autoload.php';
/**********************
OAUTH 2.0 AUTHORIZATION
***********************/
$client = new Google_Client();
// OAuth2 client ID and secret can be found in the Google Developers Console.
$client->setClientId('XXXXXX);
$client->setClientSecret('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
$client->setRedirectUri('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
$client->addScope('https://www.googleapis.com/auth/calendar');
$service = new Google_Service_Calendar($client);
$authUrl = $client->createAuthUrl();
//Request authorization
print "Please visit:\n$authUrl\n\n";
print "Please enter the auth code:";
echo(trim(fgets(STDIN)));
$authCode = trim(fgets(STDIN));
// Exchange authorization code for access token
$accessToken = $client->authenticate($authCode);
$client->setAccessToken($accessToken);
Could someone please help me ?
I finally got this stuff to start working myself and a lot of searching. I was also using Zend before. There is a very good website at Daimto.com where you can see a bunch of tutorials. Here is the code that worked for me to add an event using the code form Daimto.com and adding code for adding an event in the body. Remember you need ot have the service email added to the share of your google calendar too!
<?php
session_start();
require_once './google-api-php-client/src/Google/Client.php';
require_once './google-api-php-client/src/Google/Service/Calendar.php';
$client_id = '6846057_YOUR_CLIENT_ID_HERE_pg3q8r6.apps.googleusercontent.com';
$Email_address = '68460_YOUR_SERVICE_EMAIL_HERE_developer.gserviceaccount.com';
$key_file_location = '_KEY_FILE_LOCATION_HERE_8.p12';
$client = new Google_Client();
$client->setApplicationName("_APP_NAME_HERE_");
$key = file_get_contents($key_file_location);
// seproate additional scopes with a comma
$scopes ="https://www.googleapis.com/auth/calendar";
$cred = new Google_Auth_AssertionCredentials(
$Email_address,
array($scopes),
$key
);
$client->setAssertionCredentials($cred);
if($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion($cred);
}
$service = new Google_Service_Calendar($client);
?>
<html><body>
<?php
//$service = new Google_Service_Calendar($client);
//
$event = new Google_Service_Calendar_Event();
$event->setSummary('Event 2');
$event->setLocation('Somewhere');
$start = new Google_Service_Calendar_EventDateTime();
$start->setDateTime('2015-06-22T19:00:00.000+01:00');
$start->setTimeZone('Europe/London');
$event->setStart($start);
$end = new Google_Service_Calendar_EventDateTime();
$end->setDateTime('2015-06-22T19:25:00.000+01:00');
$end->setTimeZone('Europe/London');
$event->setEnd($end);
//
$calendar_id = "nm_GOOGLE_CAL_ID_HERE_#group.calendar.google.com";
//
$new_event = null;
//
try {
$new_event = $service->events->insert($calendar_id, $event);
//
$new_event_id= $new_event->getId();
} catch (Google_ServiceException $e) {
syslog(LOG_ERR, $e->getMessage());
}
//
$event = $service->events->get($calendar_id, $new_event->getId());
//
if ($event != null) {
echo "Inserted:";
echo "EventID=".$event->getId();
echo "Summary=".$event->getSummary();
echo "Status=".$event->getStatus();
}
?>
I seem to have bumped into a google calendar api problem. and I can't really see where I have made the error so an extra set of eyes would be greatly appreciated. The problem in short is that the part of the code that should output the events.. doesn't (the "result" part of the code.
require_once "./google-api-php-client/src/Google/Client.php";
require_once "./google-api-php-client/src/Google/Service/Calendar.php";
// Service Account info
$client_id = "XXXXXX-XXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com";
$app_name = "Some-name";
$service_account_name = 'XXXXX-XXXXXXXXXXXXXXXXXXXXXXX#developer.gserviceaccount.com';
$key_file_location = 'google-api-php-client/Some-name-xxxxxxxxxx.p12';
$cal_id = "primary";
// Service Account info
$client_id = $client_id;
$service_account_name = $service_account_name;
$key_file_location = $key_file_location;
// Calendar id
$calName = $cal_id;
$client = new Google_Client();
$client -> setApplicationName($app_name);
$service = new Google_Service_Calendar($client);
$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials(
$service_account_name,
array('https://www.googleapis.com/auth/calendar.readonly'),
$key
);
$client->setAssertionCredentials($cred);
$cals = $service->calendarList->listCalendarList();
print_r($cals);
echo "<br>events<br>";
$events = $service->events->listEvents($calName);
var_dump($events);
echo "<br>result:<br>";
// the following is what returns nothing, works fine until this point.
$i = 0;
foreach ( $events->getItems() as $event ) {
echo 'i:'.$i.' '.$event->getSummary();
$i++;
}
echo 'end';
Change $events to the below line:
$events = $service->events->listEvents('primary', $params);
Instead of primary, add $calName and also send $params in listEvents method.
Hope this works.
I am working on the PHP API to Google Calendar, I have previously used the Zend library and I am upgrading to the API V3 I downloaded the Git Hub client library v1.0.
I have completed oAuth 2 and I am storing Refresh tokens in a database. I can connect and write events to Google Calendar, thanks mainly to the contributors at StackOverflow. Thanks
My problem is that I cannot delete events. I am connecting with oAuth 2 and retrieving event Ids however
$service->events->delete('primary', $event->getId());
This generates Fatal error: Uncaught exception 'Google_IO_Exception' with message 'HTTP Error: Unable to connect: '0'' in C:\wamp\www\new-roster-decoder\src\Google\IO\Stream.php on line 128
I have hunted high and low and been unable to find a solution. Please help Thanks
EDITED AS SOLVED
Due to Emily's great advice this is solved
Solution downloaded the latest API from GitHub as the problem of GZIP has been sorted.
As a matter of interest I initially commented out GZIP in congig.php and this fixed it, but I then lost the performance benefits, then new library sorted it.
Lessons learnt. Stackoverflow users are very kind to give their time, and always try the lastest software
END OF EDIT
<?php
/// This works
session_start();
set_include_path("src/" . PATH_SEPARATOR . get_include_path());
require_once 'Google/Client.php';
require_once 'Google/Service/Calendar.php';
require_once 'account/dbc.php';
$client_id = 'XXXXXXXXXX.apps.googleusercontent.com';
$client_secret = 'XXXXXXXXXXX';
$redirect_uri = 'http://localhost:80/new-roster-decoder/account/GoogleoAuth.php';
$client = new Google_Client();
$client->setClientId($client_id);
$client->setClientSecret($client_secret);
$client->setRedirectUri($redirect_uri);
$client->addScope("https://www.googleapis.com/auth/calendar");
$client->setAccessType('offline');
$users_rs_settings = mysqli_query($link,"select * from users WHERE id = 118");
$users_array = mysqli_fetch_array($users_rs_settings);
$refresh_token = $users_array['refresh_token']; //2010-04-06
$client->refreshToken($refresh_token);
$service = new Google_Service_Calendar($client);
$event = new Google_Service_Calendar_Event();
$event->setSummary('Positioning TX');
$event->setLocation('BRS-LGW');
$start = new Google_Service_Calendar_EventDateTime();
$start->setDateTime('2014-02-19T14:00:00.000-00:00');
$start->setTimeZone('Europe/London');
$event->setStart($start);
$end = new Google_Service_Calendar_EventDateTime();
$end->setDateTime('2014-02-19T17:25:00.000-00:00');
$end->setTimeZone('Europe/London');
$event->setEnd($end);
// insert ext properties
$rdname = "RosterDecoderID";
$rdvalue = 1;
$extendedProperties = New Google_Service_Calendar_EventExtendedProperties();
$extendedProperties->setPrivate(array($rdname=>$rdvalue));
$event->setExtendedProperties($extendedProperties);
// end of insert ext properties
$createdEvent = $service->events->insert('primary', $event);
echo $createdEvent->getId()."\n\n";
$_SESSION['access_token'] = $client->getAccessToken();
var_dump($_SESSION['access_token']);
var_dump($event);
$minCheck = date(DATE_ATOM, mktime(0, 0, 0, date("m"), date("d"), date("Y") ));
$maxCheck = date(DATE_ATOM, mktime(0, 0, 0, date("m"), (date("d")+1), date("Y") ));
$optParams = array( 'privateExtendedProperty' => 'RosterDecoderID=1','timeMin' => $minCheck, 'timeMax' => $maxCheck);
$events = $service->events->listEvents('primary', $optParams);
while(true) {
foreach ($events->getItems() as $event) {
$eventID = $event->getId();
//////////////////////////////////////////////////////////
//This bit throws an error
$service->events->delete('primary', $event->getId());
/////////////////////////////////////////////////////////
// The error is
// Fatal error: Uncaught exception 'Google_IO_Exception' with message 'HTTP Error: Unable to connect: '0'' in C:\wamp\www\new-roster-decoder\src\Google\IO\Stream.php on line 128
echo $event->getSummary();
echo $event->getId()."\n\n";
}
}
?>
I am able to delete event from google calendar..
use private key file you get from developer console.
Fore more info check this link
What is the Google API password for the OAuth PKCS p12 private key?
how-where-to-obtain-a-p12-key-file-from-the-google-developers-console
below is code please check
const KEY_FILE = '<<some location on server>>/xxx-65454f656a-xxx-560265d-privatekey.p12';
// this is my private key file location, make sure it accessible
try {
$key = file_get_contents(KEY_FILE);
$auth = new \Google_Auth_AssertionCredentials(
SERVICE_ACCOUNT_NAME,
array('https://www.googleapis.com/auth/calendar'),
$key);
$auth->sub = $calendarId;
$client = new \Google_Client();
$client->setAssertionCredentials($auth);
$client->setApplicationName("Parabola V2");
$client->setClientId(CLIENT_ID);
$service = new \Google_Service_Calendar($client);
$service->events->delete($calendarId, $eventId);
} catch (\Exception $e) {
echo "Exception while deleting event :- ".$e->getMessage();
return null;
}
$service->events->delete('primary', $event->getId());
'primary' must be the calendar id
"myname#gmail.com" or "mhggf54gfh5#group.calendar.google.com"
thats how it work for me