ASP.NET Интеграция платежной системы UCS United Card Services

Свой модуль на C# который UCS предлагают на 2500 строк у меня не получилось интегрировать.

Поэтому публикую свой вариант реализации интеграции, просто примеры рабочих SOAP запросов к серверу, а именно регистрация заказа и проверка статуса заказа

Сначала понадобится этот класс для отправки запросов

 public static class SoapClient
    {
        public static string Send(string method, string soapMessage)
        {
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://tws.egopay.ru/order/v2/");
            webRequest.Headers.Add("SOAPAction", method);
            webRequest.ContentType = "text/xml;charset=\"utf-8\"";
            webRequest.Accept = "text/xml";
            webRequest.Method = "POST";
            webRequest.Credentials = new NetworkCredential("s-sport", "WFu6wBDCfZ");

            var data = Encoding.ASCII.GetBytes(soapMessage);

            using (Stream stream = webRequest.GetRequestStream())
            {
                stream.Write(data, 0, data.Length);
            }

            string responseText;

            try
            {
                using (HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse())
                {
                    var encoding = ASCIIEncoding.UTF8;

                    using (var reader = new StreamReader(response.GetResponseStream(), encoding))
                    {
                        responseText = reader.ReadToEnd();
                    }
                }
            }
            catch (WebException ex)
            {
                responseText = string.Format("Message: {0}, Status: {1}", ex.Message, ex.Status);
            }

            return responseText;
        }
    }

Теперь непосредственно сами запросы на регистрацию платежа с перенаправлением на страницу оплаты

public ActionResult Register(string number = "666", string amount = "777", string phone = "89181234567", string name = "Покупатель", string email = "test@gmail.com")
        {
            string message = string.Format(@"<?xml version='1.0' encoding='utf-8'?>
            <soap:Envelope
                xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""
                xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""
                xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
                <soap:Body>
                    <register>
                        <order>
                            <shop_id>{0}</shop_id>
                            <number>{1}</number>
                        </order>
                        <cost>
                            <currency>RUB</currency>
                            <amount>{2}</amount>
                        </cost>
                        <customer>
                            <phone>{3}</phone>
                            <name>{4}</name>
                            <email>{5}</email>
                        </customer>
                        <description>
                            <timelimit>2018-03-16T10:02:00.000+03:00</timelimit>
                            <sales></sales>
                        </description>
                        <postdata>
                            <PostEntry>
                                <name>Language</name>
                                <value>ru</value>
                            </PostEntry>
                            <PostEntry>
                                <name>ReturnURLOk</name>
                                <value>{6}</value>
                            </PostEntry>
                            <PostEntry>
                                <name>ReturnURLFault</name>
                                <value>{7}</value>
                            </PostEntry>
                            <PostEntry>
                                <name>Comment</name>
                                <value>{1}</value>
                            </PostEntry>
                            <PostEntry>
                                <name>Showcase</name>
                                <value>redirect</value>
                            </PostEntry>                            
                        </postdata>
                    </register>
                </soap:Body>
            </soap:Envelope>", settings["shop-id"], number, amount, phone, name, email,
                             "http://site.ru/pay/success",
                             "http://site.ru/oshibka-oplati"
                             );

            string result = SoapClient.Send("register", message);
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(result);

            var session = xmlDoc.GetElementsByTagName("session").Item(0).InnerXml;
            var paycode = xmlDoc.GetElementsByTagName("paycode").Item(0).Attributes["xsi:nil"].Value;
            var redirectUrl = xmlDoc.GetElementsByTagName("redirect_url").Item(0).InnerXml;
            //Запишем в сессию номер заказа
            Session["OrderNumber"] = number;
            return Redirect(redirectUrl + "?session=" + session);
}

В заключение окончательная проверка статуса оплаты, чтобы показать пользователю уведомление о действительно успешной оплате

   public ActionResult Success()
        {
            //Проверим оплату заказа,взяв номер из сессии
            string orderNumber = string.IsNullOrEmpty((string)Session["OrderNumber"]) ? "444" : (string)Session["OrderNumber"];
            if (!string.IsNullOrEmpty(orderNumber))
            {
                string message = string.Format(@"<?xml version='1.0' encoding='utf-8'?>
                    <soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>
                      <soap:Body>
                        <get_status>
                          <order>
                            <shop_id>{0}</shop_id>
                            <number>{1}</number>
                          </order>
                        </get_status>
                      </soap:Body>
                    </soap:Envelope>", settings["shop-id"], orderNumber);

                string result = SoapClient.Send("get_by_order", message);
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.LoadXml(result);
                var status = xmlDoc.GetElementsByTagName("status").Item(0).InnerXml;
                if (status == "acknowledged")
                {
                    using (ContentRepository content = new ContentRepository())
                    {
                        content.Update("oplachen = 1", "content_id  =" + orderNumber);
                    }

                    return Redirect("http://site.ru/spasibo-vash-zakaz-prinyat-k-ispolneniyu?orderId=" + orderNumber);
                }
                else
                {
                    return Redirect("http://site.ru/oshibka-oplati");
                }
            }
            return View();
        }

Добавить комментарий