2015-04-23 71 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 –