Shopify Webhooks

orders/paid 比 orders/create 先到是怎么回事

现象#

同步日志里 paid 处理时查不到订单主键,报外键错误;几分钟后 create 才到达,订单状态已是已付款,库存却被扣了两次。

原因#

  • 两个 topic 走不同队列并行投递,网络与消费速度不同,到达顺序没有保证
  • create 在订单生成时发,paid 在付款成功时发,信用卡即时支付时两者间隔不到一秒
  • 手动捕获付款或草稿订单转正式订单时,paid 可能晚很久才来,也可能先到
  • 消费端按到达顺序写库,没有用事件里的时间与状态做条件更新

处理步骤#

  1. paid 到达时先 upsert 订单主记录,再补付款与扣库存字段
  2. 用 updated_at 或 processed_at 做条件更新,旧值不覆盖新值
  3. 以 financial_status 为准判断是否已付,paid 只负责触发通知与扣款
  4. 订单暂不存在时先丢进延迟队列稍后重试,别直接抛错进死信
  5. 在测试店下一笔信用卡测试单,对比两条日志的 X-Shopify-Triggered-At

验收标准#

无论哪条先到,订单表最终只有一行、financial_status 为 paid,库存只扣一次且无外键错误。

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