在Node.JS上匹配WooCommerce WebHook签名的问题

我试图validation从我的Node.js网站WooCommerce的webhook交易。 但是我不能得到2个string匹配。

我可以看到,使用下面的代码生成的PHP签名,源可以在这里查看WooCommerce源 。

base64_encode( hash_hmac( $hash_algo, $payload, $this->get_secret(), true ) )); 

我已经注意到,如果我closureshash_hmac上的hash_hmac ,那么我可以得到2个系统来创build一个匹配,但我宁愿不编辑WooCommerce的核心,所以我想知道是否有什么我在这里失踪?

对于我的例子,我编辑了核心,并强制有效载荷是以下,只是我可以轻松地尝试和匹配的2个系统

 payload = '{"id":1,"etc":2,"host":"http:/\/localhost\/view-order\/8"}' secret = 'welcome' 

我在Node.Js中的代码如下。

 var crypto = require('crypto'); hmac = crypto.createHmac('sha256', secret); hmac.setEncoding('binary'); hmac.write(payload); hmac.end(); hash = hmac.read(); result = base64.encode(hash); console.log(result); 

如果我从“主机”JSON中删除url,那么它确实有效,这是否与它被转义的方式有关? 我认为这可能是PHP和节点执行SHA256哈希的方式的一个问题。 我真的不能解决这个问题。

任何帮助将是伟大的,

谢谢

我遇到了类似的问题,使用这里build议的代码: WooCommerce的SHA256 webhook签名从不validation

 var processWebHookSignature = function (secret, body, signature) { signatureComputed = crypto.createHmac('SHA256', secret) .update(new Buffer(JSON.stringify(body), 'utf8')) .digest('base64'); return ( signatureComputed === signature ) ? true : false; } 

(身体来自req.body)

当我改变我获得原始身体的方式时,这才开始为我工作。 我使用bodyParser中间件:
app.use(bodyParser.json({verify:function(req,res,buf){req.rawBody=buf}}))
(如在https://github.com/expressjs/body-parser/issues/83#issuecomment-80784100中解释的)

所以现在,而不是使用new Buffer(JSON.stringify(body), 'utf8')我只是使用req.rawBody
我希望这也能解决你的问题。