2010-01-27 6 views
3

Google Checkout을 사용하여 실험 중이며 체크 아웃 서버에 게시하는 데 문제가 있습니다. 내가하는 GetResponse()를 호출 할 때xml to 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(); 

, 나는이 (400) Bad Request를 얻을 : 여기 내 코드입니다.

감사의 말을 보내 주시면 감사하겠습니다.

답변

4

Jon Skeet이 지적한대로 XML이 깨졌습니다. 디버깅을 지원하기 위해 응답의 오류에 대한 자세한 정보가있을 수 있습니다. WebException에는 GetResponseStream() 메서드를 호출하여 읽을 수있는보다 자세한 오류 메시지가있는 Response 개체가 있습니다.

+1

아하! 감사합니다, WebException의 응답에 오류가 실제로 올바른 방향으로 나를 가리킨 않았다. (물론 '데이브 (Dave)'라고했을지도 모르겠지만, 당신은 바보가됩니다! '). 샌드 박스 판매자 ID를 사용했지만 라이브 URL입니다. 도와 주셔서 너무 감사드립니다. – DavidGouge

2

Google Checkout API에 대해 알지 못하면 에 각 요소의에 네임 스페이스가 필요하지 않습니까?

Checkout API guide이 나에게 제안 무엇을 확실히이다
XElement rootElement = new XElement(ns + "checkout-shopping-cart", 
    new XElement(ns + "shopping-cart"), 
     new XElement(ns + "items", 
        // etc 

- "의 xmlns가 = ..."별도로 명시하지 않는 한 그이 요소 및 모든 하위 요소의 네임 스페이스의 의미 있습니다.

+0

을 나는 API 문서에 의하면, 그렇게 생각하지 말아 : http://code.google.com/apis/checkout/developer/Google_Checkout_XML_API.html#checkout_integration_options – DavidGouge

+0

@ DavidGouge : xmlns : foo = "..."보다는 xmlns = "..."라는 사실을 놓친 것 같습니다. –

+0

잘 모르겠지만, 생성하는 xml을 두 번 확인하면 루트 요소의 자식에 빈 네임 스페이스가 생겼습니다. 그것이 문제를 일으키는 지 궁금합니다. <결제 쇼핑 카트에의 xmlns = "http://checkout.google.com/schema/2"> <- 쇼핑 카트의 xmlns = ""/> <상품의 xmlns = ""> 장식물 는 장식물 설명 <단위 가격 통화 = "GBP"> 9.99 1 DavidGouge

0

예외가 WebException 인 경우에도 응답 메시지를 읽을 수 있습니다. 이것은 무엇이 잘못되었는지에 대한 더 많은 정보를 제공합니다 :

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