当请求 url 包含“!”时,亚马逊产品广告 API 返回“SignatureDoesNotMatch”

Posted

技术标签:

【中文标题】当请求 url 包含“!”时,亚马逊产品广告 API 返回“SignatureDoesNotMatch”【英文标题】:Amazon Product Advertising API returns "SignatureDoesNotMatch" when request url contains "!" 【发布时间】:2012-01-12 03:33:44 【问题描述】:

我制作了一个使用亚马逊产品广告 API 的 VBA 程序。通常它运行良好,但是当请求 url 包含 !( 时,API 会返回错误代码 SignatureDoesNotMatch。但是,我的程序发送的签名和 URL 与 http://associates-amazon.s3.amazonaws.com/signed-requests/helper/index.html 生成的完全一样(所以生成的 url 也会出错)。

错误是由(, ), *, !'引起的。

@ / [ ] + - = . , : ; \ | _ ? " # $ % & ^ ~ `不要。 (似乎他们只是被忽略了。)

从参数中删除这些字符是一种解决方案。但如果有人知道问题的原因和/或更好的解决方案,请告诉我。

The program is here.入口点是“main.searchBookInfo”,“helper.getSignature”生成签名。

示例:

未签名的网址:

http://ecs.amazonaws.jp/onca/xml?AWSAccessKeyId=AKIAIL7NZCKP32A32LQQ&AssociateTag=attentiveada-20&Author=&Operation=ItemSearch&Publisher=&ResponseGroup=ItemAttributes&SearchIndex=Books&Service=AWSECommerceService&Timestamp=2011-12-03T20%3A26%3A16%2B0900&Title=! &Version=2011-08-01

要签名的字符串:

获取
ecs.amazonaws.jp
/onca/xml
AWSAccessKeyId=AKIAIL7NZCKP32A32LQQ&AssociateTag=attentiveada-20&Author=&Operation=ItemSearch&Publisher=&ResponseGroup=ItemAttributes&SearchIndex=Books&Service=AWSECommerceService&Timestamp=2011-12-03T20%3A26%3A16%2B0900&Title=!&Version=2011-08-01

签名:

fmQKEfrtYkdWoJNHUryWIPoybM%2FqzOdFFmlgrQkBS2E%3D

【问题讨论】:

请在您的问题正文中包含相关代码sn-ps,而不是链接到场外。让您的问题自成一体。 抱歉,感谢您的建议。下次我会更小心的。 【参考方案1】:

我能够通过 not! 字符进行编码来重现此 (SignatureDoesNotMatch)。因此,我假设如果您在签名之前对 ! 字符进行编码,那么这将起作用。其他角色可能也是如此,虽然我没有测试它们。

仅供参考,当使用! 作为Title 参数进行ItemSearch 操作时,我确实得到了结果。

【讨论】:

谢谢你,乔纳森。我发现我正在使用的 javascript 组件没有对 Amazon API 期望编码的 !、(、) 和 * 进行编码。所以我像这样替换它们:Function urlEncode(str As String) As String Dim sc As Variant Set sc = CreateObject("ScriptControl") sc.Language = "Jscript" urlEncode = Replace(Replace(Replace(Replace(sc.CodeObject.encodeURIComponent(str), "!", "%21"), "(", "%28"), ")", "%29"), "*", "%2A") End Function 然后包含这些字符的请求有效。遗憾的是,它们的结果与我从请求字符串中省略这些字符时的结果相同。

以上是关于当请求 url 包含“!”时,亚马逊产品广告 API 返回“SignatureDoesNotMatch”的主要内容,如果未能解决你的问题,请参考以下文章

[当尝试解析亚马逊产品时,我的请求有时会重定向到其他页面

对亚马逊产品广告 API 的 Java REST 请求失败

如何使用亚马逊的产品广告 API 获取运输信息

我没有通过亚马逊产品广告 API 获得价格

通过 Java/SOAP 的亚马逊产品广告 API

没有亚马逊产品广告 API 的亚马逊 ASIN 到 ISBN