2010-01-27 101 views
3

我正在嘗試使用Google Checkout,並將問題發佈到結帳服務器。這裏是我的代碼:將xml發佈到Google Checkout

XNamespace ns = XNamespace.Get("http://checkout.google.com/schema/2"); 

XDocument cart = new XDocument(); 
XElement rootElement = new XElement(ns + "checkout-shopping-cart", 
    new XElement("shopping-cart", 
     new XElement("items", 
      new XElement("item", 
       new XElement("item-name", "doodad"), 
       new XElement("item-description", "Description for the doodad"), 
       new XElement("unit-price", 9.99, new XAttribute("currency", "GBP")), 
       new XElement("quantity", 1) 
      ) 
     ) 
    ) 
); 

cart.Add(rootElement); 

string authKey = "111222333444:NOTAREALKEY"; 
authKey = EncodeToBase64(authKey); 

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://checkout.google.com/cws/v2/Merchant/111222333444/merchantCheckout"); 

request.Method = "POST"; 
byte[] byteArray = Encoding.UTF8.GetBytes(cart.ToString()); 
request.ContentType = "application/xml; charset=UTF-8"; 
request.ContentLength = byteArray.Length; 
request.Headers.Add("Authorization: Basic " + authKey); 
request.Accept = "application/xml; charset=UTF-8"; 

Stream dataStream = request.GetRequestStream(); 
dataStream.Write(byteArray, 0, byteArray.Length); 
dataStream.Close(); 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // Exception here! 
dataStream = response.GetResponseStream(); 
StreamReader reader = new StreamReader(dataStream); 
string responseText = reader.ReadToEnd(); 

reader.Close(); 
dataStream.Close(); 
response.Close(); 

當我打電話的GetResponse(),我得到一個(400) Bad Request

任何有關這方面的援助將受到感謝。

回答

4

Jon Skeet指出:-),你的XML看起來很破碎。爲了進一步幫助調試 - 可能會有更多關於響應錯誤的信息。 WebException有一個Response對象,該對象可能具有更詳細的錯誤消息,可通過調用GetResponseStream()方法來讀取該消息。

+1

啊哈!謝謝,WebException響應中的錯誤確實指出了我的正確方向。 (雖然它可能說'戴夫,你是一個白癡!')。我使用的是沙盒商戶ID,但是使用了實時網址。非常感謝您的幫助。 – DavidGouge 2010-01-27 15:05:53

2

不知道Google Checkout API的任何內容,您確定不需要這些元素的每個的名稱空間?

XElement rootElement = new XElement(ns + "checkout-shopping-cart", 
    new XElement(ns + "shopping-cart"), 
     new XElement(ns + "items", 
        // etc 

這肯定是什麼Checkout API guide建議我 - 請注意「的xmlns = ...」則表示是這個元素以及所有子元素的名稱空間,除非另有說明。

+0

我不這麼認爲,根據API文檔:http://code.google.com/apis/checkout/developer/Google_Checkout_XML_API.html#checkout_integration_options – DavidGouge 2010-01-27 14:12:03

+0

@ DavidGouge:我想你已經錯過了xmlns =「...」而不是xmlns:foo =「...」的事實。 – 2010-01-27 14:12:43

+0

不知道我跟着,但有了雙重檢查我生成的XML,似乎我得到的根元素的子級空白命名空間。不知道是否會導致問題。 <結帳購物推車的xmlns = 「http://checkout.google.com/schema/2」> <購物推車的xmlns = 「」/> <項的xmlns = 「」> 裝飾物 <項-描述>作爲裝飾物描述 <單價貨幣= 「GBP」> 9.99 DavidGouge 2010-01-27 14:17:57

0

如果異常是WebException,您仍然可以閱讀響應消息。這會給你更多的信息,什麼是錯的:

try { 
    response = (HttpWebResponse)request.GetResponse(); 
} 
catch (WebException ex1) { 
    response = ex1.Response(); 
}