Подпись API MWS не соответствует R - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь получить данные из API Amazon MWS с помощью операции GetMatchingProductForId.Когда я использую Amazon MWS Scratchpad, он работает отлично.

Я сейчас пытаюсь скопировать URL-адреса, отправленные в запросе HTTP POST, но я получаю сообщение об ошибке Signature.Мне нужно понять, как должен быть структурирован URL-запрос.

Ниже приведена подробная информация о запросе в Amazon MWS Scratchpad. Я анонимизировал частные идентификаторы, но это единственное, что я изменил:

HTTPPOST

POST /Products/2011-10-01?AWSAccessKeyId=ANONYMIZED
&Action=GetMatchingProductForId
&SellerId=ANONYMIZED
&SignatureVersion=2
&Timestamp=2018-09-28T05%3A45%3A43Z
&Version=2011-10-01
&Signature=ANONYMIZED
&SignatureMethod=HmacSHA256
&MarketplaceId=A13V1IB3VIYZZH
&IdType=EAN
&IdList.Id.1=9781933988665 HTTP/1.1
Host: mws.amazonservices.fr
x-amazon-user-agent: AmazonJavascriptScratchpad/1.0 (Language=Javascript)
Content-Type: text/xml

Строка для подписи

POST
mws.amazonservices.fr
/Products/2011-10-01
AWSAccessKeyId=ANONYMIZED&Action=GetMatchingProductForId&IdList.Id.1=9781933988665&IdType=EAN&MarketplaceId=A13V1IB3VIYZZH&SellerId=ANONYMIZED&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2018-09-28T05%3A45%3A43Z&Version=2011-10-01

=======

Теперь мой вопрос (и давайте представим, что моя подпись была создана правильно)из HTTP POST, как должен выглядеть запрос?Вот моя попытка:

https://mws.amazonservices.fr/Products/2011-10-01?AWSAccessKeyId=ANONYMIZED&Action=GetMatchingProductForId&SellerId=ANONYMIZED&SignatureVersion=2&Timestamp=2018-09-28T05%3A52%3A33Z&Version=2011-10-01&Signature=ANONYMIZED&SignatureMethod=HmacSHA256&MarketplaceId=A13V1IB3VIYZZH&IdType=EAN&IdList.Id.1=9781933988665

Но как насчет escape-символов '\ n', которые находятся в блокноте?и что насчет 'HTTP/1.1' в конце, я должен включить это также?

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

HTTP/1.1 обычно создается вашей клиентской библиотекой http.Я не знаком с R, но я погуглил и, похоже, есть пакет CURL для R .CURL - это стандартная библиотека http для многих языков, включая PHP.Мой PHP-код для отправки XML-фида через curl выглядит следующим образом:

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, 'https://mws.amazonservices.fr/Products/2011-10-01?.....your data and signature here...');
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POSTFIELDS, $xmlcontent);
curl_setopt($ch,CURLOPT_HTTPHEADER, array(
    "Content-Type: text/xml",
    "Content-MD5: ".base64_encode(md5($xmlcontent,true)),
    "x-amazon-user-agent: TestScript/0.01")
);
$result = curl_exec($ch);
curl_close($ch);

Глядя на this , мне кажется, это должно быть легко перенесено в интерфейс R для CURL.

0 голосов
/ 28 сентября 2018

У меня нет учетной записи MWS, поэтому я не могу проверить следующее, но это один из способов сделать это:

# set this to your python2 binary; you'll need to do
#   pip2 install boto
# from a command-line before using this code
Sys.setenv("RETICULATE_PYTHON"="/usr/bin/python2.7") 

library(reticulate)

boto_mws_connection <- import("boto.mws.connection")

con <- boto_mws_connection$MWSConnection(
  aws_access_key_id = ACCESS_KEY
  aws_secret_access_key = AWS_SECRET
  Merchant = MERCHANT_ID
)

con$get_matching_product_for_id(
  MarketplaceId = "A13V1IB3VIYZZH",
  IdType = "EAN",
  IdList = c("9781933988665")
)
...