Skip to content

13 — 日程推送(HMAC)

第三方将会议/校历等时间盒事件写入平台日程(calendar_*)。
用户侧入口:/api/calendar/**(登录)与手机 ICS 订阅 GET /api/calendar/ics/{token}

待办事项请走 02,不要把日程写入 portal_matter
方案:doc/52-日程管理.md

代码锚点:OpenCalendarControllerOpenCalendarHmacFilter

基路径/api/open/calendar/events
方法:全部为 POST(含删除语义的 /delete)。


1. 鉴权头

与事项相同(见 01-接入准备.md / 02):

Header必填说明
X-Client-IdSSO client_id
X-TimestampUnix
X-SignatureHMAC-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 / dtendUTC yyyy-MM-ddTHH:mm:ss
tzid默认 Asia/Shanghai
allDay0/1
rrule / exdateRFC 5545 原文
summary标题
description / location
statusCONFIRMED/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=0dataeventCode