Shopify Webhooks

Webhook 返回 200 但业务报错,事件静默丢失怎么查

现象#

端点响应 30ms、日志全是 200,ERP 里却少了几十笔订单;翻应用日志才发现唯一键冲突被 try/catch 吞掉,从未抛出。

原因#

  • 只要返回 2xx,Shopify 就认为投递成功不再重试,业务异常被吞等于永久丢事件
  • catch 里只写 console.log 不重新抛出,监控上看不到任何错误率
  • 先回 200 再异步处理,队列写入失败时没有补偿,事件只存在内存里
  • 幂等记录在业务写入之前就提交,失败后重试进来被当成重复直接跳过

处理步骤#

  1. 把返回 200 的位置挪到「已入队」或「事务已提交」之后,失败一律回 500
  2. catch 里带上 X-Shopify-Webhook-Id 与 X-Shopify-Event-Id 再抛出
  3. 幂等记录与业务写入放同一事务,失败一起回滚,别留下孤儿幂等行
  4. 每天比对 webhook_id 入库数与后台订单数,差值超阈值告警
  5. 人为制造一次唯一键冲突,确认接口回 5xx 并进入重试

验收标准#

入库失败时接口返回 500 且 Logs 显示重试;恢复后同一 Webhook-Id 只成功写入一次。

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