2015-04-23 104 views
1

我試圖提交SubmitFeed請求,亞馬遜的市場,但是當我提出我得到以下錯誤請求:問題計算MD5哈希飼料

the Content-MD5 HTTP header you passed for your feed did not match the Content-MD5 we calculated for your feed

所以我測試的要求上Amazon Marketplace Scratchpad。我在我的XML添加到身體和頭部,並生成以下MD5哈希:

1db3b177e743dc8c0df4dc9eb5c1cbcf

但也有一個Content-MD5 (Base64)頭,這個值:

HbOxd+dD3IwN9NyetcHLzw==

,它似乎是實際發送給Amazon的值 MWS作爲Content-MD5 HTTP標頭,而不是原始MD5哈希值。

我檢查了我的PHP腳本,它正確地生成原始MD5哈希,就像我在md5函數(md5($xml))中包裝我的XML字符串時一樣,得到與Amazon生成的相同的原始MD5哈希。但是如果我在base64_encode函數中包裝,我會得到一個與Amazon列出的Content-MD5(Base64)值完全不同的值。

到目前爲止,我已經試過包裝在base64_encode功能如下:

  • 的原始XML字符串
  • 原始XML字符串的MD5哈希

但沒有得到與Amazon的Content-MD5(Base64)值相同的值。

那麼到底什麼 Amazon Base64編碼才能獲得該值?我試過解碼這個值,但是隻是隨機出現了一些似乎是編碼問題的字符,所以我看不到原始字符串,即亞馬遜的編碼指向正確的方向。

任何指導,將不勝感激。

回答

3

找到解決方案。我決定查看md5函數的文檔,發現有第二個參數來獲取原始輸出的功能,默認爲false。因此,我決定將該標誌設置爲true,並對調用的的結果進行Base64編碼。

Voilà!我獲得了與亞馬遜相同的Base64價值!

使用狂飲,這是我送亞馬遜,現在我得到成功響應:

$xml = trim($xml); 

// For some reason, the time my PHP script is sending is about 20 minutes out 
// from my system time. This fixes that. 
$timestamp = gmdate('c', time() + 1200); 

$url = 'https://mws.amazonservices.co.uk/'; 

$parameters = [ 
    'Action' => 'SubmitFeed', 
    'AWSAccessKeyId' => '#MY_ACCESS_KEY_ID#', 
    'FeedType' => '_POST_PRODUCT_DATA_', 
    'MarketplaceIdList.Id.1' => 'A1F83G8C2ARO7P', # UK marketplace ID 
    'Merchant' => '#MY_SELLER_ID#', 
    'PurgeAndReplace' => 'false', 
    'SignatureMethod' => 'HmacSHA256', 
    'SignatureVersion' => '2', 
    'Timestamp' => $timestamp, 
    'Version' => '2009-01-01', 
]; 

/** 
* Custom class that generates signature for request. 
* 
* @see http://stackoverflow.com/a/29724063/102205 
*/ 
$signature = new Signature($url, $parameters, '#MY_SECRET_ACCESS_KEY#'); 

$parameters['Signature'] = (string) $signature; 

try { 
    $response = $this->client->post($url, [ 
     'headers' => [ 
      'Content-MD5' => base64_encode(md5($xml, true)), 
      'User-Agent' => '#MY_USER_AGENT_STRING#', 
     ], 
     'query' => $parameters, 
     'body' => $xml, 
    ]); 
} catch (\GuzzleHttp\Exception\ClientException $e) { 
    $response = $e->getResponse(); 
} 

return $response->xml(); 

希望這可以幫助其他人!

+0

感謝您的支持!儘管我使用java,但是關於在原始數據上執行base64而不是md5字符串的信息非常有用,並且也解決了我的問題。 – ganta

+0

嗨馬丁豆,我也面臨同樣的問題,但我使用node.js的請求模塊,我使用流星(Javascript)。我已經通過base64編碼的md5content,但得到相同的錯誤。即使我不發送FeddContent中的文件,也不會給它同樣的錯誤。請幫助我解釋這一點,我將對此感謝。它需要3天,但我還沒有找到任何解決方案。我問的問題的鏈接是: - http://stackoverflow.com/questions/40180070/amazon-mws-submitfeed-content-md5-http-header-did-not-match-the-content-md5-calc –