Shopify Webhook无Body接收问题求助(Express模板)
解决Shopify Webhook处理时"No body was received"错误
问题根源
Shopify的shopify.processWebhooks依赖**原始请求Body(Buffer格式)**完成签名验证,若你的Express应用提前通过全局中间件(如express.json()、express.urlencoded())将Body解析为JSON对象或字符串,会导致官方库无法获取到原始Buffer,从而抛出"No body was received"错误。
解决方案
方案1:为Webhook路由单独配置原始Body解析
将Webhook路由与全局Body解析中间件隔离,单独使用express.raw()处理该路由的请求:
// 避免全局使用express.json()/express.urlencoded()处理所有POST请求,或把此路由放在全局解析中间件之前 app.post( shopify.config.webhooks.path, express.raw({ type: 'application/json' }), // 获取原始JSON Buffer shopify.processWebhooks({ webhookHandlers: GDPRWebhookHandlers }) );
方案2:全局解析时保留原始Body
若必须全局使用express.json(),可通过verify钩子将原始Buffer存到请求对象中,供Shopify库读取:
app.use(express.json({ verify: (req, res, buf) => { // 存储原始Buffer到req.rawBody req.rawBody = buf; } })); app.post( shopify.config.webhooks.path, shopify.processWebhooks({ webhookHandlers: GDPRWebhookHandlers }) );
额外检查项
- 确认Webhook订阅的
secret与Shopify配置中的API_SECRET_KEY完全一致,签名验证失败也可能触发类似错误。 - 用日志打印
req.rawBody(方案2)或直接查看请求内容,确认Shopify的Webhook请求确实到达了目标路由且带有Body。
内容的提问来源于stack exchange,提问作者Rodrigo Valladares
相关产品推荐
相关产品推荐

