我正在关注我在网上找到的几个例子,我正在尝试重新创建他们在官方API文档here中的签名。但是,我没有生成相同的签名。
他们声明要签名的字符串如下:
GET
webservices.amazon.com
/onca/xml
AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&ItemId=0679722769&Operation=I
temLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReview
s&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&
Version=2009-01-06
它声明“使用上面的字符串使用我们的”虚拟“秘密访问密钥:1234567890,使用SHA256哈希算法计算符合RFC 2104的HMAC。”
我使用以下代码执行此操作:
$private_key = "1234567890";
$string_to_sign = "GET
webservices.amazon.com
/onca/xml
AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&ItemId=0679722769&Operation=I
temLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReview
s&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&
Version=2009-01-06";
$signature = base64_encode(hash_hmac("sha256",$string_to_sign, $private_key, True));
这会产生以下签名:
LM5S6MrycUETu1p94QDnLurKIpwiqKnCxm3B73a0QiE=
亚马逊的签名是:
M/y0+EAFFGaUAp4bWv/WEuXYah99pVsxvqtAuC8YN7I=
我跟随了一些我通过谷歌发现的例子,他们似乎都以同样的方式做到这一点。但是,我无法达到亚马逊获得的相同签名,我无法弄清楚原因。
感谢任何帮助。
答案 0 :(得分:2)
我只是烧了几个小时,试图弄清楚为什么我的签名不匹配。如果这有助于某人出局,请使用OP提到的亚马逊example。我开始在第6步和第7步遇到麻烦。亚马逊说要在你的字符串前面添加以下三行(包括换行符):
Get
webservices.amazon.com
/onca/xml
在我的Windows 7平台上,这是我为这些步骤所做的事情:
$string_to_sign = "AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&AssociateTag=mytag-20&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=Images%2CItemAttributes%2COffers%2CReviews&Service=AWSECommerceService&Timestamp=" . "2014-08-18T12%3A00%3A00Z&Version=2013-08-01";
$prepend = "GET\nwebservices.amazon.com\n/onca/xml\n";
$string_to_sign = $prepend . $string_to_sign;
然后,第8步也让我失望,因为我使用的是样本的密钥:
Secret Access Key: "1234567890"
而不是正确的密钥:
Secret Access Key: 1234567890
希望这些小错误不会烧掉任何其他人。
答案 1 :(得分:1)
您真的在实际代码中拥有所有这些换行符吗?因为I\ntemLookup
与ItemLookup
不同。该GET URI应该是一个长字符串,而不是一个多行字符串。
GET webservices.amazon.com /onca/xmlAWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06
注意它在SAME线上的全部内容