MWS Post Request с помощью Google Scripts - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь отправить запрос через скрипты Google на Amazon для сбора информации.

Мы пытаемся доставить наши заказы в MWS и автоматически перенести их на листы.

Я добрался до последнего шага, который подписывает запрос.

Несколько вещей, в которых я не был уверен:

  1. Говорят, мы используем секретный ключ для хеширования, я вижу только секрет клиента и идентификатор ключа доступа, который я использую?
  2. Должен ли я добавить URL как часть подписи? На MWS Scratch pad они добавляют это, как показано:

POST mws.amazonservices.com /Orders/2013-09-01

Должно ли оно быть в отдельных строках, нужно ли ему отправлять сообщения и все остальное. Это немного неясно .?

  1. Я читал в Интернете, что байт-код sha256 кодируется в base64, а не в строковом литерале, это правда?
  2. Я пытался хэшировать строку, которую мне дал amazon, с помощью онлайн-инструмента и сравнивать ее с хешем, который они предоставили, и кодировкой base64, что совпало. Я тоже пробовал декодировать, ничего не найдено

Может кто-нибудь отправить мне пример, который работает, чтобы я мог понять, что происходит и как это работает?

Спасибо!

Ниже приведено то, что я имею до сих пор:

function POSTRequest() {

  var url = 'https:mws.amazonservices.com/Orders/2013-09-01?';

  var today = new Date();
  var todayTime = ISODateString(today);

  var yesterday = new Date();
  yesterday.setDate(today.getDate() - 1);
  yesterday.setHours(0,0,0,0);
  var yesterdayTime = ISODateString(yesterday); 

  var dayBeforeYesterday = new Date();
  dayBeforeYesterday.setDate(today.getDate() - 2);
  dayBeforeYesterday.setHours(0,0,0,0);
  var dayBeforeYesterdayTime = ISODateString(dayBeforeYesterday); 

  var unsignedURL = 
  'POST\r\nhttps:mws.amazonservices.com\r\n/Orders/2013-09-01\r\n'+
  'AWSAccessKeyId=xxxxxxxxxxx' +
  '&Action=ListOrders'+
  '&CreatedAfter=' + dayBeforeYesterdayTime +
  '&CreatedBefore' + yesterdayTime +
  '&FulfillmentChannel.Channel.1=AFN' +
  '&MWSAuthToken=xxxxxxxxxxxx'+
  '&MarketplaceId.Id.1=ATVPDKIKX0DER' +
  '&SellerId=xxxxxxxxxxx'+
  '&SignatureMethod=HmacSHA256'+
  '&SignatureVersion=2'+
  '&Timestamp='+ ISODateString(new Date) + 
  '&Version=2013-09-0';

  var formData = {
        'AWSAccessKeyId' : 'xxxxxxxxx',
        'Action' : "ListOrders",
        'CreatedAfter' : dayBeforeYesterdayTime,
        'CreatedBefore' : yesterdayTime,
        'FulfillmentChannel.Channel.1' : 'AFN',
        'MWSAuthToken' : 'xxxxxxxxxxxx',
        'MarketplaceId.Id.1' : 'ATVPDKIKX0DER',
        'SellerId' : 'xxxxxxxxxx',
        'SignatureMethod' : 'HmacSHA256',
        'SignatureVersion' : '2',
        'Timestamp' : ISODateString(new Date),
        'Version' : '2013-09-01',
        'Signature' : calculatedSignature(unsignedURL)

      };

   var options = {
     "method" : "post",
     "muteHttpExceptions" : true,
     "payload" : formData
   };


  var result = UrlFetchApp.fetch(url, options);
  writeDataToXML(result);
  Logger.log(result);


  if (result.getResponseCode() == 200) {
  writeDataToXML(result);
  }
}




function calculatedSignature(url) {
var urlToSign = url;
var secret = "xxxxxxxxxxxxxxxxxxx";
var accesskeyid = 'xxxxxxxxxxxxxxx';

  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)); 

 return byte64;
}

1 Ответ

0 голосов
/ 23 января 2019

Шаг 1, создание строки для подписи

string_to_sign представляет собой комбинацию следующего:

  • Строка POST, за которой следуетNEWLINE символ
  • Имя хоста mws.amazonservices.com, за которым следует NEWLINE
  • URL API, часто просто / или что-то вроде /Orders/2013-09-01за которым следует NEWLINE
  • Алфавитный список всех параметров, кроме Signature в кодировке URL, например a=1&b=2, за которым ничего не следует

Кажется, что минимальные параметрыбыть следующим:

  • AWSAccessKeyId - это 20-значный код, предоставляемый Amazon.
  • Action - это имя вашего вызова API, например GetReport
  • SignatureMethod - HmacSHA256
  • SignatureVersion - 2
  • Timestamp - датанапример 20181231T23:59:59Z за одну секунду до нового года UTC
  • Version - это версия API, например 2013-09-01
  • дополнительные параметры может потребоваться для вашего звонка, в зависимости отна значение Action

Обратите внимание:

  • Символ NEWLINE - это просто "\ n", а не "\ r \ n"
  • Имя хоста должно не включать "https://" или" http://"
  • Параметр Signature необходим для фактического вызова позже (см. Шаг 3), но равен не часть string_to_sign.

Ваш string_to_sign теперь должен выглядеть примерно так:

POST
mws.amazonservices.com
/Orders/2013-09-01
AWSAccessKeyId=12345678901234567890&Action=ListOrders&CreatedAfter .... &Version=2013-09-01

Шаг 2, подписание этой строки

  • Рассчитать хэш SHA256 для указанной строки, используя 40-символьный Secret Key
  • Кодировать этот хэш с помощью Base64
  • В псевдокоде: signature = Base64encode( SHA256( string_to_sign, secret_key ))

Шаг 3, отправьте вызов

Отправьте запрос HTTPS POST, используя полный алфавитный список параметров, теперь , включая над подписьюкак Signature где-то посередине, потому что вам нужно сохранить возрастающий алфавитный порядок.

https://mws.amazonservices.com/Orders/2013-09-01?AWSAccessKeyId....Version=2013-09-01

Шаг 4, обработка результата

Вы должны получить две вещи обратно: заголовок ответа и документ XML.Обязательно оцените состояние HTTP в заголовке, а также все содержимое документа XML.Некоторые сообщения об ошибках глубоко скрыты в XML, а HTTP возвращает «200 OK».

Шаг 5, Advanced Stuff

Если вы используете вызовы, требующие отправки документаКак и SendFeed, вам необходимо выполнить следующие дополнительные шаги:

  • Вычислить хеш MD5 вашего документа
  • Кодировать этот хеш с помощью Base64
  • В псевдокоде: contentmd5= Base64encode( MD5( document ))
  • Добавить Content-Type: text/xml (или что угодно, что подходит вашему документу) в качестве заголовка HTTP
  • Добавить Content-MD5: плюс хэш, закодированный в base64, в качестве заголовка HTTP
...