我正在尝试向亚马逊商城提交SubmitFeed
请求,但是当我提交请求时,我收到以下错误:
您为Feed传递的Content-MD5 HTTP标头与我们为您的Feed计算的Content-MD5不匹配
所以我在Amazon Marketplace Scratchpad上测试了请求。我将我的XML添加到正文和标题中,并生成以下MD5哈希:
1db3b177e743dc8c0df4dc9eb5c1cbcf
但是还有一个Content-MD5 (Base64)
标题,其值为:
HbOxd + dD3IwN9NyetcHLzw ==
似乎是实际发送到亚马逊的值
MWS作为Content-MD5
HTTP标头,而不是原始MD5哈希。
我已经检查了我的PHP脚本并正确生成原始MD5哈希,就像我在md5
函数(md5($xml)
)中包装我的XML字符串一样,我得到了与亚马逊相同的原始MD5哈希值产生。但是如果我然后在base64_encode
函数中包含 ,我会得到一个完全不同的值,表示亚马逊列出的Content-MD5(Base64)值。
到目前为止,我已尝试在base64_encode
函数中包含以下内容:
但是没有一个产生与Amazon的Content-MD5(Base64)值相同的值。
那么究竟 亚马逊Base64编码才能获得该值?我试过解码这个值,但是只是出现了一大堆随机字符似乎是一个编码问题,所以我看不到亚马逊编码的原始字符串指向正确的方向。
对此有任何指导意见。
答案 0 :(得分:3)
找到解决方案。我决定查看md5
函数的文档,发现有第二个参数来获取函数的原始输出,默认情况下为false
。所以,我决定将该标志设置为true
而将Base64编码为 调用的结果。
瞧!我获得了与Amazon相同的Base64值!
使用Guzzle,这是我发送给亚马逊的内容,我现在得到了成功的回复:
$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();
希望这有助于其他人!