Свой модуль на 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(); }