2014-10-01 182 views
3

我想用Feed Api->Sumbit Feed (_POST_INVENTORY_AVAILABILITY_DATA_)亞馬遜提交Feed錯誤

這裏更新亞馬遜量是我的代碼:

$action = 'SubmitFeed'; 
$path = $_SERVER['DOCUMENT_ROOT'].'/resources/amazon_xml/quantity.xml'; 

$feed = '<?xml version="1.0" ?><AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd"> 
       <Header> 
        <DocumentVersion>1.01</DocumentVersion> 
        <MerchantIdentifier>A3QPCC6I4V1QU3</MerchantIdentifier> 
       </Header> 
        <MessageType>Inventory</MessageType> 
        <Message> 
         <MessageID>1</MessageID> 
         <OperationType>Update</OperationType> 
         <Inventory> 
          <SKU>6000013953</SKU> 
          <Quantity>1</Quantity> 
         </Inventory> 
        </Message> 
       </AmazonEnvelope>'; 

$feedHandle = fopen($path, 'rw+'); 
fwrite($feedHandle, $feed); 
rewind($feedHandle); 

$params = array(
        'AWSAccessKeyId' => $data['aws_access_key'], 
        'Action' => $action, 
        'Merchant' => $data['merchant_id'], 
        'SignatureMethod' => "HmacSHA256", 
        'SignatureVersion' => "2", 
        'Timestamp'=> gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time()), 
        'Version'=> "2009-10-01", 
        'MarketplaceIdList.Id.1' => $data['marketplace_id'], 
        'FeedType'=> "_POST_INVENTORY_AVAILABILITY_DATA_", 
        'PurgeAndReplace'=> 'false', 
        'ContentMd5' => base64_encode(md5(stream_get_contents($feedHandle), true)) 
       ); 


     // Sort the URL parameters 
     $url_parts = array(); 
     foreach(array_keys($params) as $key) 
      $url_parts[] = $key . "=" . str_replace('%7E', '~', rawurlencode($params[$key])); 

     sort($url_parts); 

     // Construct the string to sign 
     $url_string = implode("&", $url_parts); 
     $string_to_sign = "GET\nmws.amazonservices.in\n" . $url_string; 

     // Sign the request 
     $signature = hash_hmac("sha256", $string_to_sign, $data['aws_secret_key'], TRUE); 

     // Base64 encode the signature and make it URL safe 
     $signature = urlencode(base64_encode($signature)); 



$url = "https://mws.amazonservices.in" . '?' . $url_string . "&Signature=" . $signature; 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 15); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
    $response = curl_exec($ch); 

     //echo $url;exit; 

     echo '<pre>'; 
     print_r($response); 
     echo '</pre>'; 
     exit; 

但我得到如下回應: -

<ErrorResponse xmlns="https://mws.amazonservices.com/"> 
<Error> 
<Type>Sender</Type> 
<Code>SignatureDoesNotMatch</Code> 
<Message> 
The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details. 
</Message> 
</Error> 
<RequestID>105f88cb-76e2-49c0-9d33-83d6069dd119</RequestID> 
</ErrorResponse> 

可有人請告訴我如何發送一個XML文件到API?或者我做錯了什麼?

quantity.xml文件是正確的

更新: -

代碼是關於Amazon Scratchpad

+0

根據您的代碼,它似乎與您的簽名問題。 – 2014-10-01 10:06:47

+0

@hardiksolanki有什麼不對請告訴我 – 2014-10-01 10:09:21

+0

爲什麼你在捲曲中兩次使用簽名? – 2014-10-01 10:10:03

回答

-1

運行完美你$string_to_sign似乎缺少URL作爲第三行的本地部分。在你的情況下,該部分是空的,所以你只需要一個額外的換行符。

$string_to_sign = "GET\nmws.amazonservices.in\n\n" . $url_string; 
+0

嘗試但同樣的錯誤:( – 2014-10-21 05:59:41

0

亞馬遜AWS的簽名非常變態。 Version 2要求您使用RFC 3986編碼數據

添加查詢字符串組件(名稱 - 值對,不包括最初的問號(?)爲UTF-8字符,也就是每RFC 3986 URL編碼(十六進制字符必須大寫),並使用詞典字節順序進行排序。辭書字節順序是區分大小寫的。

你的問題似乎是與你的簽名的編碼。

$signature = urlencode(base64_encode($signature)); 

這將不符合RFC 3986. PHP有rawurlencode來代替。

$signature = rawurlencode(base64_encode($signature));