用途:为接收 Zavu 传入消息、投递状态更新或模板审批通知而设置 webhook 端点。webhook 分两类:Sender Webhooks 按发送者配置消息事件(入站、投递状态、模板);Project Webhooks 为项目级事件(合作方邀请),每个项目一个,父项目不会收到子账户事件,需用子账户自己的 API key 配置。
主要事件:message.inbound、conversation.new、message.unsupported(入站);message.queued、message.sent、message.delivered、message.read、message.failed(出站);broadcast.status_changed、template.status_changed、invitation.status_changed、domain.verified、domain.failed。
配置方式:可通过 SDK 创建或更新,如 zavu.senders.create 传入 webhookUrl 与 webhookEvents,或用 zavu.senders.update 修改,zavu.senders.webhookSecret.regenerate 重新生成密钥;secret 仅显示一次,需妥善保存。
负载结构:统一信封包含 id、type、timestamp(Unix 毫秒)、senderId、projectId,事件字段在 data 中。入站消息 data 含 messageId、conversationId、from、to、channel、messageType、text,部分渠道含 providerTimestamp、referral(Click-to-WhatsApp 归因,仅 WhatsApp 首条消息,需及时持久化)。回复场景含 replyToMessageId 等引用字段。可拼接 https://dashboard.zavu.dev/{locale}/inbox?conv={conversationId} 直达收件箱。邮件附件正文只带 text,附件需用 GET /v1/messages/{messageId}/attachments 获取,返回短期有效的 downloadUrl。invitation.status_changed 携带 invitationId、状态前后值、失败原因等,失败非终态,仅在 completed 时做开通处理。
签名验证:请求头 X-Zavu-Signature 形如 t=<unix_seconds>[,v1=<hex>][,v2=<hex>];v1 覆盖 body,v2 覆盖 {t}.{body},为新默认方案。建议优先 v2、回退 v1。步骤:读取原始 body(不要先经 JSON 解析)、解析头部、拒绝与当前时间偏差超过 300 秒的请求,再按对应方案做 HMAC_SHA256 并恒定时间比较。示例以 TypeScript(Express)、Python(Flask)、Go、Ruby(Sinatra)、PHP 给出,均为验证后尽快返回 200 再异步处理,非 2xx 会触发重试。
限制:消息处理失败会重试;conversationId 在线程创建期间可能为 null,可从 conversation.new 或 GET /v1/messages/{messageId} 获取;不适用字段会省略而非置空;具体计费、平台细节及未列出内容暂未提供。