当前位置: 首页 > 知识库问答 >
问题:

在节点上出现匹配WooCommerce WebHook签名的问题。JS公司

拓拔霄
2023-03-14

我试图在我的Node.js网站上验证来自WooCommerce的网络钩子交易。但是我无法获得匹配的2个字符串。

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

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'

节点中的我的代码。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哈希的方式存在问题。我真的不知道该怎么解决这个问题。

任何帮助都很好,

谢啦

共有1个答案

韩英锐
2023-03-14

使用此处建议的代码,我遇到了与您类似的问题:WooCommerce的SHA256 webhook签名从不验证

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)。

当我改变获取原始身体的方式时,这才开始对我起作用。我使用bodyParser中间件获得它:
应用程序。使用(bodyParser.json({verify:function(req,res,buf){req.rawBody=buf}}}))
(如中所述:https://github.com/expressjs/body-parser/issues/83#issuecomment-80784100)

因此,现在我不使用新的缓冲区(JSON.stringify(body),'utf8')而是使用req。我希望这也能解决你的问题。

 类似资料:
  • 我在node js Express中面临一个问题[因为我是node js的新手]。我的用例是我有三个目录[根目录、路由、html文件]。在根目录中,我有一个包含端口信息的index.js文件,在routes目录中,有一个用于提及API的所有路由的route文件。在html文件中,我有静态html文件+client.js文件。当我转到/api/getlist路由时,我正在发送一个html文件。在该h

  • 问题内容: 考虑以下简单的Node.js应用程序: 它向google.com发出2000个HTTP请求,一个接一个。问题在于它会请求5号并暂停大约3分钟,然后继续处理请求6-10,然后再暂停3分钟,然后再请求11-15,然后暂停,依此类推。 编辑: 我尝试将www.google.com更改为localhost,这是运行我的计算机的极其基本的Node.js应用程序,返回“ Hello world”,

  • 标题说明一切。这是我的代码; 我使用节点强大的文件。 成功上传后,url变量返回s3 url,类似以下内容; 下面是我的参数 我错过了什么?

  • 我添加一个子节点到树视图中的当前父节点。但我的问题是,它将新节点添加到当前父节点的末尾,而不是添加在为true)的位置。 这是我的代码: 当然,、、和都是我的代码中的变量,对于任何for循环,它们都是不同的整数和字符串是树视图节点的名称,是固定字符串循环查找整个树,如果有与给定字符串相等的节点,则保留该节点,否则在树中插入一个空节点,然后递归执行。但为了简单起见,让我们:

  • 我试图上传一个图像使用预先签名的网址 我得到了一个类似的url https://s3.eu-west-1.amazonaws.com/bucket/folder/access.JPG?AWSAccessKeyId=xxxx 我已经尝试上传文件与内容类型图像/jpg,多部分/表单数据。 尝试生成没有文件类型和上传的网址。 尝试了放后法 但似乎什么都不管用 错误总是: 我们计算的请求签名与您提供的签名