2013-02-11 74 views
0

我對Java相對比較陌生,並且試圖讓我的應用程序將POST請求發佈到亞馬遜的MWS API上幾天。我不斷得到一個'SignatureDoesNotMatch'的迴應,我找不出原因。我已經廣泛使用亞馬遜的MWS便箋簿,並且使用它我沒有任何問題獲得成功響應,所以我的密鑰等都可以。由暫存器生成的內容參數和base64簽名與我的應用程序生成的內容匹配,所以我確信我的應用程序正在編譯參數和簽名。當我將由暫存器生成的內容參數硬編碼到我的應用程序中時,出現'SignatureDoesNotMatch'error響應。我會非常感謝來自更有經驗的Java開發人員或任何已經制作了像我的亞馬遜MWS一樣的應用程序的人。計算亞馬遜MWS簽名不匹配

我的代碼的相關部分是:

/* 
* get amazon timestamp 
*/ 
GetAmazonTimestamp timestampObj = new GetAmazonTimestamp(); 
String amazonTimestamp = null; 
try { 
    amazonTimestamp = timestampObj.getTimestamp(); 
    amazonTimestamp.replace(".000Z", "Z"); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

/* 
* create http parameters and initialise the signature value 
*/ 
String URLendpoint = "https://mws.amazonservices.co.uk/orders/2011-01-01";   

String param1 = "AWSAccessKeyId";  String value1 = "AKIAIZXBKLVSGBBQQL2A"; 
String param2 = "Action";    String value2 = "ListOrders"; 
String param3 = "LastUpdatedAfter";  String value3 = "2013-02-01T00:00:00Z"; 
String param4 = "MarketplaceId.Id.1"; String value4 = "A1F83G8C2ARO7P"; 
String param5 = "SellerId";    String value5 = "A3A2272JFHXROO"; 
String param6 = "SignatureMethod";  String value6 = "HmacSHA256"; 
String param7 = "SignatureVersion";  String value7 = "2"; 
String param8 = "Timestamp";   String value8 = amazonTimestamp; 
String param9 = "Version";    String value9 = "2011-01-01"; 
String param10 = "Signature";   String value10 = null; 

/* 
* build sections of URL components for signature  
*/ 
String URLforSignature = "POST\n" + "mws.amazonservices.co.uk\n" + "/Orders/2011-01-01\n" + 
    URLEncoder.encode(param1,"UTF-8") + "=" + 
    URLEncoder.encode(value1,"UTF-8") + "&" + 
    URLEncoder.encode(param2,"UTF-8") + "=" + 
    URLEncoder.encode(value2,"UTF-8") + "&" + 
    URLEncoder.encode(param3,"UTF-8") + "=" + 
    URLEncoder.encode(value3,"UTF-8") + "&" + 
    URLEncoder.encode(param4,"UTF-8") + "=" + 
    URLEncoder.encode(value4,"UTF-8") + "&" + 
    URLEncoder.encode(param5,"UTF-8") + "=" + 
    URLEncoder.encode(value5,"UTF-8") + "&" + 
    URLEncoder.encode(param6,"UTF-8") + "=" + 
    URLEncoder.encode(value6,"UTF-8") + "&" + 
    URLEncoder.encode(param7,"UTF-8") + "=" + 
    URLEncoder.encode(value7,"UTF-8") + "&" + 
    URLEncoder.encode(param8,"UTF-8") + "=" + 
    URLEncoder.encode(value8,"UTF-8") + "&" + 
    URLEncoder.encode(param9,"UTF-8") + "=" + 
    URLEncoder.encode(value9,"UTF-8"); 

/* 
* hash and base64 encode the signature using the URLforSignature 
*/ 
GetAmazonSignature signatureObj = new GetAmazonSignature();     
value10 = signatureObj.getSignature(URLforSignature); 

/* 
* create the http post 
*/ 
HttpClient client = new DefaultHttpClient(); 
HttpPost post = new HttpPost(URLendpoint); 

String line = null; 

try { 
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
    post.addHeader("Content-Type", "application/x-www-form-urlencoded"); 
    nameValuePairs.add(new BasicNameValuePair(param1, value1)); 
    nameValuePairs.add(new BasicNameValuePair(param2, value2)); 
    nameValuePairs.add(new BasicNameValuePair(param3, value3)); 
    nameValuePairs.add(new BasicNameValuePair(param4, value4)); 
    nameValuePairs.add(new BasicNameValuePair(param5, value5)); 
    nameValuePairs.add(new BasicNameValuePair(param6, value6)); 
    nameValuePairs.add(new BasicNameValuePair(param7, value7)); 
    nameValuePairs.add(new BasicNameValuePair(param8, value8)); 
    nameValuePairs.add(new BasicNameValuePair(param9, value9)); 
    nameValuePairs.add(new BasicNameValuePair(param10, value10)); 

    post.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8")); 

    HttpResponse response = client.execute(post); 
    BufferedReader rd = new BufferedReader(new InputStreamReader(
      response.getEntity().getContent())); 
    line = ""; 

    while ((line = rd.readLine()) != null) { 
     System.out.println(line); 
    } 
} 

感謝您的幫助。

回答

0

爲什麼不使用亞馬遜爲MWS提供的Java客戶端庫?

轉到MWS並單擊您感興趣的API。您將看到一個Java客戶端庫鏈接,您可以在其中獲取所需的文件。它們包含示例並將處理您通常必須執行的URL簽名,解析和其他工作。

+1

非常感謝您的回覆。我花了一些時間與亞馬遜MWS訂單API,但我發現它是不可逾越的。因爲我正在學習用java編程,所以我認爲我將能夠逐步構建適當的代碼,我相信這正是我所做的。我不介意創建我的應用程序需要更長的時間,我只是想了解它在做什麼,以便我可以繼續構建它。 – Bacon 2013-02-12 13:03:23

0

您構建URLforSignature的方式看起來沒問題。

儘管如此,您並未顯示代碼GetAmazonSignature。我會懷疑這個缺陷在那裏。可能你忘了base64編碼你的結果?請注意,MWS scratchpad在「請求詳細信息」頁面上顯示了十六進制簽名以及base64編碼的簽名。您應該能夠通過將這些詳細信息與您的功能結果進行比較來發現缺陷。

1

感謝那些幫助過我的人,但最終我發現「https://mws.amazonservices.co.uk/orders/2011-01-01」在訂單中需要大寫「O」。亞馬遜的開發支持同意在這種情況下'SignatureDoesNotMatch'錯誤信息不是很有幫助,並且表示他們會研究它。

再次感謝