Skip to content

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。