我在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
独奏斜线会导致签名失败吗?我已经尝试了所有我能想到的解决这个问题的方法,而我实际上是在考虑放弃这个项目,而不是使用其他语言。
非常感谢任何帮助
答案 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
。