2013-09-10 115 views
2

我已經在Delphi中編寫了一個應用程序,以便在多個店面之間進行同步。 當涉及到簽名時,我似乎遇到了一個問題。我的情況是這樣的:亞馬遜MWS簽名 - 德爾福

當我運行亞馬遜的訂單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便籤比較signaures運行此簽名功能,就出來不同。然而,要簽字的字符串也是一樣的,一字一字,大寫字母也一樣。我認爲這可能是簽名例程,但是如果例程錯誤,Orders API如何工作而沒有任何問題?唯一的主要區別我可以在這兩個看到的是,對於訂單API,你必須使用

POST /訂單/ 2011-01-01 ParamterString

,報告一個是

POST / ParamterString

單獨的斜槓可能導致簽名失敗?我嘗試了所有我能想到的方法來解決這個問題,實際上我正考慮放棄這個項目,轉而採用不同的語言。

任何幫助,將不勝感激

+0

你正在使用的SHA256功能的起源是什麼?你寫了他們,第三方圖書館還是......? – alcalde

+0

你解決了這個問題嗎?我也試圖在Delphi中爲我的MWS請求生成一個簽名。如果你成功了,你會介意指向什麼SHA/HMAC庫使用的正確方向? – user1595471

回答

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

+0

我知道這是一箇舊的線程,但這可能有助於其他人...亞馬遜使用的結束字符是Chr(10),而不是Chr(13),如上所述。此外,如果您使用Indy發佈數據,請務必在端點(AmazonMWShost +':443')的末尾添加:443,以便正確計算簽名,因爲它會將其添加到主機標題行項目,並且亞馬遜將使用該值來計算簽名。 – user1595471