API 在函数中生成时无法验证 hmac + base64
API can't validate hmac + base64 when generated in a function
我正在尝试使用函数生成以 base64 编码的 hmac 哈希。但是,端点无法验证该消息。
当我在函数外部生成以 base64 编码的 hmac 散列时,它工作正常。端点验证消息。
这是我在使用函数时所做的(这是我需要但无法使其工作的方式):
function genNonce() {
list($usec, $sec) = explode(" ", microtime());
$nonce = (int)((float)$usec + (float)$sec);
return $nonce;
}
function genMsg($nonce) {
$signature = strtoupper(base64_encode(hash_hmac('sha256', $nonce . $key, $secret, true)));
return $signature;
}
$nonce = genNonce();
$signature = genMsg($nonce);
$auth = Array();
$auth[] = "key: " . $key;
$auth[] = "nonce: " . $nonce;
$auth[] = "signature: " . $signature;
...execute curl...
我尝试在执行函数时调试转储变量,就在执行 curl 之前,它们匹配。所以它似乎正在生成信息并将其发送出去。
这就是我在不使用函数时所做的事情(这就是它的工作原理):
list($usec, $sec) = explode(" ", microtime());
$nonce = (int)((float)$usec + (float)$sec);
$signature = strtoupper(base64_encode(hash_hmac('sha256', $nonce . $key, $secret, true)));
$auth = Array();
$auth[] = "key: " . $key;
$auth[] = "nonce: " . $nonce;
$auth[] = "signature: " . $signature;
...execute curl...
我做错了什么吗?为什么我得到不同的结果?是端点的问题吗API?
编辑:API 返回的错误是 "INVALID_SIGNATURE"。我还尝试采用相同的值并通过 SoapUI 发出请求。使用第一种情况(函数)时出现相同的错误,使用第二种情况(外部函数)时它工作正常。那么,为什么在使用函数时会生成错误的哈希值?
我的错误。
我没有将 $key 和 $secret 传递给 genMsg()。
function genNonce() {
list($usec, $sec) = explode(" ", microtime());
$nonce = (int)((float)$usec + (float)$sec);
return $nonce;
}
function genMsg($nonce, $key, $secret) {
$signature = strtoupper(base64_encode(hash_hmac('sha256', $nonce . $key, $secret, true)));
return $signature;
}
$nonce = genNonce();
$signature = genMsg($nonce, $key, $secret);
我正在尝试使用函数生成以 base64 编码的 hmac 哈希。但是,端点无法验证该消息。
当我在函数外部生成以 base64 编码的 hmac 散列时,它工作正常。端点验证消息。
这是我在使用函数时所做的(这是我需要但无法使其工作的方式):
function genNonce() {
list($usec, $sec) = explode(" ", microtime());
$nonce = (int)((float)$usec + (float)$sec);
return $nonce;
}
function genMsg($nonce) {
$signature = strtoupper(base64_encode(hash_hmac('sha256', $nonce . $key, $secret, true)));
return $signature;
}
$nonce = genNonce();
$signature = genMsg($nonce);
$auth = Array();
$auth[] = "key: " . $key;
$auth[] = "nonce: " . $nonce;
$auth[] = "signature: " . $signature;
...execute curl...
我尝试在执行函数时调试转储变量,就在执行 curl 之前,它们匹配。所以它似乎正在生成信息并将其发送出去。
这就是我在不使用函数时所做的事情(这就是它的工作原理):
list($usec, $sec) = explode(" ", microtime());
$nonce = (int)((float)$usec + (float)$sec);
$signature = strtoupper(base64_encode(hash_hmac('sha256', $nonce . $key, $secret, true)));
$auth = Array();
$auth[] = "key: " . $key;
$auth[] = "nonce: " . $nonce;
$auth[] = "signature: " . $signature;
...execute curl...
我做错了什么吗?为什么我得到不同的结果?是端点的问题吗API?
编辑:API 返回的错误是 "INVALID_SIGNATURE"。我还尝试采用相同的值并通过 SoapUI 发出请求。使用第一种情况(函数)时出现相同的错误,使用第二种情况(外部函数)时它工作正常。那么,为什么在使用函数时会生成错误的哈希值?
我的错误。
我没有将 $key 和 $secret 传递给 genMsg()。
function genNonce() {
list($usec, $sec) = explode(" ", microtime());
$nonce = (int)((float)$usec + (float)$sec);
return $nonce;
}
function genMsg($nonce, $key, $secret) {
$signature = strtoupper(base64_encode(hash_hmac('sha256', $nonce . $key, $secret, true)));
return $signature;
}
$nonce = genNonce();
$signature = genMsg($nonce, $key, $secret);