Pregunta

estoy experimentando con el uso de Google Checkout y estoy teniendo una publicación problema con el servidor de pago y envío. Aquí está mi código:

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

Cuando llamo GetResponse (), aparece un (400) Bad Request.

Cualquier ayuda en esto sería recibido con gratitud.

¿Fue útil?

Solución

Sus miradas XML dañado como Jon Skeet señala :-). Con el fin de depurar aún más la ayuda - que puede haber más información sobre el error en la respuesta. WebException tiene un objeto Response que podrían tener un mensaje de error más detallado que se puede leer llamando a su método GetResponseStream().

Otros consejos

Sin saber nada acerca de la API de Google Checkout, ¿está seguro de que no es necesario el espacio de nombres cada de esos elementos?

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

Esto es sin duda lo que el Pedido guía API sugiere mí -. Tenga en cuenta que "xmlns = ..." significa que del espacio de nombres para este elemento y todos los elementos descendientes salvo indicación en contrario

Aún puede leer mensaje de respuesta, si es WebException excepción. Esto le dará más información sobre lo que está mal:

try {
   response = (HttpWebResponse)request.GetResponse();
}
catch (WebException ex1) {
   response = ex1.Response();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top