首页 > 解决方案 > 我需要将一段 RUBY 转换为 PHP,我需要关于它为什么不起作用的建议

问题描述

重申一下,我得到了以下 RUBY 代码,我需要将其转换为 PHP。我以为我理解了,但是我想出的 PHP 代码没有生成它应该从标题中匹配的字符串。

digest  = OpenSSL::Digest::Digest.new('sha256')
calculated_hmac = Base64.encode64(OpenSSL::HMAC.digest(digest, YOUR_SIGNING_KEY_SECRET, request.raw_post)).strip
calculated_hmac == request.headers["HTTP_X_SENDOWL_HMAC_SHA256"]

这就是我想出的 PHP 等价物,但没有产生预期值。

$keySecret = [REDACTED SECRET KEY];

$raw_post = file_get_contents('php://input');
$calculated = base64_encode(hash_hmac('sha256',$raw_post,$keySecret,true));
$receivedHeaders = getallheaders();

If ($receivedHeaders['X_sendowl_hmac_sha256'] != $calculated)
{
    write_log('Failed matching Headers');

    write_log('Received: '.$receivedHeaders['X_sendowl_hmac_sha256']);
    write_log('Calculated: '.$calculated);
    die('an all too early demise');
}

主动回答几个问题:

#1) 是的,尽管示例是全大写,但我确实在 php 代码中获得了带有该大写字母的标头值。它只是与计算版本不匹配。

#2) 我已经尝试过让hash_hmac返回一个二进制文件(由最终的“true”参数指定)并让它返回其默认值,后者产生一个比标题中的字符串长得多的最终字符串,所以它必须是二进制格式

#3) 我已经验证$raw_post字符串的长度与标头中的Content-Length相同,所以我知道我拥有整个原始帖子,除非 RUBY request.raw_post函数也返回标头信息

提前感谢您的帮助!

所以,我的问题是,我是否遗漏了什么或做了什么明显错误的事情——如果是,请告诉我是什么——或者我应该回到那个人那里

标签: phpruby

解决方案


推荐阅读