2010-01-27 5 views
3

J'expérimente avec Google Checkout et j'ai un problème pour poster sur le serveur de paiement. Voici mon code:POSTing 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(); 

Quand j'appelle GetResponse(), je reçois un (400) Bad Request.

Toute aide à cet égard serait grandement appréciée.

Répondre

4

Votre XML a l'air cassé comme le souligne Jon Skeet :-). Afin de faciliter le débogage - il peut y avoir plus d'informations sur l'erreur dans la réponse. WebException a un objet Response qui peut avoir un message d'erreur plus détaillé qui peut être lu en appelant sa méthode GetResponseStream().

+1

Aha! Merci, l'erreur dans la réponse de WebException m'a effectivement orienté dans la bonne direction. (Bien que cela puisse aussi bien dire 'Dave, vous êtes un idiot!'). J'utilisais un identifiant de marchand sandbox, mais l'URL live. Merci beaucoup pour l'aide. – DavidGouge

2

Ne connaissant rien à l'API Google Checkout, êtes-vous sûr de ne pas avoir besoin de l'espace de nom sur chaque de ces éléments?

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

C'est certainement ce que le Checkout API guide me donne à penser - noter que « xmlns = ... » signifie que l'espace de noms est pour cet élément et tous les éléments descendants, sauf indication contraire.

+0

Je ne pense pas ainsi, selon l'API docs: http://code.google.com/apis/checkout/developer/Google_Checkout_XML_API.html#checkout_integration_options – DavidGouge

+0

@ DavidGouge: Je pense que vous avez manqué le fait que c'est xmlns = "..." plutôt que xmlns: foo = "...". –

+0

Je ne suis pas sûr que je suis, mais après avoir vérifié le xml que je génère, il semble que je reçois un espace de noms vide sur les enfants de l'élément racine. Je me demande si cela cause les problèmes. < shopping panier xmlns = "" />< articles xmlns = ""> Doodad Description pour doodad 9,99 DavidGouge

0

Vous pouvez toujours lire le message de réponse, si l'exception est WebException. Cela vous donnera plus d'informations sur ce qui ne va pas:

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