7
按文档用 X-Shopify-Hmac-Sha256 和 app secret 做 HMAC-SHA256 校验,算出来的值和请求头永远不等。
按文档用 X-Shopify-Hmac-Sha256 和 app secret 做 HMAC-SHA256 校验,算出来的值和请求头永远不等。
先把判断放在前面:九成是拿「解析后的 JSON」去算,而不是原始请求体;反序列化再序列化会改变空格与顺序。
await request.body() / req.rawBody),不要先 JSON.parse 再 stringify。// Node / Express:必须拿原始 body
app.post('/webhook', express.raw({ type: '*/*' }), (req, res) => {
const hmac = crypto
.createHmac('sha256', process.env.SHOPIFY_API_SECRET)
.update(req.body) // Buffer,不要 toString 后重新 parse
.digest('base64');
const ok = crypto.timingSafeEqual(
Buffer.from(hmac),
Buffer.from(req.get('X-Shopify-Hmac-Sha256') || '')
);
if (!ok) return res.sendStatus(401);
res.sendStatus(200); // 先回 200,业务异步处理
queue.push(JSON.parse(req.body.toString('utf8')));
});
另一个高频原因:框架默认对 body 做了 gzip 解压或字符集转换,算出来的哈希自然不同。Node 里用 express.raw({type:'*/*'}) 挂在路由前最稳。
写下你实际验证过的步骤,比「我也有这个问题」有用得多。当前版本为静态展示,提交后会由团队整理并回复。