Shopify Webhooks

一个端点收多个 topic,路由错乱怎么排查

现象#

同一个 /webhooks 地址订了 orders/create 与 products/update,结果商品事件被写进订单表,落库字段大面积为 null。

原因#

  • 路由按 body 里的 id 猜类型,两种资源的 id 都是数字,猜不出真实来源
  • 代码读 req.body.topic,而该字段只在 X-Shopify-Topic header 里,body 中没有
  • 中间件把多个订阅的 body 合并处理,后到的商品事件覆盖了先到的订单事件
  • 用 GraphQL 枚举名 PRODUCTS_UPDATE 匹配,header 是 products/update,永不命中

处理步骤#

  1. 入口第一行读 req.headers['x-shopify-topic'],按它的字符串值分发
  2. 为每个 topic 拆独立路径,例如 /webhooks/orders,减少分支判断
  3. 同时断言 X-Shopify-Shop-Domain 与 X-Shopify-API-Version
  4. 把 topic 与 body 主键写进同一条结构化日志,便于回溯错投
  5. 用 --topic=products/update 触发一次,确认只走商品分支

验收标准#

商品事件只进商品表、订单事件只进订单表,日志里 topic 与目标表名一一对应。

本文由 风格技术 技术团队整理,适用于 Shopify 标准版与 Plus 店铺。Shopify 平台能力迭代较快,具体操作路径与字段以官方文档和店铺后台实际版本为准。