通过默认日历中的 PHP 创建 Google 日历事件,而不是服务帐号日历



为了在 Google 日历中添加活动,我创建了一个 Google 服务帐户,从中获取了客户端 ID、服务帐户名称和 p12 密钥。现在从我的代码来看,它正在创建一个事件,但它创建了自己的新日历来插入带有服务帐户名称的事件。我想在 Google 帐户的默认日历中添加活动。下面是服务帐户事件插入的工作代码。

function calendarize ($title, $desc, $start_datetime, $end_datetime, $gmail_id, $location) 
{
$start_ev_datetime = new DateTime($start_datetime, new DateTimeZone('America/Chicago'));
$start_ev_datetime = $start_ev_datetime->format('c');
$end_ev_datetime = new DateTime($end_datetime, new DateTimeZone('America/Chicago'));
$end_ev_datetime = $end_ev_datetime->format('c');

//Google credentials
$client_id = '**********.apps.googleusercontent.com';
$service_account_name = '*******.iam.gserviceaccount.com';
$key_file_location = '**************.p12';
if (!strlen($service_account_name) || !strlen($key_file_location))
echo missingServiceAccountDetailsWarning();
$client = new Google_Client();
$client->setApplicationName("App Name");
if (isset($_SESSION['token']) && $_SESSION['token']) {
$client->setAccessToken($_SESSION['token']);
if ($client->isAccessTokenExpired()) {
$access_token= json_decode($_SESSION['token']);
$client->refreshToken($access_token->refresh_token);
unset($_SESSION['token']);
$_SESSION['token'] = $client->getAccessToken();
}
}

$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials(
$service_account_name,
array('https://www.googleapis.com/auth/calendar'),
$key
);
$client->setAssertionCredentials($cred);
if($client->getAuth()->isAccessTokenExpired()) {
try {
$client->getAuth()->refreshTokenWithAssertion($cred);
} catch (Exception $e) {
var_dump($e->getMessage());
}
}
$_SESSION['service_token'] = $client->getAccessToken();
$calendarService = new Google_Service_Calendar($client);
$calendarList = $calendarService->calendarList;

//Set the Event data
$event = new Google_Service_Calendar_Event();
$event->setSummary($title);
$event->setDescription($desc);
$event->setLocation($location);
$start = new Google_Service_Calendar_EventDateTime();
$start->setDateTime($start_ev_datetime);
$start->setTimeZone('America/Chicago');
$event->setStart($start);
$end = new Google_Service_Calendar_EventDateTime();
$end->setDateTime($end_ev_datetime);
$end->setTimeZone('America/Chicago');
$event->setEnd($end);
try {
$createdEvent = $calendarService->events->insert('primary', $event);
} catch (Exception $e) {
var_dump($e->getMessage());
}
$acl = $calendarService->acl->listAcl('primary');
$userExistFlag = false;
foreach ($acl->getItems() as $rule) {
if($rule->getId() == 'user:'.$gmail_id){
$userExistFlag = true;
}
}
if(!$userExistFlag){
$scope = new Google_Service_Calendar_AclRuleScope();
$scope->setType('user');
$scope->setValue( $gmail_id );
$rule = new Google_Service_Calendar_AclRule();
$rule->setRole( 'owner' );
$rule->setScope( $scope );
$result = $calendarService->acl->insert('primary', $rule);
}
echo 'Event Successfully Added with ID: '.$createdEvent->getId();
}

请记住,服务帐户不是您。 服务帐户是其自己的虚拟用户。 它有自己的谷歌日历帐户,这就是为什么它在其日历上而不是您的日历上创建事件的原因。

获取服务帐户电子邮件地址,并与服务帐户共享个人日历,就像与 Web 应用程序中的任何其他用户共享日历一样。 与服务帐户共享日历后,它将有权访问它。 记下日历 ID,您将能够使用它来更新日历。

背景信息

$createdEvent = $calendarService->events->insert('primary', $event);

主 捐赠当前经过身份验证的用户的主日历。 那是服务帐户主日历。

相关内容

  • 没有找到相关文章

最新更新