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