我正在尝试向亚马逊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上。
答案 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而TStringStream
是TEncoding
- 知道,所以请确保在将字符串编码到正确的字符集之前是哈希,例如:
StringStream := TStringStream.Create(XMLString, TEncoding.UTF8);
最后,TIdHash
有HashString()
(和HashStringAsHex()
)方法,因此您无需手动处理TStream
:
HashString := MessageDigest.HashString(XMLString, IndyUTF8Encoding);