سؤال

أقوم بتجربة استخدام 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();

عندما أدعو getResponse () ، أحصل على ملف (400) Bad Request.

سيتم تلقي أي مساعدة على هذا بامتنان.

هل كانت مفيدة؟

المحلول

يبدو XML الخاص بك مكسورة كما يشير Jon Skeet :-). من أجل مزيد من المساعدة في تصحيح الأخطاء - قد يكون هناك المزيد من المعلومات حول الخطأ في الاستجابة. WebException لديه Response كائن قد يكون له رسالة خطأ أكثر تفصيلاً يمكن قراءتها عن طريق الاتصال بها GetResponseStream() طريقة.

نصائح أخرى

لا تعرف أي شيء عن واجهة برمجة تطبيقات Google Checkout ، هل أنت متأكد من أنك لا تحتاج إلى مساحة الاسم كل من تلك العناصر؟

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

هذا بالتأكيد ما دليل API Checkout يقترح لي - لاحظ أن "xmlns = ..." يعني أن مساحة الاسم لهذا العنصر وجميع عناصر النسل ما لم ينص على خلاف ذلك.

لا يزال بإمكانك قراءة رسالة الاستجابة ، إذا كان الاستثناء هو WebException. هذا سوف يمنحك المزيد من المعلومات حول الخطأ:

try {
   response = (HttpWebResponse)request.GetResponse();
}
catch (WebException ex1) {
   response = ex1.Response();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top