Ошибка «HTTP-заголовок Content-MD5, который вы передали для своего канала, не соответствует содержимому MD5, которое мы рассчитали для вашего канала» - PullRequest
2 голосов
/ 27 февраля 2020

Я пытаюсь установить максимальную цену для продукта с помощью Amazon API в среде Django (Python). Я уже решил проблему с вычислением функции md5, значение которой точно такое же, как вычисляет Amazon MWS Scratchpad.

После решения этой проблемы я теперь получаю «HTTP-заголовок Content-MD5, который вы передали для своего канала» не соответствует сообщению об ошибке Content-MD5, которое мы рассчитали для вашего фида.

Мой код выглядит следующим образом:

feedTxt = '<?xml version="1.0" encoding="utf-8"?><AmazonEnvelope xsi:noNamespaceSchemaLocation="amzn-envelope.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Header><DocumentVersion>1.01</DocumentVersion><MerchantIdentifier>MERCH_ID</MerchantIdentifier></Header><MessageType>Price</MessageType><Message><MessageID>1</MessageID><Price><SKU>J1-1UKW-8Z03</SKU><MaximumSellerAllowedPrice currency="EUR">999</MaximumSellerAllowedPrice></Price></Message></AmazonEnvelope>'

feed = open('myXml.xml', mode='w+', buffering=-1, encoding='utf-8')
feed.write(feedTxt)
feed.close()

encodedFeed = feedTxt.strip().encode('utf-8')

md5 = hashlib.md5(encodedFeed).digest()
encodedMd5 = base64.b64encode(md5)
parsedMd5 = urllib.parse.quote(encodedMd5, safe='')

request_string = construct_strings(seller, '', 'SubmitFeed', '2009-01-01', args_dict) # this function defines the string to be signed and is working 100%, since I use it for all the other requests I do

feed = open('myXml.xml', mode='r', buffering=-1, encoding='utf-8')
myFile = {'file': feed}
response = requests.post(request_string, headers = {'Content-MD5': encodedMd5, 'Content-Type': 'text/xml'}, files = myFile)            
feed.close()

Это мой первый вопрос, заданный здесь в stackOverflow. Я ценю любые советы, которые вы можете дать мне.

Спасибо!

1 Ответ

0 голосов
/ 06 марта 2020

Просто чтобы сказать вам, что я решил свою проблему. Я обнаружил, что канал должен быть опубликован не в виде файла, а в теле (поле «данные»). Поэтому (среди множества других исправлений) окончательный код:

feed = '<?xml version="1.0" encoding="utf-8"?><AmazonEnvelope xsi:noNamespaceSchemaLocation="amzn-envelope.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Header>'
feed += '<DocumentVersion>1.01</DocumentVersion><MerchantIdentifier>A3RVNLI4ZWO9K4</MerchantIdentifier></Header><MessageType>Price</MessageType><Message><MessageID>1</MessageID>'
feed += '<Price><SKU>sa400240g</SKU><MaximumSellerAllowedPrice currency="EUR">975</MaximumSellerAllowedPrice></Price></Message></AmazonEnvelope>'

encodedFeed = feed.encode('utf-8')
md5 = hashlib.md5(encodedFeed)
encodedMd5 = base64.b64encode(md5.digest())
parsedMd5 = urllib.parse.quote(encodedMd5, safe='')                       

request_string = construct_strings(seller, '', 'SubmitFeed', '2009-01-01', args_dict)
myHeader = {'Content-MD5': encodedMd5.decode('utf-8'), 'Content-Type': 'text/xml'}
response = requests.post(request_string, headers = myHeader, data = feed)

Спасибо, в любом случае! Надеюсь, что это решение поможет кому-то с такой же проблемой!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...