在Delphi Indy10中计算亚马逊MWS的base64编码MD5哈希值

时间:2013-05-17 14:28:13

标签: delphi amazon-web-services delphi-xe2 indy10

我正在尝试向亚马逊MWS提交Feed。问题是亚马逊说我提交的Md5哈希与他们的计算不符,所以我的请求被拒绝了。

这是我用来计算哈希值的代码:

    var
        StringStream: TStringStream;
        MessageDigest: TIdHashMessageDigest5;
        XMLString: string;
    begin
        MessageDigest := TIdHashMessageDigest5.Create;
        StringStream := TStringStream.Create;
        try
            StringStream.WriteString(XMLString);
            HashString := MessageDigest.HashStream(StringStream);

        finally
            StringStream.Free;
            MessageDigest.Free;
        end;
    end;

这是亚马逊的回应:

    <ErrorResponse xmlns="http://mws.amazonaws.com/doc/2009-01-01/">
        <Error>
            <Type>Sender</Type>
            <Code>ContentMD5DoesNotMatch</Code>
            <Message>the Content-MD5 HTTP header you passed for your feed (H3GnH3X3H3auHZ0mGZ8mD4KvE30mEJauHKD6E3GoDqK) did not match the Content-MD5 we calculated for your feed (fSEMn6SCuSia5YVdz/1NqQ==)</Message>
            <Detail />
        </Error>
        <RequestID>9c3e0b2a-c418-41dc-b733-e55ac01343b1</RequestID>
    </ErrorResponse>

计算base64编码的MD5哈希的正确方法是什么?我的代码有问题吗?

提前感谢您,并致以问候。

P上。

1 个答案:

答案 0 :(得分:2)

改变这个:

StringStream := TStringStream.Create;
try
  StringStream.WriteString(XMLString);

对此:

StringStream := TStringStream.Create(XMLString);

或者这个:

StringStream := TStringStream.Create;
try
  StringStream.WriteString(XMLString);
  StringStream.Position := 0;

无论哪种方式,还要记住,在XE2中,String是unicode而TStringStreamTEncoding - 知道,所以请确保在将字符串编码到正确的字符集之前是哈希,例如:

StringStream := TStringStream.Create(XMLString, TEncoding.UTF8);

最后,TIdHashHashString()(和HashStringAsHex())方法,因此您无需手动处理TStream

HashString := MessageDigest.HashString(XMLString, IndyUTF8Encoding);