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

PHP调用Google Calendar API添加事件遇未授权错误及适配疑问

问题排查与解答

错误原因及修正步骤

你遇到的unauthorized_client错误主要来自两处代码误用,加上权限配置的小问题:

  1. 错误使用setSubject()
    setSubject()是Google Workspace专属的域范围委派功能,个人Gmail账号不支持该操作。你已经把个人日历共享给服务账号,无需设置这个参数,直接删除这行代码:

    $client->setSubject(subjectline);
    
  2. 多余的setAccessType('offline')
    accessType('offline')用于获取用户授权的刷新令牌,服务账号通过JSON密钥直接完成认证,不需要这个设置,删除该行:

    $client->setAccessType('offline');
    
  3. 权限配置优化
    你给服务账号的「修改并管理共享」权限不足以创建事件,应该在日历共享设置里,为服务账号选择**「更改和管理活动」**权限,确保它拥有创建、编辑事件的权限。

修正后的核心代码片段

$serviceAccountFile = "pathtoserviceaccountjson";
$client = new Client();
$client->setApplicationName("Calendar Appointment");
$client->setAuthConfig($serviceAccountFile);
$client->setScopes(Calendar::CALENDAR_EVENTS); // 缩小权限范围到事件操作,更安全
$calendarId = 'Google calendar id';

$service = new Calendar($client);

$event = new Calendar\Event(array(
'summary' => 'Test Event',
'description' => 'Test Event',
'start' => array(
  'dateTime' => '2024-12-06T09:00:00-07:00'
),
'end' => array(
  'dateTime' => '2024-12-06T10:00:00-07:00'
)
));

$event = $service->events->insert($calendarId, $event);

关于服务账号的支持范围

服务账号完全支持个人Gmail账号的日历操作,只要你把个人日历共享给服务账号并赋予合适权限即可。论坛里的矛盾信息大概率是混淆了「域范围委派」(仅Google Workspace可用,用于代操作域内所有账号)和「普通日历共享」(个人账号可用,仅操作共享的特定日历)这两个不同场景。

内容的提问来源于stack exchange,提问作者Eric

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:55:56