Sign inGet started

接收 WhatsApp 文档

联系人附加的 PDF、电子表格或任何其他文件,会以携带 document 的入站消息形式到达:其中包含共享媒体引用,以及联系人设备为该文件提供的名称。

入站文档包含的内容

代码示例
{
  "id": "wam_01kyd6s0qfxv8t4k7n1yze6rhc",
  "direction": "inbound",
  "from": { "phone_number": "+14155550100" },
  "to": { "phone_number": "+13124495569" },
  "status": "received",
  "document": {
    "id": "waf_01kyd5p6zs9yju2f0p5rtx8vgb",
    "url": "https://platform.bird.com/v1/whatsapp/messages/wam_01kyd6s0qfxv8t4k7n1yze6rhc/media/waf_01kyd5p6zs9yju2f0p5rtx8vgb",
    "mime_type": "application/pdf",
    "filename": "invoice-A1B2C3.pdf"
  },
  "created_at": "2026-08-25T09:15:02Z"
}
字段包含内容
id已存储的文件,获取字节时作为 media_id 传入
url一个 Bird URL,使用你的 API 密钥获取
mime_typeWhatsApp 报告的该文件的媒体类型,例如 application/pdf
filename发送者为文件指定的名称;如果消息中未携带则为空
caption联系人在文档下方输入的文字;如果未输入则为空
filename 是发送方和接收方用法不同的唯一字段:发送时它是你希望在聊天中显示的名称,在入站消息中则是联系人设备提供的任意值。

获取字节

将消息 ID 和媒体 id 传入渠道的媒体方法。Hub 的获取入站媒体文档包含各语言的调用示例,以及它遵循的重定向和请求头规则,并说明了文件的保留时限。
不要在收到 filename 时直接将其写入磁盘。 它是来自未经身份验证的发送者的攻击者可控文本:可能包含路径分隔符、目录遍历序列、误导性的双重扩展名,或与你已有文件同名的名称。使用媒体 id 生成你自己的存储键,将 filename 仅作为显示标签,并根据 mime_type 而非名称中声称的扩展名来决定如何处理文件。

Webhook 载荷

whatsapp.received 在事件信封上携带 document 分支:
代码示例
{
  "type": "whatsapp.received",
  "timestamp": "2026-08-25T09:15:02.336Z",
  "data": {
    "whatsapp_id": "wam_01kyd6s0qfxv8t4k7n1yze6rhc",
    "workspace_id": "ws_01ky7m235keycbnwyajabe1a6b",
    "direction": "inbound",
    "from": { "phone_number": "+14155550100" },
    "to": { "phone_number": "+13124495569" },
    "document": {
      "id": "waf_01kyd5p6zs9yju2f0p5rtx8vgb",
      "url": "https://platform.bird.com/v1/whatsapp/messages/wam_01kyd6s0qfxv8t4k7n1yze6rhc/media/waf_01kyd5p6zs9yju2f0p5rtx8vgb",
      "mime_type": "application/pdf",
      "filename": "invoice-A1B2C3.pdf"
    },
    "tags": null,
    "metadata": null
  }
}
收集材料的理赔或入驻流程可以在此处根据 mime_type 进行路由并将获取操作加入队列,因为在整个保留时限内字节始终可用。

注意事项

  • mime_type 是 WhatsApp 对文件的报告,不能说明文件内部的实际内容。 对从联系人接收的任何文件进行扫描,并在解析之前验证文件自身的结构。
  • 说明文字和文件名是不同的字段。 联系人在附加文件时输入的备注会填入 captionfilename 仍然来自其设备。

后续步骤