You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:24:03