【问题标题】:Issues Matching WooCommerce WebHook signature on Node.JS在 Node.JS 上匹配 WooCommerce WebHook 签名的问题
【发布时间】:2016-12-20 09:13:52
【问题描述】:

我正在尝试在我的 Node.js 网站上验证来自 WooCommerce 的 webhook 交易。但是我无法让 2 个字符串匹配。

可以看到php签名是用下面的代码生成的,源码可以看这里WooCommerce Source

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

我注意到,如果我在 hash_hmac 上关闭 true,然后我可以让 2 个系统创建匹配项,但是我宁愿不编辑 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 散列的方式的问题。我真的无法确切地锻炼如何解决这个问题。

任何帮助都会很棒,

谢谢

【问题讨论】:

  • 你最终弄清楚了吗?我仍在努力让订单更新 webhook 正常触发,之后我怀疑我会遇到这个问题。
  • 我从来没有正确解决丢失匹配加密,我最终修改了 woo commerce 在其核心中创建哈希的方式,这不是最好的解决方案,因为我需要在每次 woo 更新时更新它......如果你已经设法让 2 本地同步,我很想看看代码!
  • @fortuneRice 你运气好吗?
  • 我不得不暂停那个项目,所以我还没到那个阶段。

标签: php node.js wordpress woocommerce


【解决方案1】:

使用此处建议的代码,我遇到了与您类似的问题: 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)。

当我改变获取原始身体的方式时,这才开始对我有用。我使用 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
我希望这也能解决您的问题。

【讨论】:

  • 感谢您的回复!
猜你喜欢
  • 1970-01-01
  • 2022-11-19
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 2021-10-10
  • 2022-12-12
相关资源
最近更新 更多