局域网私有服务器下PHP对接Google Calendar API问题求助
Google Calendar API对接问题及解决方案
问题描述
我在局域网私有服务器上部署了发票系统,希望开发票时自动将发票编号、付款截止日期等信息添加到Google日历中。遇到以下问题:
- 使用Google Cloud相关配置时,要求网站可公开访问,对小型系统来说成本过高,所以放弃该方案。
- 改用
new Google_Client()方式通过服务账号调用API,事件已成功添加到服务账号的日历中,但管理员账号的目标日历里看不到这些事件。 - 服务账号无法设置密码,无法登录转移日历,目前仅想让管理员账号能看到这些事件。
已实现的代码
添加事件代码
$client = new Google_Client(); $client->setAuthConfig('API_JSON'); $client->setScopes(Google_Service_Calendar::CALENDAR_EVENTS); $service = new Google_Service_Calendar($client); $event = new Google_Service_Calendar_Event(array( 'summary' => 'Tekst', 'description' => 'Tekst', 'start' => array( 'dateTime' => '2023-12-01T09:00:00', 'timeZone' => 'Europe/Warsaw', ), 'end' => array( 'dateTime' => '2023-12-12T17:00:00', 'timeZone' => 'Europe/Warsaw', ), )); $calendarId = 'primary'; // 对应服务账号的主日历 $event = $service->events->insert($calendarId, $event); ?><pre><?php print_r($event); ?></pre><?php echo '事件已添加: ' . $event->htmlLink ;
查询事件代码
$client = new Google_Client(); $client->setAuthConfig('API_JSON'); $client->setScopes(Google_Service_Calendar::CALENDAR_EVENTS); $service = new Google_Service_Calendar($client); $calendarId = 'primary'; // 对应服务账号的主日历 $events = $service->events->listEvents($calendarId); foreach ($events->getItems() as $event) { echo '<br>------------------------<br>'; echo 'ID: ' . $event->getId() . '<br>'; echo '名称: ' . $event->getSummary() . '<br>'; echo '描述: ' . $event->getDescription() . '<br>'; echo '开始时间: ' . $event->getStart()->getDateTime() . '<br>'; echo '结束时间: ' . $event->getEnd()->getDateTime() . '<br>'; echo '------------------------<br>'; }
解决方案
方法1:将管理员的日历共享给服务账号,直接写入管理员日历
- 共享日历:
- 用管理员账号登录Google日历,找到要使用的目标日历,点击「设置和共享」。
- 在「共享特定人员」中,添加服务账号的邮箱(可从API_JSON文件的
client_email字段获取),权限设置为「编辑者」,保存设置。
- 修改代码:
- 把代码中的
$calendarId = 'primary';替换为管理员目标日历的ID(可在日历设置的「集成日历」部分找到,格式类似xxxxxx@group.calendar.google.com或管理员邮箱)。 - 重新运行代码,事件会直接添加到管理员的日历中,管理员可直接查看。
- 把代码中的
方法2:将服务账号的日历共享给管理员账号
如果坚持使用服务账号的日历,可通过API给服务账号的日历添加共享权限:
// 在已初始化的$service对象基础上执行 $rule = new Google_Service_Calendar_AclRule(array( 'scope' => array( 'type' => 'user', 'value' => '管理员邮箱地址', ), 'role' => 'reader', // 可根据需要改为writer )); $calendarId = 'primary'; // 服务账号的主日历 $service->acl->insert($calendarId, $rule);
执行这段代码后,管理员账号登录Google日历就能看到服务账号的日历,进而查看里面的事件。
内容的提问来源于stack exchange,提问作者Kode giki
相关产品推荐
相关产品推荐

