用途:实现 Intercom 传入 Webhook(通知)处理与出站数据事件追踪。传入 Webhook 把会话与联系人变更推送到自建端点;出站数据事件把自定义活动推入 Intercom,用于分群与消息触达。完整可复制代码位于 references/ 目录,本文件只做流程概述。
前置条件:可公网访问的 HTTPS 端点;Intercom Developer Hub 提供的 Webhook secret 与 access token;已安装 intercom-client SDK;推荐用 Redis 或数据库做幂等。
认证:两类凭据均从环境变量读取,禁止硬编码。传入 Webhook 用 INTERCOM_WEBHOOK_SECRET 校验,Intercom 以 HMAC-SHA1 在 X-Hub-Signature 头签名,需对原始请求体重算摘要并用 crypto.timingSafeEqual 比较,缺失或校验失败一律拒绝。出站事件用 Bearer INTERCOM_ACCESS_TOKEN 传给 IntercomClient。
使用方式:创建 Express 路由,用 express.raw 捕获原始 body,校验签名后在 5 秒内返回 200,先响应再异步处理;将载荷建模为 notification_event 信封(含 topic、id、data.item);按 topic 通过 handler map 分发,未知 topic 记录并跳过而非抛错;用 Redis SET NX 以 notification.id 加锁防重复处理,失败时释放锁以允许重试;出站用 client.dataEvents.create 提交过去式动词-名词的 eventName、Unix 时间戳 createdAt、联系人外部 userId 及可选 metadata;无批量接口,需自行限流并统计成功/失败。
输出:签名校验端点有效时返回 200 {"received": true},无效返回 401;按 topic 记录 Processed <topic>: <id>;重复投递记录 Duplicate webhook skipped: <id>;出站事件出现在联系人时间线,批量返回 { succeeded, failed }。
限制:Webhook 失败后约 1 分钟重试一次;响应超 5 秒视为失败;event 被拒(422)多因 user_id 或 event_name 无效;新增 topic 无处理器时仅记录。性能优化见 intercom-performance-tuning 技能。