2

我在 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 相同的时间戳来运行它来比较签名,它们的结果不同。然而,要签名的字符串完全一样,逐字逐句,大写也是如此。我认为这可能是签名例程,但是如果例程错误,Orders API 将如何正常工作?我可以在两者中看到的唯一主要区别是,对于 Orders API,您必须使用

POST /Orders/2011-01-01 参数字符串

报告一份是

POST / 参数字符串

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

任何帮助将不胜感激

4

1 回答 1

1

您的问题很可能出在您的StringToSign功能中。它应该看起来像这样:

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

AmazonMWShost 适用mws.amazonservices.com于美国商家。APIurl 是报告 API 和Orders/2011-01-01订单 API 的空字符串。

于 2013-09-12T23:57:19.230 回答