You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

局域网私有服务器下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:将管理员的日历共享给服务账号,直接写入管理员日历

  1. 共享日历:
    • 用管理员账号登录Google日历,找到要使用的目标日历,点击「设置和共享」。
    • 在「共享特定人员」中,添加服务账号的邮箱(可从API_JSON文件的client_email字段获取),权限设置为「编辑者」,保存设置。
  2. 修改代码:
    • 把代码中的$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:21:31