Delphi 亚马逊MWS签名-德尔福

Delphi 亚马逊MWS签名-德尔福,delphi,delphi-xe3,amazon-mws,Delphi,Delphi Xe3,Amazon Mws,为了在多个店面之间进行同步,我用Delphi编写了一个应用程序。 说到签名,我似乎遇到了一个问题。我的设想是: 当我为Amazon运行Orders API时,它将接受签名并成功下载所有订单。说到这一点,我没有任何问题 现在,当我切换到Reports API时,它将不显示签名。 这是我正在使用的签名函数 hmac_SHA256_inits(hmc, FSecretAccessKey); s := StringToSign; hmac_SHA256_update(hmc, @(s[1]), Leng

为了在多个店面之间进行同步,我用Delphi编写了一个应用程序。 说到签名,我似乎遇到了一个问题。我的设想是:

当我为Amazon运行Orders API时,它将接受签名并成功下载所有订单。说到这一点,我没有任何问题

现在,当我切换到Reports API时,它将不显示签名。 这是我正在使用的签名函数

hmac_SHA256_inits(hmc, FSecretAccessKey);
s := StringToSign;
hmac_SHA256_update(hmc, @(s[1]), Length(s));
hmac_SHA256_final(hmc, hmd);
SetLength(sBin, 32);
for i := 0 to 31
 do sBin[i+1] := AnsiChar(hmd[i]);

Result := Base64Encode(sBin);
Result := StringReplace(Result, '+', '%2B', [rfReplaceAll]);
Result := StringReplace(Result, '=', '%3D', [rfReplaceAll]);
我甚至用与MWS Scratchpad相同的时间戳来比较signaures,结果不同。然而,要签名的字符串是完全相同的,逐字逐句,大写字母也是一样的。我认为这可能是签名例程,但如果例程出错,Orders API如何在没有任何问题的情况下工作?我在两者中看到的唯一主要区别是,对于Orders API,您必须使用

职位 /订单/2011-01-01 参数字符串

报告一是

职位 / 参数字符串

单斜杠会导致签名失败吗?我已经尝试了我能想到的一切来解决这个问题,实际上我正在考虑放弃这个项目,转而使用另一种语言


如果您有任何帮助,我们将不胜感激。

您的问题最有可能出现在您的
StringToSign
功能中。应该是这样的:

StringToSign := 'POST'+ chr(13)+ 
                 AmazonMWShost + chr(13) + 
                 '/'+ APIurl + chr(13) + 
                 URLencodedParameters;

其中AmazonMWShost是美国商户的
mws.amazonservices.com
。APIRL是报表API的空字符串,订单API的空字符串是
Orders/2011-01-01

您使用的SHA256函数的来源是什么?是你写的,第三方图书馆还是…?你解决了这个问题吗?我也被困在尝试在Delphi中为我的MWS请求生成签名。如果您成功了,您是否介意为SHA/HMAC库的使用指出正确的方向?我知道这是一个旧线程,但这可能会帮助其他人。。。Amazon使用的行尾字符是Chr(10),而不是上面提到的Chr(13)。此外,如果使用Indy发布数据,请确保在端点(AmazonMWShost+“:443”)的末尾添加:443,以便正确计算签名,因为它会将该值添加到主机标题行项目中,Amazon将使用该值计算端点上的签名。