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"开发者_StackOverflow,
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.
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.
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();
}
精彩评论