主题
13 — 日程推送(HMAC)
第三方将会议/校历等时间盒事件写入平台日程(calendar_*)。
用户侧入口:/api/calendar/**(登录)与手机 ICS 订阅 GET /api/calendar/ics/{token}。
待办事项请走 02,不要把日程写入
portal_matter。
方案:doc/52-日程管理.md。
代码锚点:OpenCalendarController、OpenCalendarHmacFilter。
基路径:/api/open/calendar/events
方法:全部为 POST(含删除语义的 /delete)。
1. 鉴权头
与事项相同(见 01-接入准备.md / 02):
| Header | 必填 | 说明 |
|---|---|---|
X-Client-Id | 是 | SSO client_id |
X-Timestamp | 是 | Unix 秒 |
X-Signature | 是 | HMAC-SHA256 Hex |
X-Idempotency-Key | 否 | 可选 |
时间窗 ±300 秒。签名串:{clientId}\n{timestamp}\n{rawBody}。system_code 只取 Client 绑定,请求体不可覆盖。
2. 接口
2.1 POST /api/open/calendar/events/upsert
幂等键:(system_code, externalId)。未传 calendarCode 时自动确保该系统的组织日历(默认全员可见,管理员可改受众)。
| 字段 | 必填 | 说明 |
|---|---|---|
| calendarCode | 否 | 目标日历 |
| externalId | 是 | 第三方业务 ID |
| dtstart / dtend | 是 | UTC yyyy-MM-ddTHH:mm:ss |
| tzid | 否 | 默认 Asia/Shanghai |
| allDay | 否 | 0/1 |
| rrule / exdate | 否 | RFC 5545 原文 |
| summary | 是 | 标题 |
| description / location | 否 | |
| status | 否 | CONFIRMED/TENTATIVE/CANCELLED |
| reminderMinutes | 否 | 门户内提醒提前分钟 |
订阅源(ICS)写入的事件不可用本接口改写。
2.2 POST /api/open/calendar/events/delete
Body:{ "externalId": "..." }。按 (system_code, externalId) 软删。
2.3 POST /api/open/calendar/events/query
按时间窗查询该系统日历内展开后的实例,便于对账。
3. 示例
json
{
"externalId": "meet-20260819-001",
"dtstart": "2026-08-19T01:00:00",
"dtend": "2026-08-19T02:00:00",
"tzid": "Asia/Shanghai",
"summary": "部门周会",
"rrule": "FREQ=WEEKLY;BYDAY=WE;COUNT=12",
"reminderMinutes": 15
}成功:ApiResult.code=0,data 含 eventCode。