使用PHP的亚马逊广告API无法生成正确的签名

时间:2014-02-09 18:53:57

标签: php amazon-web-services amazon

我正在关注我在网上找到的几个例子,我正在尝试重新创建他们在官方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=

我跟随了一些我通过谷歌发现的例子,他们似乎都以同样的方式做到这一点。但是,我无法达到亚马逊获得的相同签名,我无法弄清楚原因。

感谢任何帮助。

2 个答案:

答案 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\ntemLookupItemLookup不同。该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线上的全部内容