首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算的MD5散列

计算的MD5散列
EN

Stack Overflow用户
提问于 2015-04-23 09:58:37
回答 1查看 2.3K关注 0票数 1

我试图向Amazon提交一个SubmitFeed请求,但是当我提交请求时,我会得到以下错误:

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

所以我在亚马逊市场Scratchpad上测试了请求。我将我的XML添加到主体和头中,它生成以下MD5哈希:

1 db3b177e743dc8c0df4dc9eb5c1cbcf

但是也有一个Content-MD5 (Base64)头,具有以下值:

HbOxd+dD3IwN9NyetcHLzw==

这个值实际上是作为Content-MD5 HTTP头发送给Amazon的,而不是原始的MD5哈希。

我已经检查了我的MD5脚本,它正确地生成了原始的MD5哈希,就像我在md5函数(md5($xml))中包装XML时一样,我得到了与md5($xml)生成的原始MD5哈希相同的内容。但是如果我将其封装在base64_encode函数中,就会得到一个完全不同的值,即亚马逊列出的内容--MD5 (Base64)值。

到目前为止,我已经尝试在base64_encode函数中包装以下内容:

  • 原始XML字符串
  • 原始XML字符串的MD5散列。

但是没有一个产生的值与亚马逊的内容-MD5 (Base64)值相同。

那么,获得该值的Amazon 64编码到底是什么呢?我试着解码这个值,但是只是得到了大量的随机字符,这似乎是一个编码问题,所以我看不到Amazon编码的原始字符串为我指明了正确的方向。

如能就此提供任何指导,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-23 10:22:04

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

哇哦!我得到了和亚马逊相同的Base64值!

使用口香糖,这是我发送给亚马逊的东西,现在我得到了成功的回应:

代码语言:javascript
复制
$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();

希望这能帮到别人!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29820014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档