首页 文章

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

提问于
浏览
2

我在网上找到了,我正在尝试重新创建他们在官方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 回答

  • 2

    您真的在实际代码中拥有所有这些换行符吗?因为 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系列上的全部内容

  • 1

    我刚刚烧掉了几个小时的生活,试图弄清楚为什么我的签名不是OP所提到的.1111847_s 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
    

    希望这些小错误不会烧掉任何其他人 .

相关问题