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

标签 php node.js wordpress woocommerce

我正在尝试在我的 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/

相关文章:

node.js - TSC 找不到全局对象的名称

php - 向 Woocommerce 3.0 添加股票期权

node.js - JSTUN vs PJNATH

node.js - Express - req.ip 返回 127.0.0.1

php - Wordpress 输入帖子标题后更改永久链接或更改自定义帖子中的选项

wordpress - 如何显示插件激活消息

php - Magento - 扩展相同核心类的多个类

javascript - 将 PHP 变量传递给带有特殊字符的 JavaScript

php - Laravel 中的 Guzzle 不断加载,不返回值

php - 合并两个 phpmysql 查询