Question

I'm experimenting with using Google Checkout and am having a problem posting to the checkout server. Here is my code:

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();

When I call GetResponse(), I get a (400) Bad Request.

Any assistance on this would be gratefully received.

Was it helpful?

Solution

Your XML looks broken as Jon Skeet points out :-). In order to further aid debugging - there may be more information about the error in the response. WebException has a Response object that might have a more detailed error message that can be read by calling its GetResponseStream() method.

OTHER TIPS

Not knowing anything about the Google Checkout API, are you sure you don't need the namespace on each of those elements?

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

That's certainly what the Checkout API guide suggests to me - note that "xmlns=..." means that's the namespace for this element and all descendant elements unless otherwise specified.

You still can read response message, if exception is WebException. This will give you more information on what's wrong:

try {
   response = (HttpWebResponse)request.GetResponse();
}
catch (WebException ex1) {
   response = ex1.Response();
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top