我正在尝试验证来自开发环境的 Shopify webhook 发送的 hmac 代码。然而,Shopify 不会向非实时端点发送 webhook 的 post 请求,因此我使用 requestbin 捕获请求,然后使用 postman 将其发送到我的本地 web 服务器。
从 Shopify documentation 中,我似乎做了一切正确的事情,并且还尝试了应用 node-shopify-auth verifyWebhookHMAC function 中使用的方法。但是这些都没有起作用。 代码从未匹配过。 我在这里做错了什么?
验证 webhook 的代码:
从 Shopify documentation 中,我似乎做了一切正确的事情,并且还尝试了应用 node-shopify-auth verifyWebhookHMAC function 中使用的方法。但是这些都没有起作用。 代码从未匹配过。 我在这里做错了什么?
验证 webhook 的代码:
function verifyWebHook(req, res, next) {
var message = JSON.stringify(req.body);
//Shopify seems to be escaping forward slashes when the build the HMAC
// so we need to do the same otherwise it will fail validation
// Shopify also seems to replace '&' with \u0026 ...
//message = message.replace('/', '\\/');
message = message.split('/').join('\\/');
message = message.split('&').join('\\u0026');
var signature = crypto.createHmac('sha256', shopifyConfig.secret).update(message).digest('base64');
var reqHeaderHmac = req.headers['x-shopify-hmac-sha256'];
var truthCondition = signature === reqHeaderHmac;
winston.info('sha256 signature: ' + signature);
winston.info('x-shopify-hmac-sha256 from header: ' + reqHeaderHmac);
winston.info(req.body);
if (truthCondition) {
winston.info('webhook verified');
req.body = JSON.parse(req.body.toString());
res.sendStatus(200);
res.end();
next();
} else {
winston.info('Failed to verify web-hook');
res.writeHead(401);
res.end('Unverified webhook');
}
}
接收请求的路由:
router.post('/update-product', useBodyParserJson, verifyWebHook, function (req, res) {
var shopName = req.headers['x-shopify-shop-domain'].slice(0, -14);
var itemId = req.headers['x-shopify-product-id'];
winston.info('Shopname from webhook is: ' + shopName + ' For item: ' + itemId);
});