Webhook 返回 200 但业务报错,事件静默丢失怎么查
现象#
端点响应 30ms、日志全是 200,ERP 里却少了几十笔订单;翻应用日志才发现唯一键冲突被 try/catch 吞掉,从未抛出。
原因#
- 只要返回 2xx,Shopify 就认为投递成功不再重试,业务异常被吞等于永久丢事件
- catch 里只写 console.log 不重新抛出,监控上看不到任何错误率
- 先回 200 再异步处理,队列写入失败时没有补偿,事件只存在内存里
- 幂等记录在业务写入之前就提交,失败后重试进来被当成重复直接跳过
处理步骤#
- 把返回 200 的位置挪到「已入队」或「事务已提交」之后,失败一律回
500 - catch 里带上
X-Shopify-Webhook-Id与X-Shopify-Event-Id再抛出 - 幂等记录与业务写入放同一事务,失败一起回滚,别留下孤儿幂等行
- 每天比对
webhook_id入库数与后台订单数,差值超阈值告警 - 人为制造一次唯一键冲突,确认接口回 5xx 并进入重试
验收标准#
入库失败时接口返回 500 且 Logs 显示重试;恢复后同一 Webhook-Id 只成功写入一次。
本文由 风格技术 技术团队整理,适用于 Shopify 标准版与 Plus 店铺。Shopify 平台能力迭代较快,具体操作路径与字段以官方文档和店铺后台实际版本为准。