Google表格中的Amazon MWS签名不匹配

问题描述 投票:0回答:1

我正在创建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;
}
google-apps-script google-sheets amazon-mws
1个回答
0
投票

除了使用内置的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,并将我的秘密作为密钥。

我希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.