You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法获取Shopify Webhook的数据/负载问题求助

解决Shopify Webhook负载获取问题

我之前在基于Node+React搭建Shopify应用时,也遇到过完全一样的问题——其他功能都正常,但就是拿不到Webhook发送的产品JSON数据。结合你提供的信息,咱们一步步来排查解决:

问题复盘

你已经能收到Shopify的Webhook请求(从打印的request header能看出来),但ctx.state.webhook里没有预期的产品数据,核心问题大概率出在请求体解析或者Webhook中间件的逻辑上。

关键解决步骤

1. 确保请求体被正确解析

Shopify的Webhook发送的是JSON格式的POST请求,所以首先要确认你的Koa应用已经加载了koa-bodyparser中间件,而且要在Webhook中间件和路由之前加载,不然请求体还没解析,中间件就拿不到数据。

示例配置代码:

const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const router = require('./your-router-file'); // 你的路由文件

const app = new Koa();

// 先加载bodyParser,确保请求体被解析成JSON
app.use(bodyParser({
  jsonLimit: '1mb' // 根据需要调整,Shopify的产品数据一般不会太大
}));

// 再加载路由
app.use(router.routes());
app.use(router.allowedMethods());

app.listen(3000);

2. 检查Webhook中间件的逻辑

你用的webhook中间件应该负责验证HMAC并把负载存入ctx.state.webhook,如果中间件没正确读取解析后的请求体,就会导致ctx.state.webhook为空。这里给你一个标准的Webhook中间件实现,你可以对照调整:

const crypto = require('crypto');

async function webhook(ctx, next) {
  const hmacHeader = ctx.request.headers['x-shopify-hmac-sha256'];
  const requestBody = ctx.request.body;
  const shopifySecret = process.env.SHOPIFY_APP_SECRET; // 你的Shopify应用密钥,从后台获取

  // 验证HMAC(这一步必须做,不然Shopify会停止发送Webhook)
  const generatedHmac = crypto
    .createHmac('sha256', shopifySecret)
    .update(Buffer.from(JSON.stringify(requestBody), 'utf8'))
    .digest('base64');

  if (generatedHmac === hmacHeader) {
    // 验证通过,把负载存入state
    ctx.state.webhook = requestBody;
    await next();
  } else {
    // HMAC验证失败,返回403
    ctx.status = 403;
    ctx.body = 'Invalid Webhook Signature';
  }
}

module.exports = webhook;

3. 测试验证

  • 先在路由里临时打印ctx.request.body,确认请求体是否已经被解析:
    router.post('/webhooks/products/create', webhook, (ctx) => {
      console.log('Raw request body:', ctx.request.body);
      console.log('Products webhook - create: ', ctx.state.webhook);
    });
    
  • 如果ctx.request.body有数据,那就是中间件的问题;如果还是空,那就是koa-bodyparser没正确加载。
  • 触发Webhook测试:在Shopify后台重新创建一个产品,或者用Shopify的Webhook测试工具(在应用设置的Webhook页面)发送测试请求。

额外注意事项

  • 不要跳过HMAC验证:Shopify会定期验证你的端点是否能正确验证签名,如果多次失败,会停止发送Webhook。
  • 确保ngrok是最新的,有时候旧版本的ngrok会出现请求体丢失的问题。
  • 检查Shopify后台的Webhook配置:确认Webhook的主题(Topic)和你的路由路径完全匹配,API版本也和请求头里的一致。

内容的提问来源于stack exchange,提问作者Finn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:20:01