我一直在尝试更新商品价格,但是在我的代码中似乎无法正常工作。响应说像这样:
我们计算出的请求签名与您提供的签名不匹配。检查您的AWS Secret Access密钥和签名方法。有关详细信息,请查阅服务文档。
对于其他操作,我的签名没有问题,但仅对于submitFeed操作,出现此错误。
这是我在code.gs中写的内容:
function makeUrl_SubmitFeed(object) {
var properties = PropertiesService.getScriptProperties();
var __AWSAccessKeyId__ = properties.getProperty("awsAccessKeyId");
var __SellerID__ = properties.getProperty("sellerId");
var __AWSSecretKey__ = properties.getProperty("awsSecretKey");
var mySku = "abcde-12345";
var feed = '<?xml version="1.0" encoding="utf-8"?>' +
'<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">' +
'<Header><DocumentVersion>1.01</DocumentVersion>' +
'<MerchantIdentifier>' + __SellerID__ + '</MerchantIdentifier>' +
'</Header>' +
'<MessageType>Price</MessageType>' +
'<Message><MessageID>1</MessageID>' +
'<Price>' +
'<SKU>' + mySku + '</SKU>' +
'<StandardPrice currency="JPY">9000</StandardPrice>' +
'</Price>' +
'</Message>' +
'</AmazonEnvelope>';
var fileName = "updateFile.xml"
var file = folder.createFile(fileName, feed, "application/xml");
var blob = file.getBlob();
var md5 = Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, feed));
var __baseurl__ = "https://mws.amazonservices.jp";
var api = "/Feeds/";
var version = "2009-01-01";
var action = "SubmitFeed";
var feedType = "_POST_PRODUCT_PRICING_DATA_";
var method = "POST";
//create params
var params = {};
params["AWSAccessKeyId"] = __AWSAccessKeyId__;
params["Merchant"] = __SellerID__;
params["SignatureVersion"] = "2";
params["SignatureMethod"] = "HmacSHA256";
params["Action"] = action;
params["FeedType"] = feedType;
params["ContentMD5Value"] = md5;
params["MarketplaceIdList.Id.1"] = "A1VC38T7YXB528";
params["Timestamp"] = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'");
params["Version"] = version;
//create signature
var parts = []
parts.push(method);
parts.push("mws.amazonservices.jp");
parts.push("/");
var data = []
for(var key in params){
var value = params[key];
data.push(key + '=' + encodeURIComponent(value));
}
data.sort();
parts.push(data.join("&"));
var sign_data = parts.join("\n");
var signature = Utilities.base64Encode(Utilities.computeHmacSha256Signature(sign_data, __AWSSecretKey__, Utilities.Charset.UTF_8));
data.push('Signature=' + encodeURIComponent(signature));
data.sort();
var url = __baseurl__ + api + version + '?' + data.join("&");
var header = {
"Content-MD5": md5,
"Content-Type": "text/xml",
}
var params = {
headers: {
header: header
},
method: "POST",
payload : blob,
muteHttpExceptions : true,
}
var response = UrlFetchApp.fetch(url, params);
var data = response.getContentText();
var responseCode = response.getResponseCode();
Logger.log(data);
Logger.log(responseCode); //returned 403
}
我已经使用Amazon MWS Scratchpad来检查输出是否有问题,但是我找不到任何东西。
有人可以告诉我我在想什么或做错了吗。
谢谢你。
从For other actions, my signature has no problems, but only for submitFeed operations, I got this error.
,我认为您的脚本中可能需要修改md5哈希值。那么如何修改呢?
var md5 = Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, feed));
var md5 = Utilities
.computeDigest(Utilities.DigestAlgorithm.MD5, feed)
.map(function(byte) {return ('0' + (byte & 0xFF).toString(16)).slice(-2)})
.join('');
Utilities.computeDigest()
中的字节数组被转换为base64。在此修改中,字节数组转换为十六进制的字符串值。此外,以下修改如何?在此修改中,将signature
作为十六进制的字符串值而不是base64检索。
var signature = Utilities.base64Encode(Utilities.computeHmacSha256Signature(sign_data, __AWSSecretKey__, Utilities.Charset.UTF_8));
var signature = Utilities
.computeHmacSha256Signature(sign_data, __AWSSecretKey__, Utilities.Charset.UTF_8)
.map(function(byte) {return ('0' + (byte & 0xFF).toString(16)).slice(-2)})
.join('');