SuperAPI AI 工具集

webflow-webhooks

编程与开发

查看项目

更新于 10-15 15:17

技能介绍

用途

webflow-webhooks 用于接收和验证 Webflow 平台的 Webhook。当需要搭建 Webflow Webhook 处理器、调试签名验证问题,或处理 Webflow 事件(如表单提交、CMS 集合项变更、电子商务订单)时,可使用本技能。

主要能力

本技能提供一套用于处理 Webflow Webhook 的实现参考,核心是签名验证与事件分发。

签名验证(手动实现)

技能给出 JavaScript 实现,使用 Node.js 的 crypto 模块:

  • 校验时间戳,防止重放攻击,时间窗口为 5 分钟(300000 毫秒):若当前时间与请求时间戳之差的绝对值超过该窗口,则返回 false。
  • 生成 HMAC 签名:签名内容为 ${timestamp}:${rawBody},使用 SHA-256 算法,并以十六进制输出。
  • 使用 crypto.timingSafeEqual 进行时间安全比较;若长度不同则捕获异常并返回 false。

代码示例:

const crypto = require('crypto');

function verifyWebflowSignature(rawBody, signature, timestamp, secret) {
  // Check timestamp to prevent replay attacks (5 minute window - 300000 milliseconds)
  const currentTime = Date.now();
  if (Math.abs(currentTime - parseInt(timestamp)) > 300000) {
    return false;
  }

  // Generate HMAC signature
  const signedContent = `${timestamp}:${rawBody}`;
  const expectedSignature = crypto
    .createHmac('sha256', secret)
    .update(signedContent)
    .digest('hex');

  // Timing-safe comparison
  try {
    return crypto.timingSafeEqual(
      Buffer.from(signature),
      Buffer.from(expectedSignature)
    );
  } catch {
    return false; // Different lengths = invalid
  }
}

处理事件

技能提供 Express 示例:使用 express.raw({ type: 'application/json' }) 获取原始请求体,从请求头读取 x-webflow-signature 和 x-webflow-timestamp,缺失任一头部则返回 400。随后使用环境变量 WEBFLOW_WEBHOOK_SECRET 进行签名验证,验证失败返回 400。验证通过后解析 JSON,依据 event.triggerType 分发处理,例如 form_submission、ecomm_new_order、collection_item_created 等,最后始终返回 200 以确认接收。

代码示例:

app.post('/webhooks/webflow', express.raw({ type: 'application/json' }), (req, res) => {
  const signature = req.headers['x-webflow-signature'];
  const timestamp = req.headers['x-webflow-timestamp'];

  if (!signature || !timestamp) {
    return res.status(400).send('Missing required headers');
  }

  // Verify signature (use OAuth client secret or webhook-specific secret)
  const isValid = verifyWebflowSignature(
    req.body.toString(),
    signature,
    timestamp,
    process.env.WEBFLOW_WEBHOOK_SECRET
  );

  if (!isValid) {
    return res.status(400).send('Invalid signature');
  }

  // Parse the verified payload
  const event = JSON.parse(req.body);

  // Handle different event types
  switch (event.triggerType) {
    case 'form_submission':
      console.log('New form submission:', event.payload.data);
      break;
    case 'ecomm_new_order':
      console.log('New order:', event.payload);
      break;
    case 'collection_item_created':
      console.log('New CMS item:', event.payload);
      break;
    // Add more event handlers as needed
  }

  // Always return 200 to acknowledge receipt
  res.status(200).send('OK');
});

常见事件类型

技能列出以下事件及其触发时机与用途:

事件 触发时机 用途
form_submission 站点表单提交 联系表单、线索收集
site_publish 站点发布 清除缓存、触发构建
ecomm_new_order 新电子商务订单 订单处理、库存管理
ecomm_order_changed 订单状态变更 更新履约系统
collection_item_created CMS 项创建 内容联合发布
collection_item_changed CMS 项更新 更新外部系统
collection_item_deleted CMS 项删除 从外部系统移除

环境变量

  • 通过 OAuth 应用创建的 Webhook:WEBFLOW_WEBHOOK_SECRET=your_oauth_client_secret
  • 通过 API 创建(2025 年 4 月之后)的 Webhook:WEBFLOW_WEBHOOK_SECRET=whsec_xxxxx(创建 Webhook 时返回)

本地开发

为进行本地 Webhook 测试,可安装 Hookdeck CLI,然后启动隧道:

npx hookdeck-cli listen 3000 webflow --path /webhooks/webflow

无需账号,提供本地隧道和用于检查请求的 Web UI。

使用方式

按照技能提供的模式:在服务端路由中接收原始请求体;读取签名与时间戳头部;使用对应密钥进行 HMAC 签名验证与时间戳校验;验证通过后解析 payload 并按事件类型分发;最后返回 200 确认接收。

适用场景

  • 设置 Webflow Webhook 处理器
  • 调试签名验证失败问题
  • 处理 form_submission 表单提交事件
  • 处理 Webflow 电子商务订单事件
  • 设置 Webflow CMS 集合项 Webhook

限制与注意事项

  • 通过 Webflow 仪表板创建的 Webhook 不包含签名字段。
  • 只有通过 OAuth 应用或 API 创建的 Webhook 才包含 x-webflow-signature 和 x-webflow-timestamp。
  • 签名验证必须使用原始请求体(raw body),而非解析后的 JSON。
  • 时间戳校验(5 分钟窗口,300000 毫秒)对于防止重放攻击至关重要。
  • 返回 200 状态以确认接收;其他状态会触发重试(最多 3 次)。

相关技能

  • stripe-webhooks:Stripe Webhook 处理,采用类似的 HMAC-SHA256 验证
  • shopify-webhooks:Shopify Webhook 实现
  • github-webhooks:GitHub Webhook 处理
  • webhook-handler-patterns:适用于所有 Webhook 的生产级模式,推荐与本技能配合使用,涵盖处理器顺序、幂等性、错误处理、重试逻辑
  • hookdeck-event-gateway:Webhook 基础设施与可靠性

来源:Webflow 官方文档“Working with Webhooks”与 Webhook Signatures 变更日志。