Delphi调用Amazon MWS API如何将SHA256 HMAC转为Base64编码
问题根因
你当前的错误是直接将SHA256输出的十六进制文本字符串作为输入做Base64编码,而Amazon MWS要求的是对SHA256计算得到的原始二进制字节流直接做Base64编码,两者编码的输入对象完全不同,因此结果不匹配。
修复方案
先将十六进制的哈希结果转换为原始二进制字节数组,再对字节数组做Base64编码即可。
第一步:添加十六进制转字节数组的辅助函数
function HexToBytes(const HexStr: string): TBytes; var I: Integer; begin SetLength(Result, Length(HexStr) div 2); for I := 0 to High(Result) do Result[I] := StrToInt('$' + Copy(HexStr, I * 2 + 1, 2)); end;
第二步:修正签名转换逻辑
procedure TAppMain.Button1Click(Sender: TObject); var HexSha256: String; Sha256Bytes: TBytes; Base64Sig: String; begin HexSha256 := '9660152e55a7178db9a9521cd80b7f4872f4be2290d1dd0f32205708f2e06589'; // 先转原始字节数组 Sha256Bytes := HexToBytes(HexSha256); // 直接对字节数组做Base64编码,不要编码十六进制字符串 Base64Sig := TNetEncoding.Base64.EncodeBytesToString(Sha256Bytes); // 此时Base64Sig输出为 lmAVLlWnF425qVIc2At/SHL0viKQ0d0PMiBXCPLgZYk= 与预期一致 end;
优化建议
你使用的IPWorks SSL Hash组件支持直接获取哈希计算的原始字节数组输出,不需要先转十六进制字符串再转换回来,直接读取原始字节数组做Base64编码即可,省去多余转换步骤也能避免转换出错。
内容的提问来源于stack exchange,提问作者Steve F
相关产品推荐
相关产品推荐

