Shopify HMAC 计算规则

Shopify 的 Webhook 签名不是十六进制。必须使用应用的 Client Secret 作为密钥,并将 HMAC-SHA256 结果编码为 Base64。

const digest = crypto
  .createHmac("sha256", SHOPIFY_API_SECRET)
  .update(rawBody)
  .digest("base64");

const valid = crypto.timingSafeEqual(
  Buffer.from(digest),
  Buffer.from(request.headers["x-shopify-hmac-sha256"] || "")
);

最容易混淆的三个地方

  • 使用 API key,而不是应用的 Client Secret。
  • 输出 Hex,而 Shopify 请求头使用 Base64。
  • 对格式化后的 JSON 验签,而不是收到的原始 Body。

安全处理建议

先完成 HMAC 验证,再解析 JSON 或执行订单逻辑。验签失败应返回 401 或 403,日志中只记录事件类型和失败原因,不记录 Secret、完整顾客信息或完整签名。