无法获取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
相关产品推荐
相关产品推荐

