我有一份API文档。我在创建请求签名时遇到问题。我有如何创建签名的以下过程。有人可以通过以下程序帮助我:
生成签名创建签名
Create the canonical zed query string that you need later in this procedure:
Sort the UTF-8 query string components by parameter name with natural byte ordering. The parameters can come from the GET URI or from the POST body (when Content-Type is application/x-www-form-urlencoded).
URL encode the parameter name and values
Concatinate name and values to a single string (eg. var1value1var2value2)
Calculate an RFC 2104-compliant HMAC with the string you just created, your API Access Key as the key, and SHA1 as the hash algorithm.
Make the resulting value base64 encoded.
Use the Resulting value as the value of the Signature request parameter
编辑:
以下是文档中的示例输出:
https://domain.com/api.php?action=checkDomain&version=20090622&keyId=123456& name = glo0000w.com& signature = fvatTFVwRNF1cyH%2Fj%2Flaig8QytY%3D
以下是我尝试做的事情,但它无法正常工作
<?php
$sig = urlencode('actioncheckDomainversion20090622keyId123456nameglo0000w.com');
$sig = hash_hmac('sha1', $sig, '123456');
$sig = base64_encode($sig);
?>
有人可以帮我实现用php生成签名的程序吗?谢谢。
答案 0 :(得分:3)
首先,你没有像你想象的那样按键对参数进行排序。
$p = array(
'action' => 'checkDomain',
'version' => '20090622',
'keyId' => 123456,
'name' => 'glo0000w.com',
);
ksort($p);
$string = '';
foreach($p as $oneKey=>$oneValue)
$string .= urlencode($oneKey) . urlencode($oneValue);
您的另一个问题是致电hash_hmac()
。默认情况下,它返回一个十六进制字符串,并且在base64编码中没有任何意义。此外,结果输出比示例更长。我很确定这是一个错误。
相反,您希望使用可选的第四个参数per the hash_hmac docs和base64编码 值来生成二进制输出:
$hash = hash_hmac('sha1', $string, '123456', true);
$sig = base64_encode($hash);
最后,我怀疑您可能使用了错误的访问密钥进行签名。您使用的keyId
值始终与accessKey
不同。 (除非可能在示例中。)