Bókun签名生成遇阻:我遗漏了什么?
我正在尝试对接Bókun Rest API,根据官方文档的签名生成规则:将Date、Access key、HTTP method、Path拼接后,结合密钥计算HmacSHA1值再Base64编码。但我用PHP实现时,签名的Base64结果与测试工具不符,尽管SHA1十六进制输出匹配。
我的PHP实现代码如下:
$access_key = 'my_access_key'; $secret_key = 'my_secret_key'; $method = 'POST'; $path = '/activity.json/search?currency=EUR&lang=FI'; $date = '2022-08-31 12:00:00'; $signature_base = $date . $access_key . $method . $path; $signature = hash_hmac('sha1', $signature_base, $secret_key, true); $signature_sha1 = sha1($signature_base); // 测试用 $signature_base64 = base64_encode($signature); echo $signature_base; // 2022-08-31 12:00:00my_access_keyPOST/activity.json/search?currency=EUR&lang=FI echo $signature_sha1; // 3e81b830958602b54419c61070582519460c36c6 echo $signature_base64; // 5q22t52R0qHk43ssRHs6kyLBSiw=
测试工具输出的Base64为PoG4MJWGArVEGcYQcFglGUYMNsY=,我尝试了hash_hmac第四个参数为true和false的情况都不对,请问问题出在哪里?
问题排查与解决
核心问题出在路径参数的编码处理和签名基串的细节匹配上,具体修正点如下:
路径中的
&需还原为原始&
你代码里的$path使用了HTML实体编码的&,但签名计算必须使用原始的URL参数分隔符&,这会直接改变签名基串的内容,导致HMAC结果偏差。修正后的路径应为:$path = '/activity.json/search?currency=EUR&lang=FI';严格核对签名基串的拼接顺序
再次确认Bókun官方文档的拼接顺序,部分API会要求按HTTP method → Path → Date → Access key的顺序拼接,而非你当前的Date → Access key → HTTP method → Path。顺序错误会直接导致HMAC结果不匹配。验证密钥的原始格式
如果官方提供的secret_key是Base64编码格式,需要先解码再传入hash_hmac,否则计算出的HMAC会错误:$secret_key = base64_decode('your_base64_secret_key');确保日期格式完全一致
检查测试工具使用的日期格式是否和你代码中的完全相同,比如是否带时区、空格是否为半角等,任何细微的格式差异都会影响最终签名结果。
按上述步骤修正后,重新计算签名即可匹配测试工具的输出。
内容的提问来源于stack exchange,提问作者Simon Josef Kok

