亚马逊MWS签名 - 德尔福

时间:2013-09-10 23:15:29

标签: delphi delphi-xe3 amazon-mws

我在Delphi中编写了一个应用程序,以便在多个店面之间进行同步。 在签名方面,我似乎遇到了一个问题。我的情况是:

当我运行亚马逊的订单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 /订单/ 2011-01-01 ParamterString

,报告一

POST / ParamterString

独奏斜线会导致签名失败吗?我已经尝试了所有我能想到的解决这个问题的方法,而我实际上是在考虑放弃这个项目,而不是使用其他语言。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

您的StringToSign功能最有可能出现问题。它应该看起来像这样:

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

美国商家的AmazonMWShost为mws.amazonservices.com。 APIurl是Report API的空字符串,Order API的Orders/2011-01-01