Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Amazon Marketplace提要的MD5哈希计算问题_Php_Base64_Md5_Amazon Mws_Amazon Marketplace - Fatal编程技术网

Php Amazon Marketplace提要的MD5哈希计算问题

Php Amazon Marketplace提要的MD5哈希计算问题,php,base64,md5,amazon-mws,amazon-marketplace,Php,Base64,Md5,Amazon Mws,Amazon Marketplace,我正试图向Amazon Marketplace提交一个SubmitFeed请求,但当我提交请求时,出现以下错误: 为提要传递的Content-MD5 HTTP头与我们为提要计算的Content-MD5不匹配 所以我在网上测试了这个请求。我将XML添加到正文和标题中,它将生成以下MD5哈希: 1db3b177e743dc8c0df4dc9eb5c1cbcf 但是还有一个Content-MD5(Base64)标题,其值为: HbOxd+dD3IwN9NyetcHLzw== 而实际上发送给亚马逊的似乎

我正试图向Amazon Marketplace提交一个
SubmitFeed
请求,但当我提交请求时,出现以下错误:

为提要传递的Content-MD5 HTTP头与我们为提要计算的Content-MD5不匹配

所以我在网上测试了这个请求。我将XML添加到正文和标题中,它将生成以下MD5哈希:

1db3b177e743dc8c0df4dc9eb5c1cbcf

但是还有一个
Content-MD5(Base64)
标题,其值为:

HbOxd+dD3IwN9NyetcHLzw==

而实际上发送给亚马逊的似乎就是这个值 MWS作为
Content-MD5
HTTP头,而不是原始MD5哈希

我已经检查了我的PHP脚本,它正确地生成了原始MD5哈希,就像我在
MD5
函数(
MD5($XML)
)中包装XML字符串一样,我得到了与Amazon生成的相同的原始MD5哈希。但是如果我将其包装在
base64\u encode
函数中,我会得到一个完全不同的值,即Amazon为Content-MD5(base64)值列出了什么

到目前为止,我已尝试在
base64\u encode
函数中包装以下内容:

  • 原始XML字符串
  • 原始XML字符串的MD5哈希
但是没有一个能产生与亚马逊Content-MD5(Base64)相同的价值

那么,Amazon Base64编码到底是什么来获取该值的呢?我试着解码这个值,但只是得到了一个随机字符的负载,这似乎是一个编码问题,所以我看不到原始字符串,亚马逊的编码指向我的正确方向


如果您对此有任何指导,我们将不胜感激。

找到了解决方案。我决定查看
md5
函数的文档,发现有第二个参数用于获取函数的原始输出,默认情况下为
false
。因此,我决定将该标志设置为
true
,并对该调用的结果进行Base64编码

瞧!我得到了与亚马逊相同的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();

希望这对其他人有帮助

谢谢你!虽然我使用的是java,但您关于在原始数据上执行base64而不是md5字符串的信息非常有用,也解决了我的问题。嗨,Martin Bean,我也面临同样的问题,但我使用的是node.js的请求模块,我使用的是Meteor(Javascript)。我已通过base64编码的md5content,但收到相同的错误。即使我没有发送FeddContent中的文件,它也给了我同样的错误。请帮助我,我将为此感谢你。花了三天时间,但我还没有找到任何解决办法。我提问的链接是:-