在Delphi Indy10中为Amazon MWS计算base64编码的MD5哈希
我正在尝试向Amazon MWS提交一个提要。问题是Amazon说我提交的Md5哈希与他们的计算不匹配,所以我的请求被拒绝了 这是我用来计算散列的代码:在Delphi Indy10中为Amazon MWS计算base64编码的MD5哈希,delphi,amazon-web-services,delphi-xe2,indy10,Delphi,Amazon Web Services,Delphi Xe2,Indy10,我正在尝试向Amazon MWS提交一个提要。问题是Amazon说我提交的Md5哈希与他们的计算不匹配,所以我的请求被拒绝了 这是我用来计算散列的代码: var StringStream: TStringStream; MessageDigest: TIdHashMessageDigest5; XMLString: string; begin MessageDigest := TIdHashMessageDigest
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.更改此项:
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);
谢谢你的回复。HashString返回一个TArray,我不确定我的转换是否正确。此外,结果字符串应该是base64编码的。下面是代码片段:
HashArray:=MessageDigest.HashString(XMLText,IndyUTF8Encoding);SetString(HashString,PAnsiChar(@HashArray[0]),Length(HashArray));Text编辑。Text:=EncodeBase64(HashString)
EncodeBase64()没有显示作为输入的内容,因此我无法回答转换是否正确。对于大量编辑,我深表歉意,因为我不熟悉注释的格式设置。但是,Indy有自己的base64编码器,通过TidEncoderMie
类,可以直接编码字节数组,而不需要先将其复制到字符串。