我正在创建Google表格加载项,其中我正在下载FBA订单。我一直在尝试进行成功的API调用。我可能在这里错过了什么吗?
我得到的答复:
我们计算出的请求签名与您提供的签名不匹配。检查您的AWS Secret Access密钥和签名方法。有关详细信息,请查阅服务文档。
Google Sheet JavaScript代码:
function POSTRequest() {
var config = amazonMWSConfigProperties.getProperty('amazonConfig');
var configData = JSON.parse(config);
var sellerID=configData.sellerID;
var accessKey=configData.accessKey;
var secretKey=configData.secretKey;
var authToken=configData.authToken;
var defaultMarket=configData.defaultMarket;
var url = 'https://mws.amazonservices.in/Orders/2013-09-01?';
var today1 = new Date();
var today = new Date();
var todayTime = Utilities.formatDate(today, "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'");
var yesterday = new Date();
yesterday.setDate(today.getDate() - 1);
yesterday.setHours(0,0,0,0);
var yesterdayTime = Utilities.formatDate(yesterday, "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'");
var dayBeforeYesterday = new Date();
dayBeforeYesterday.setDate(today.getDate() - 2);
dayBeforeYesterday.setHours(0,0,0,0);
var dayBeforeYesterdayTime = Utilities.formatDate(dayBeforeYesterday, "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'");
var unsignedURL =
'POST\nmws.amazonservices.in\n/Orders/2013-09-01\n'+
'AWSAccessKeyId=' +accessKey+
'&Action=ListOrders'+
'&CreatedAfter='+encodeURIComponent(Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'")) +
//'&CreatedBefore=2020-01-18T18%3A30%3A00Z' + //yesterdayTime +
'&FulfillmentChannel.Channel.1=AFN' +
'&MWSAuthToken=' +authToken+
'&MarketplaceId.Id.1=' +defaultMarket+
'&SellerId='+sellerID+
'&SignatureMethod=HmacSHA256'+
'&SignatureVersion=2'+
'&Timestamp='+encodeURIComponent(Utilities.formatDate(today1, "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'")) +
'&Version=2013-09-01';
Logger.log(unsignedURL);
var SignedRequest = calculatedSignature(unsignedURL, secretKey);
var Encoded = Utilities.base64Encode(SignedRequest);
var param = 'AWSAccessKeyId=' +accessKey+
'&Action=ListOrders'+
'&CreatedAfter='+encodeURIComponent(Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'")) +
//'&CreatedBefore=2020-01-18T18%3A30%3A00Z' + //yesterdayTime +
'&FulfillmentChannel.Channel.1=AFN' +
'&MWSAuthToken=' +authToken+
'&MarketplaceId.Id.1=' +defaultMarket+
'&SellerId='+sellerID+
'&Signature='+encodeURIComponent(SignedRequest) +
'&SignatureMethod=HmacSHA256'+
'&SignatureVersion=2'+
'&Timestamp='+encodeURIComponent(Utilities.formatDate(today1, "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'")) +
'&Version=2013-09-01';
Logger.log(url+param);
var result = UrlFetchApp.fetch(url+param);
//writeDataToXML(result);
Logger.log(result);
if (result.getResponseCode() == 200) {
//writeDataToXML(result);
}
}
function calculatedSignature(url,secret) {
var urlToSign = url;
var byteSignature = Utilities.computeHmacSha256Signature(urlToSign, secret);
// convert byte array to hex string
var signature = byteSignature.reduce(function(str,chr){
chr = (chr < 0 ? chr + 256 : chr).toString(16);
return str + (chr.length==1?'0':'') + chr;
},'');
//Logger.log("URL to sign: " + urlToSign);
//Logger.log("");
//Logger.log("byte " + byteSignature);
//Logger.log("");
//Logger.log("reg " + signature);
var byte64 = Utilities.base64Encode(byteSignature)
//Logger.log("base64 byte " + Utilities.base64Encode(byteSignature));
//Logger.log("");
//Logger.log("base64 reg " + Utilities.base64Encode(signature));
Logger.log("base64 reg " + byte64)
return byte64;
}
除了使用内置的encodeURIComponent,我还发现您还必须手动替换某些值。这是我用来编码URL的功能:
/**
* Performs URL encoding compatible with MWS http requests
* @param {String} The string to encode
*/
function urlEncode(str) {
str = encodeURIComponent(str);
str = str.replace(/\*/g, '%2A');
str = str.replace(/\(/g, '%28');
str = str.replace(/\)/g, '%29');
str = str.replace(/'/g, '%27');
str = str.replace(/\!/g, '%21');
return str;
}
我在我的createSignature函数中称呼它:
function createSignature(value, key) {
var signature = Utilities.computeHmacSha256Signature(value, key);
return urlEncode(Utilities.base64Encode(signature));
}
我调用未签名的URL,并将我的秘密作为密钥。
我希望有帮助!