我正在尝试在我的 Node.js 网站上验证来自 WooCommerce 的 webhook 交易。但是我无法让 2 个字符串匹配。
可以看到php签名是用下面的代码生成的,源码可以在这里查看WooCommerce Source .
base64_encode( hash_hmac( $hash_algo, $payload, $this->get_secret(), true ) ));
我注意到,如果我关闭 hash_hmac
上的 true
,我就可以让 2 个系统创建匹配,但我不想编辑核心WooCommerce,所以我想知道我是否在这里遗漏了一些东西?
对于我的示例,我确实编辑了核心并强制有效负载如下,这样我就可以轻松尝试并匹配两个系统
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 和 Node 进行 SHA256 哈希的方式存在问题。我真的无法弄清楚如何解决这个问题。
任何帮助都会很棒,
谢谢
最佳答案
我使用此处建议的代码遇到了与您类似的问题: SHA256 webhook signature from WooCommerce never verifies
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;
}
(body 来自 req.body)。
当我改变了获取原始 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
我希望这也能解决您的问题。
关于php - Node.JS 上的 WooCommerce WebHook 签名匹配问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38933495/