以下是我目前掌握的情况:
function sha256(stringToSign, secretKey) {
return CryptoJS.HmacSHA256(stringToSign, secretKey);
}
function getAmazonItemInfo(barcode) {
var parameters =
"Service=AWSECommerceService&"
+ "AWSAccessKeyId=" + appSettings.amazon.accessKey + "&"
+ "Operation=ItemLookup&"
+ "ItemId=" + barcode
+ "&Timestamp=" + Date.now().toString();
var stringToSign =
"GET\n"
+ "webservices.amazon.com\n"
+ "/onca/xml\n"
+ parameters;
var signature = "&Signature=" + encodeURIComponent(sha256(stringToSign, appSettings.amazon.secretKey));
var amazonUrl =
"http://webservices.amazon.com/onca/xml?"
+ parameters
+ signature;
// perform a GET request with amazonUrl and do other stuff
}
当作为HTTP GET请求执行时,上述代码中amazonUrl
的值将导致Amazon发出以下响应:
<?xml version="1.0"?>
<ItemLookupErrorResponse xmlns="http://ecs.amazonaws.com/doc/2005-10-05/">
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you provided.
Check your AWS Secret Access Key and signing method. Consult the service
documentation for details.
</Message>
</Error>
<RequestId>[REMOVED]</RequestId>
</ItemLookupErrorResponse>
有用链接:
3条答案
按热度按时间9nvpjoqh1#
我黑进了你的代码让它工作起来了。
我用于参考的Javascript的标题。
您将需要修改它的一部分,因为我改变了周围的一些参数,不引用您的“应用程序”对象。
对于我所做的修复它(从我能回忆起来)。
1.参数必须按字母顺序排列。我把它们放在一个数组中,然后对它们进行排序。我用“与”符号进行连接。
1.我修改了sha256函数以返回RAW sha256的base64。之前它返回小写的十六进制位,这是不正确的。
1.我本来打算在编码之前添加一个base64,但是现在sha256处理所有的签名。
1.日期格式不正确。它返回的是纪元时间戳而不是字符串时间戳。我拼凑了一个简单的时间戳选项。
这段代码还要求您包含用于CryptoJS的Base64库。
sd2nnvve2#
使用this Node.js library for AWS。它甚至包括专门用于产品广告API的an example。
7jmck4yq3#
在大卫的回答的基础上,我做了一些调整。下面的解决方案使用moment.js和crytpo-js,并且可以用于按关键字搜索项目。我使用amazon scratch-pad来帮助构建目标调用。我注意到以下几点: