2015-06-09 3 views
0

У меня возникли проблемы с отправкой фида Amazon MWS. Я постоянно получаю следующее сообщение об ошибке: «Invalid query string provided - Keys may not contain &lt;»Amazon MWS Ошибка отправки: Ключи могут не содержать <

Это мой код:

$apicall = $this->build_url($function, $params); 
$ch = curl_init($apicall); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLINFO_HEADER_OUT, true); 
if ($this->xml) { 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, (string)$this->xml); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: text/xml")); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-MD5: " . base64_encode(md5($this->xml)))); 
} 
else { 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: text/xml')); 
} 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
$response = curl_exec($ch); 
$info = print_r(curl_getinfo($ch), true); 
curl_close($ch); 

$apicall формируется на лету и поставляется в виде:

https://mws.amazonservices.com/Feeds/2009-01-01?ASINList.ASIN.1=B00C5XBAOA&AWSAccessKeyId=***&Action=SubmitFeed&FeedType=_POST_PRODUCT_PRICING_DATA_&MWSAuthToken=***&SellerId=***&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2015-06-09T09%3A58%3A01.000Z&Version=2009-01-01&Signature=*** 

(который работает штраф с другими вызовами в отчеты или заказы)

$this->xml хранится как поле «ТЕКСТ» в MySQL db; это образец XML (я добавил строки, чтобы сделать его доступным для чтения):

<?xml version="1.0"?> 
<AmazonEnvelope xsi="http://www.w3.org/2001/XMLSchema-instance" noNamespaceSchemaLocation="amzn-envelope.xsd"> 
    <Header> 
     <DocumentVersion>1.01</DocumentVersion> 
     <MerchantIdentifier>***</MerchantIdentifier> 
    </Header> 
    <MessageType>Price</MessageType> 
    <Message> 
     <MessageID>1</MessageID> 
     <OperationType>Update</OperationType> 
     <Price> 
      <SKU>***</SKU> 
      <StandardPrice currency="USD">33.5</StandardPrice> 
     </Price> 
    </Message> 
</AmazonEnvelope> 

я, кажется, рассмотреть каждую соответствующую ссылку в Интернете, и не могу найти ответ.

Возможно, кто-то может дать мне подсказку, что может пойти не так в вышеуказанном коде?

Спасибо.

ответ

0

Найдено решений себя (после того, как рытье более, что в день):

1) Content-MD5 должна быть рассчитана следующим образом:

base64_encode(md5($this->xml, **true**)); 

(благодаря этому ответу: https://sellercentral.amazon.com/forums/message.jspa?messageID=2767745)

2) Передача параметров заголовка в cUrl должна быть одноразовой, то есть - все заголовки должны передаваться как массив.