/// <summary> /// Зполнение тела реестра /// </summary> /// <returns></returns> string MakeBody() { StringBuilder sb = new StringBuilder(200000); Queue <RegisterRecord> copy = new Queue <RegisterRecord>(body.ToArray()); int i = 0; foreach (RegisterRecord r in copy) { // r = body.Peek(); i++; sb.AppendFormat("<p id=\"{0}\">{1};{2};{3};{4};{5};{6};{7};{8};{9};{10};{11};{12}</p>\r\n", i.ToString(), Asvps, r.Outtid, r.Pcdate.ToString("yyyyMMddHHmmss", CultureInfo.InvariantCulture) + "000", r.Tid, ProvidersSettings.Mts.TerminalPrefix + "." + r.Tppid.ToString(), r.Phone, r.Opcode, r.Account, XConvert.AsAmount(r.Amount), r.Currency, r.PIC, XConvert.AsAmount(r.Debt)); } copy.Clear(); return(sb.ToString()); }
/// <summary> /// Ответ OE /// </summary> public void MakeAnswer() { StringBuilder sb = new StringBuilder(); StringBuilder sb1 = new StringBuilder(); sb1.AppendFormat("\t<{0} code=\"{1}\">{2}</{0}>", "error", ErrCode, HttpUtility.HtmlEncode(ErrDesc)); if (!string.IsNullOrEmpty(Outtid)) { sb1.AppendFormat("\r\n\t<{0}>{1}</{0}>", "transaction", Outtid); } if (Acceptdate != DateTime.MinValue && (State == 6 || State == 10)) { sb1.AppendFormat("\r\n\t<{0}>{1}</{0}>", "accept-date", XConvert.AsDate(Acceptdate).Replace('T', ' ')); } if (!string.IsNullOrEmpty(Fio)) { sb1.AppendFormat("\r\n\t<{0}>{1}</{0}>", "fio", Fio); } if (!string.IsNullOrEmpty(Opname)) { sb1.AppendFormat("\r\n\t<{0}>{1}</{0}>", "opname", Opname); } if (!string.IsNullOrEmpty(Account)) { sb1.AppendFormat("\r\n\t<{0}>{1}</{0}>", "account", Account); } if (!string.IsNullOrEmpty(AddInfo)) { sb1.AppendFormat("\r\n\t<{0}>{1}</{0}>", "info", AddInfo.Length <= 250 ? HttpUtility.HtmlEncode(AddInfo) : HttpUtility.HtmlEncode(AddInfo.Substring(0, 250))); } if (Recpay != null) { sb1.AppendFormat("\r\n\t<{0}>{1}</{0}>", "recpay", XConvert.AsAmount(Recpay.Value)); } if (Balance != null) { sb1.AppendFormat("\r\n\t<{0}>{1}</{0}>", "balance", XConvert.AsAmount(Balance.Value)); } sb.AppendFormat("<{0}>\r\n{1}\r\n</{0}>\r\n", "response", sb1.ToString()); stResponse = sb.ToString(); if (tid > 0) { UpdateState(Tid, state: State, locked: 1); } // Log("Подготовлен ответ:\r\n{0}", stResponse); }
/// <summary> /// Создание шаблона comparePacket /// </summary> void MakeTemplate() { string format; // Прочитаем шаблон using (StreamReader stream = new StreamReader(Settings.Templates + "comparepacket-" + ProvidersSettings.Mts.Ott + "-" + ProvidersSettings.Mts.Xsd + ".tpl")) { format = stream.ReadToEnd(); } template = string.Format(format, ProvidersSettings.Mts.Timeout, ProvidersSettings.Mts.Contract, XConvert.AsDate(Datefrom), XConvert.AsDate(Dateto), totalPayments, Cur, XConvert.AsAmount(totalSum), XConvert.AsAmount(totalDebt), MakeBody()); }
/// <summary> /// Локальная реализация MakeCheckRequest /// </summary> /// <returns></returns> public new int MakeRequest(int old_state) { // Сделаем запрос paycheck // Получаем дополнительную информацию о терминале // GetTerminalInfo(terminal); // Log("[CHECK/MakeCheckRequest], Tid={0}, Ph/Acc={1}, Amount={2}, AmountAll={3}, recid={4}, point={5}, type={6}", // Tid, !String.IsNullOrEmpty(Phone) ? Phone : Account, XConvert.AsAmount(Amount), XConvert.AsAmount(AmountAll), Service, Terminal, TerminalType); StringBuilder sb = new StringBuilder(); try { sb.AppendFormat(payCheck, Host, tid, XConvert.AsAmount(amount), service, terminal); if (!string.IsNullOrEmpty(phone)) { sb.AppendFormat("&{0}={1}", HttpUtility.UrlEncode("№ телефона").ToUpper(), phone); } if (!string.IsNullOrEmpty(account)) { sb.AppendFormat("&{0}={1}", HttpUtility.UrlEncode("№ договора").ToUpper(), account); } if (!string.IsNullOrEmpty(number)) { sb.AppendFormat("&{0}={1}", HttpUtility.UrlEncode("филиал").ToUpper(), number); } checkHost = sb.ToString(); } catch (Exception ex) { Log("{0}\r\n{1}", ex.Message, ex.StackTrace); return(-1); } stRequest = ""; Log("[CHECK/MakeCheckRequest] Шаблон запроса сформирован\r\n{0}", checkHost); errCode = 6; errDesc = "Реализация Check не завершена"; return(1); }
/// <summary> /// Сформировать запрос /// </summary> /// <param name="old_state"></param> /// <returns></returns> public new int MakeRequest(int old_state) { try { MD5 md5hash = MD5.Create(); string sign = string.Format("{0}:{1}:{2}:shpItem={3}", XConvert.AsAmount(Amount), Account, Password, "1"); Hash = GetMd5Hash(md5hash, sign).ToUpper(); Log("Signature: {0}", sign); stRequest = string.Format("OutSum={0}&InvId={1}&phone={2}&shpItem=1&SignatureValue={3}", XConvert.AsAmount(Amount), Account, Phone, Hash); return(0); } catch (Exception ex) { RootLog("{0}\r\n{1}", ex.Message, ex.StackTrace); errDesc = ex.Message; errCode = -1; return(-1); } }
/// <summary> /// Ответ OE /// </summary> public void MakeAnswer() { Log($"[MakeAnser] errCode={errCode} errDesc={errDesc}"); StringBuilder sb = new StringBuilder(); StringBuilder sb1 = new StringBuilder(); sb1.AppendFormat("\t<{0} code=\"{1}\">{2}</{0}>", "error", ErrCode, HttpUtility.HtmlEncode(ErrDesc)); if (!string.IsNullOrEmpty(resp.esppPayId)) { outtid = resp.esppPayId; sb1.AppendFormat("\r\n\t<{0}>{1}</{0}>", "transaction", resp.esppPayId); } if (resp.payStatus != null) { sb1.AppendFormat("\r\n\t<{0}>{1}</{0}>", "payStatus", XConvert.AsAmount(resp.payStatus)); } if (Acceptdate != DateTime.MinValue && (State == 6 || State == 10)) { sb1.AppendFormat("\r\n\t<{0}>{1}</{0}>", "accept-date", XConvert.AsDate(Acceptdate).Replace('T', ' ')); } if (!string.IsNullOrEmpty(Fio)) { sb1.AppendFormat("\r\n\t<{0}>{1}</{0}>", "fio", Fio); } if (!string.IsNullOrEmpty(Account)) { sb1.AppendFormat("\r\n\t<{0}>{1}</{0}>", "account", Account); } if (!string.IsNullOrEmpty(resp.errUsrMsg)) { sb1.AppendFormat("\r\n\t<{0}>{1}</{0}>", "addinfo", resp.errUsrMsg.Length <= 250 ? HttpUtility.HtmlEncode(resp.errUsrMsg) : HttpUtility.HtmlEncode(resp.errUsrMsg.Substring(0, 250))); } if (resp.payeeRecPay != null) { sb1.AppendFormat("\r\n\t<{0}>{1}</{0}>", "recpay", XConvert.AsAmount(resp.payeeRecPay)); } if (Balance != null) { sb1.AppendFormat("\r\n\t<{0}>{1}</{0}>", "balance", XConvert.AsAmount(balance)); } if (!string.IsNullOrEmpty(resp.clientInn)) { sb1.AppendFormat("\r\n\t<{0}>{1}</{0}>", "clientInn", resp.clientInn); } if (!string.IsNullOrEmpty(resp.clientType)) { sb1.AppendFormat("\r\n\t<{0}>{1}</{0}>", "clientType", resp.clientType); } if (!string.IsNullOrEmpty(resp.clientOrgName)) { sb1.AppendFormat("\r\n\t<{0}>{1}</{0}>", "clientOrgName", resp.clientOrgName); } sb.AppendFormat("<{0}>\r\n{1}\r\n</{0}>\r\n", "response", sb1.ToString()); // stResponse = JsonConvert.SerializeObject(resp); // Log($"Получен ответ от ЕСПП\r\n{stResponse}"); stResponse = sb.ToString(); if (tid > 0) { UpdateState(Tid, state: State, locked: 1); } Log($"[MakeAnser] Подготовлен ответ:\r\n{stResponse}"); }
GWRequest Reposting(GWRequest Request) { GWRequest Current = Request; DateTime OperDate = DateTime.Now; try { string x = null; byte old_state = Request.State; x = !string.IsNullOrEmpty(Request.Phone)? Request.Phone: !string.IsNullOrEmpty(Request.Account)? Request.Account: !string.IsNullOrEmpty(Request.Number)? Request.Number: ""; DateTime?LastAttempt = LastOperDate(Request.Tid); int last = (int)((DateTime.Now.Ticks - LastAttempt.Value.Ticks) / TimeSpan.TicksPerSecond); Log("{0} [REPT - strt] last={1} st={2} Num={3} S={4} A={5} err={6} {7}", Request.Tid, last, Request.State, x, XConvert.AsAmount(Request.AmountAll), XConvert.AsAmount(Request.Amount), Request.ErrCode, Request.ErrDesc); // Если запрос отправлен менее минуты назат - перепровести if (last > 60) { // Т.к. запрос частично затёрт вызовом GetSate() - сделаем новый разбор // Разбор входного запроса. 0 - запрос разобран. Request.Dispose(); Request = new GWRequest(); // Параметры заполнены на основе входного запроса Request.Parse(m_data.stRequest); Request.State = 0; Request.errCode = 0; Request.errDesc = "Перепроведение платежа"; Request.UpdatePayment(); // Для начала определимя с провайдером: switch (Request.Provider) { case "rt": Current = new RTClass16(Request); break; case "ekt": Current = new GWEktRequest(Request); break; case "cyber": Current = new GWCyberRequest(Request); break; case "mts": Current = new GWMtsRequest(Request); break; } // Current.Processing(old_state, 1, "Перепроведение платежа"); // Перепроведение Current.Processing(false); x = !string.IsNullOrEmpty(Current.Phone)? Current.Phone: !string.IsNullOrEmpty(Current.Account)? Current.Account: !string.IsNullOrEmpty(Current.Number)? Current.Number: ""; } else { Log("{0} [REPT - stop] перепроведение не производится", Request.Tid); } // Log("Tid={0} [REPOST - конец] st={1} Num={2} S={3} A={4} err={5} {6}", // Current.Tid, Current.State, x, XConvert.AsAmount(Current.AmountAll), XConvert.AsAmount(Current.Amount), Current.ErrCode, Current.ErrDesc); } catch (Exception ex) { Current.errDesc = string.Format(Messages.InternalPaymentError, ex.Message); Log("{0}\r\n{1}", Current.errDesc, ex.StackTrace); Current.UpdateState(Current.Tid, state: Current.State, errCode: Current.ErrCode, errDesc: Current.ErrDesc); } finally { if (Current != null) { Current.SetLock(0); } } return(Current); }
/// <summary> /// Отпарвляет ответ OE /// </summary> /// <param name="dataHolder">Контекст запроса OE</param> /// <param name="r">Платёж</param> private void SendAnswer(RequestInfo dataHolder, GWRequest r) { if (r == null) { SendAnswer(dataHolder); return; } string stResponse = r.Answer; string errDesc = !string.IsNullOrEmpty(r.ErrDesc)? HttpUtility.HtmlEncode(r.ErrDesc): ""; // Log($"[SendAnswer] Provider={r.Provider} stResponse={stResponse}"); try { if (r.Provider != Settings.Rt.Name && r.Provider != Settings.Rapida.Name && r.Gateway != "lyapko") // уже заполненнвй Answer { if (r.State == 6 || r.State == 0 /* && r.Provider == "rapida" */) { // stResponse = string.Format(Properties.Settings.Default.Response, 3, gw.ErrDesc, gw.Outtid, gw.Acceptdate, gw.AcceptCode, gw.Account, gw.AddInfo); int pos = 0; string addInfo = r.AddInfo ?? ""; if (addInfo.Length > 250) { pos = addInfo.IndexOf(";"); if (pos > 0) { addInfo = addInfo.Substring(pos + 2); } if (addInfo.Length > 250) { addInfo = addInfo.Substring(0, 250); } } stResponse = string.Format(Properties.Settings.Default.Response, 3, errDesc, r.Outtid, r.Acceptdate, r.AcceptCode, r.Account, addInfo, XConvert.AsAmount(r.Price)); // errDesc = r.ErrDesc; } else if (r.State == 12) { stResponse = string.Format(Properties.Settings.Default.FailResponse, 6, errDesc); } else if (r.State == 0 && r.ErrCode == 7) // Передача управляющих кодов 7 { stResponse = string.Format(Properties.Settings.Default.FailResponse, r.ErrCode, errDesc); } else if (r.ErrCode == 11 || r.ErrCode == 12) // Передача управляющих кодов 11, 12 { stResponse = string.Format(Properties.Settings.Default.FailResponse, r.ErrCode, errDesc); } else if (r.State == 11) // Отложен { stResponse = string.Format(Properties.Settings.Default.FailResponse, 2, errDesc); } else if (r.State == 1) // { stResponse = string.Format(Properties.Settings.Default.FailResponse, 2, errDesc); } else { stResponse = string.Format(Properties.Settings.Default.FailResponse, 1, r.Price > 0M ? string.Format("{0} \"{1} {2}\"", errDesc, Messages.SumWait, XConvert.AsAmount(r.Price)): errDesc); } } if (string.IsNullOrEmpty(stResponse)) { stResponse = string.Format("<Response><ErrCode>{0}</ErrCode><ErrDesc>{1}</ErrDesc></Response>", r.ErrCode, r.ErrDesc); Log("{0} не получен ответ st={1} err={2} desc={3}", r.Tid, r.State, r.ErrDesc, r.ErrCode); } if (r.Gateway == "lyapko") { Log(stResponse); } // Создаем ответ string answer = string.Format("<?xml version=\"1.0\" encoding=\"{0}\"?>\r\n{1}", dataHolder.ClientEncoding.WebName, stResponse); byte[] buffer = dataHolder.ClientEncoding.GetBytes(answer); dataHolder.Context.Response.ContentLength64 = buffer.Length; if (Settings.LogLevel.IndexOf("OEREQ") != -1) { Log(Properties.Resources.MsgResponseGW, stResponse); } // Utility.Log("tid={0}. Ответ MTS-GATE --> OE\r\n{1}", tid, stResponse); System.IO.Stream output = dataHolder.Context.Response.OutputStream; output.Write(buffer, 0, buffer.Length); } catch (WebException we) { Log("[{0}]: Tid={1}, ({2}){3}", r.RequestType, r.Tid, Convert.ToInt32(we.Status) + 10000, we.Message); } catch (Exception ex) { Log("[{0}]: Tid={1}, {2}\r\n{3}", r.RequestType, r.Tid, ex.Message, ex.StackTrace); } } // makeResponse
/// <summary> /// Создать запрос к серверу ЕСПП. Скрывает базовый запрос. /// </summary> /// <param name="old_state">Статус (если не прошёл проверку 12)</param> /// <returns>0 - ОК, 1 - нет</returns> public new int MakeRequest(int old_state) { if (Settings.LogLevel.IndexOf("PARS") != -1) { RootLog("Параметры запроса:\r\nTimeout={0}\r\nPhone={1}\r\nAmount={2}\r\nCUR={3}\r\nService={4}\r\nTerminal={5}\r\nType={6}\r\nAS-VPS={7}\r\nContract={8}\r\nAccount={10}\r\nPrincipal={11}", TimeOut(), Phone, XConvert.AsAmount(Amount), Cur, Service, MtsTerminalId, TerminalType, Asvps, Contract, Account, Gateway); } switch (old_state) { case 0: using (StreamReader check = new StreamReader(Settings.Templates + (string.IsNullOrEmpty(Phone) ? "a": "p") + "-0104010-" + ProvidersSettings.Mts.Ott + "-" + ProvidersSettings.Mts.Xsd + ".tpl")) { checkTemplate = check.ReadToEnd(); } if (string.IsNullOrEmpty(Phone)) { stRequest = string.Format(checkTemplate, TimeOut(), XConvert.AsAmount(Amount), Cur, Service, MtsTerminalId, TerminalType, Asvps, Contract, Account, Gateway); } else { stRequest = string.Format(checkTemplate, TimeOut(), Phone, XConvert.AsAmount(Amount), Cur, Service, MtsTerminalId, TerminalType, Asvps, Contract, Gateway); } break; case 1: using (StreamReader pay = new StreamReader(Settings.Templates + (string.IsNullOrEmpty(Phone) ? "a" : "p") + "-0104090-" + ProvidersSettings.Mts.Ott + "-" + ProvidersSettings.Mts.Xsd + ".tpl")) { payTemplate = pay.ReadToEnd(); } controlCode = String.Format("{0}&{1}&{2}&{3}&{4}&{5}&{6}&{7}&{8}&{9}&{10}&{11}&{12}", Phone, XConvert.AsAmount(Amount), Cur, Service, Oid, Tid, XConvert.AsDate(Pcdate), Asvps, MtsTerminalId, TerminalType, XConvert.AsDateTZ(TerminalDate, Tz), string.IsNullOrEmpty(Phone)? Account: "", Gateway); if (Settings.LogLevel.IndexOf("DEBUG") != -1) { Log("DoPay: Cc=\"{0}\"", ControlCode); } using (Crypto sign = new Crypto(CommonName)) controlCode = sign.Sign(ControlCode); if (string.IsNullOrEmpty(Phone)) { stRequest = string.Format(payTemplate, XConvert.AsAmount(Amount), Cur, Service, Oid, MakeCheckNumber(), Tid, XConvert.AsDate(Pcdate), Outtid, Asvps, MtsTerminalId, TerminalType, Opcode, XConvert.AsDateTZ(TerminalDate, Tz), ControlCode, Contract, Account, Gateway); } else { stRequest = string.Format(payTemplate, Phone, XConvert.AsAmount(Amount), Cur, Service, Oid, MakeCheckNumber(), Tid, XConvert.AsDate(Pcdate), Outtid, Asvps, MtsTerminalId, TerminalType, Opcode, XConvert.AsDateTZ(TerminalDate, Tz), ControlCode, Contract, Gateway); } break; case 3: using (StreamReader status = new StreamReader(Settings.Templates + "0104085-" + ProvidersSettings.Mts.Ott + "-" + ProvidersSettings.Mts.Xsd + ".tpl")) { statusTemplate = status.ReadToEnd(); } stRequest = string.Format(statusTemplate, TimeOut(), Outtid, Asvps, Contract); break; } if (CheckXML(stRequest) != 0) { RootLog("Mts.MakeRequest {0}", ErrDesc); state = (byte)old_state; errCode = 11; } return(state == 12 ? 1 : 0); }
void TraceRequest() { StringBuilder sb = new StringBuilder(); if (Tid > 0) { sb.AppendFormat("srcPayId = {0} ", Tid); } sb.AppendFormat("reqType = {0} svcTypeId = {1} svcNum = {2} svcSubNum = {3} svcPurpose = 0 amount = {4}\r\n\t\t\tsvcComment = {5}\r\n", ReqType, SvcTypeID, SvcNum, SvcSubNum, XConvert.AsAmount(Amount), SvcComment); // Непустой для РТ-Мобайл if (!string.IsNullOrEmpty(agentAccount)) { sb.AppendFormat("\t\t\tagentAccount = {0}\r\n", agentAccount); } if (ReqTime != null) { sb.AppendFormat("\t\t\treqTime = {0}\r\n", XConvert.AsDateTZ(ReqTime.Value)); } if (Acceptdate != DateTime.MinValue) { sb.AppendFormat("\t\t\tacceptedTme/abandonedTime = {0}\r\n", XConvert.AsDateTZ(Acceptdate)); } if (!string.IsNullOrEmpty(Outtid)) { sb.AppendFormat("\t\t\tesppPayId = {0}\r\n", Outtid); } if (ReqStatus != null) { sb.AppendFormat("\t\t\treqStatus = {0}\r\n", ReqStatus); } if (PayStatus != null) { sb.AppendFormat("\t\t\tpayStatus = {0}\r\n", PayStatus); } if (DupFlag != null) { sb.AppendFormat("\t\t\tdupFlag = {0}\r\n", DupFlag); } if (!string.IsNullOrEmpty(ReqNote)) { sb.AppendFormat("\t\t\treqNote = {0}\r\n", ReqNote); } if (!string.IsNullOrEmpty(AddInfo)) { sb.AppendFormat("\t\t\treqUsrMsg = {0}\r\n", AddInfo); } if (!string.IsNullOrEmpty(Opname)) { sb.AppendFormat("dstDepCode = {0}\r\n", Opname); } if (!string.IsNullOrEmpty(Fio)) { sb.AppendFormat("\t\t\tpayeeName = {0}\r\n", Fio); } if (Price != decimal.MinusOne) { sb.AppendFormat("\t\t\tpayeeRemain = {0}\r\n", XConvert.AsAmount(Price)); } if (sb.ToString().Length > 0) { Log(sb.ToString()); } }
/// <summary> /// Установка состояния платежа и задержки (pause) если получена ошибка /// </summary> /// <param name="oldState"></param> public void ChangeState(byte oldState) { DateTime dateend = Operdate.AddHours(24); // Сетевая ошибка, либо таймаут if (errCode == 502) { state = oldState; return; } if (errCode < 0) { state = 11; return; } int lastError = errCode; if (oldState == 0) { switch (errCode) { case 0: // ERROR=0 state = 1; break; case 1: // сессия с таким номерорм уже существует. установить state = 1 case 34: if (Session == "-OLDIGW" + tid.ToString()) { state = 11; errCode = 2; } else { state = 3; } break; case 6: // Неверная АСП (устарел ключ) state = 11; errCode = 2; break; case 21: // Недостаточно средств для проведения платежа case 25: // Работа шлюза приостановлена case 26: // Платежи данного Контрагента временно блокированы case 30: // Общая ошибка системы. case 50: // Проведение платежей в системе временно невозможно case 52: // Возможно, контрагент заблокирован. case 53: // Возможно, точка приема заблокирована. case 54: // Возможно, оператор точки приема заблокирован. state = 0; errCode = 12; break; // case 81: // Превышена максимальная сумма платежа по Контрагенту -- Отмеять! case 82: // Превышена сумма списаний за день по Контрагенту // case 83: // Превышена максимальная сумма платежа по точке -- Отменять! case 84: // Превышена сумма списаний за день по точке pause = 60; // state = 0; // После 24ч - отменить платёж state = 12; errCode = 2; break; case 24: // Ошибка связи с сервером Получателя. // На этапе проверки (chek) любой неверный код -- отмена платежа state = 12; // if (state == 0) // RootLog("{1} Ожидание завершения технологического перерыва до: {0} ", XConvert.AsDate2(dateend), Tid); break; case 36: // Транзакция уже завершена или находится в обработке state = 3; break; case 33: // Карты указанного номинала на данный момент в системе отсутствуют case 35: // Ошибка при изменении состояния платежа case 41: // Ошибка добавления данных платежа в базу данных case 51: // Не найдены данные в системе // pause = 10; state = 12; // errCode = 2; break; case 20: // Завершается case 48: // Ошибка при сохранении в системе данных сессии // pause = 0; state = 12; break; default: state = 12; break; } } else { switch (errCode) { case 24: // Ошибка связи с сервером Получателя. // После 48 часов отменить платёж state = 12; /* * if (operdate.AddHours(48) < DateTime.Now) * { * state = 12; * RootLog("{0} Время выполнения запроса превысило 48 часов. Платёж отменён. Старт={1} стоп={2}", * Tid, XConvert.AsDate(Operdate), XConvert.AsDate(DateTime.Now)); * } * else * state = 3; */ break; case 36: // Транзакция уже завершена или находится в обработке case 21: // Недостаточно средств для проведения платежа case 6: // Неверная АСП (устарел ключ) case 25: // Работа шлюза приостановлена case 26: // Платежи данного Контрагента временно блокированы case 30: // Общая ошибка системы. case 50: // Проведение платежей в системе временно невозможно case 52: // Возможно, контрагент заблокирован. case 53: // Возможно, точка приема заблокирована. case 54: // Возможно, оператор точки приема заблокирован. state = 3; errCode = 12; break; case 81: // Превышена максимальная сумма платежа по Контрагенту case 82: // Превышена сумма списаний за день по Контрагенту case 83: // Превышена максимальная сумма платежа по точке case 84: // Превышена сумма списаний за день по точке // pause = 60; state = 12; break; case 33: // Карты указанного номинала на данный момент в системе отсутствуют case 35: // Ошибка при изменении состояния платежа case 41: // Ошибка добавления данных платежа в базу данных case 46: // Не удалось завершить ошибочный платеж case 48: // Ошибка при сохранении в системе данных сессии case 51: // Не найдены данные в системе // pause = 10; state = 11; errCode = 2; break; case 11: // Сессия с таким номером не существует. Платёж нужно повторить. case 34: // Транзакция с таким номером не найдена state = 11; errCode = 2; break; case 20: // Завершается case 22: // Платеж не принят. Ошибка при переводе средств. // pause = 0; state = 3; break; default: if (errCode < 0) { state = 11; errCode = 2; errDesc = "Неизвестная ошибка. Обработка запроса отложена"; RootLog($"{tid} {Number}{Card} {Account} {Provider}/{Service}/{Gateway} Неизвестная ошибка state={oldState} {ErrCode}"); Log($"{tid} {Number}{Card} {Account} {Provider}/{Service}/{Gateway} Неизвестная ошибка state={oldState} {ErrCode}\r\nОтвет CyberPlat\r\n{stAnswer}"); return; } else { state = 12; } break; } } if ((oldState == 0 || oldState == 1) && ErrCode == 7 && Price != decimal.MinusOne && Price != 0M) { errDesc = string.Format("({0}) Неверная сумма, ожидается: {1}", errCode, XConvert.AsAmount(Price)); } else { errDesc = CyberError(lastError); } }
/// <summary> /// Создание запроса CHECK/PAY/STATUS /// </summary> /// <returns></returns> public int MakeRequest(bool status = false) { // ParamBuilder pb = new ParamBuilder(null, true); StringBuilder prm = new StringBuilder(); string s_text = ""; try { prm.AppendLine("SD", SD); prm.AppendLine("AP", AP); prm.AppendLine("OP", OP); prm.AppendLine("SESSION", "OLDIGW" + tid.ToString()); if (!status) { if (!string.IsNullOrEmpty(ben)) // Бенефициар { //1839361 GetReason(); prm.AppendLine("NUMBER", ""); prm.AppendLine("ACCOUNT", fio); StringBuilder purpose = new StringBuilder(); purpose.Append("BENTYPE-corporate"); if (!string.IsNullOrEmpty(ben)) { purpose.AppendFormat("||BEN-{0}", ben); } if (!string.IsNullOrEmpty(inn)) { purpose.AppendFormat("||BENINN-{0}", inn); } if (!string.IsNullOrEmpty(kpp)) { purpose.AppendFormat("||BENKPP-{0}", kpp); } if (!string.IsNullOrEmpty(account)) { purpose.AppendFormat("||BENACC-{0}", account); } if (!string.IsNullOrEmpty(bik)) { purpose.AppendFormat("||BENBANKBIK-{0}", bik); } if (!string.IsNullOrEmpty(reason)) { purpose.AppendFormat("||REASON-{0}", reason); } if (tax != -1) { purpose.AppendFormat("||REASON_FAT-{0}", tax == 0 ? "no_FAT" : tax == 10 ? "FAT10" : "FAT18"); } if (!string.IsNullOrEmpty(address)) { purpose.AppendFormat("||PAYER_ADDRESS-{0}", address); } purpose.Append("||PRIORITY-05"); if (!string.IsNullOrEmpty(kbk)) { purpose.AppendFormat("||KBK-{0}", kbk); } if (!string.IsNullOrEmpty(okato)) { purpose.AppendFormat("||OKTMO-{0}", okato); } prm.AppendLine("PURPOSE", purpose.ToString()); } else { prm.AppendLine("NUMBER", number); prm.AppendLine("CARD", card); prm.AppendLine("FIO", fio); prm.AppendLine("INN", Inn); if (Gateway == "3477" && !string.IsNullOrEmpty(Account) && Account == "-1") { prm.Append("ACCOUNT=\r\n"); } else { prm.AppendLine("ACCOUNT", Account); } prm.AppendLine("DOCNUM", docnum); prm.AppendLine("DOCDATE", docdate); prm.AppendLine("PURPOSE", purpose); prm.AppendLine("ADDRESS", address); } // Если установлены дополнительные процедуры для шаблона - использовать их if (Attributes != null && Attributes.Count > 0) { StringBuilder sb = new StringBuilder(); sb.Append("Дополнительные атрибуты: "); foreach (string key in Attributes.Keys) { string name = key; string value = Attributes[key]; if (!string.IsNullOrEmpty(value)) { prm.AppendLine(key.ToUpper(), value); sb.AppendFormat("{0}={1};", key.ToUpper(), value); } /* * switch(key.ToLower()) * { * case "payer_fio": * prm.AppendLine("PAYER_FIO", value); * sb.AppendFormat("{0}={1};", "PAYER_FIO", value); * break; * case "payer_address": * prm.AppendLine("PAYER_ADDRESS", value); * sb.AppendFormat("{0}={1};", "PAYER_ADDRESS", value); * break; * case "payer_doc": * prm.AppendLine("PAYER_DOC", value); * sb.AppendFormat("{0}={1};", "PAYER_DOC", value); * break; * } */ } Log(sb.ToString()); } prm.AppendLine("INN", Inn); prm.AppendLine("CONTACT", contact); prm.AppendLine("AMOUNT", XConvert.AsAmount(amount)); prm.AppendLine("AMOUNT_ALL", XConvert.AsAmount(amountAll)); prm.AppendLine("COMMENT", Comment); if (agree != 0) { prm.AppendLine("AGREE", agree); } } prm.AppendLine("ACCEPT_KEYS", ProvidersSettings.Cyber.BankKeySerial); lock (TheLock) { IPriv.SignMessage(prm.ToString(), out stRequest, out s_text, secret_key_path, passwd); } /* * if (Settings.LogLevel.IndexOf("REQ") != -1) * Log("\r\nПодготовлен запрос:\r\n{0}\r\n", s_text); */ Log($"{Session}\r\n=====================================================\r\n{prm.ToString()}"); Log($"-----------------------------------------------------\r\n{stRequest}\r\n---------------------------------------"); errCode = 0; errDesc = null; return(0); } catch (IPrivException ie) { errDesc = string.Format("IPRIV: Sign={0} {1}", ie.code, ie.ToString()); if (ie.code == -13) { if (status) { state = 3; errCode = 1; } else { state = 0; errCode = 7; } return(0); } else { errCode = ie.code; state = 11; } } catch (Exception ex) { // errCode = 11; errDesc = ex.Message; // if (state == 1) // state = 0; errCode = -1; state = 11; } RootLog($"{tid} {Number}{Card} {Account} {Provider}/{Service}/{Gateway}\r\n{ErrDesc}"); return(1); }
/// <summary> /// Загрузка записей реестра из БД /// </summary> void LoadRecors() { RegisterRecord r; // = new RegisterRecord(); int cnt = 0; using (SqlConnection cnn = new SqlConnection(Settings.ConnectionString)) using (SqlCommand cmd = new SqlCommand("OLDIGW.VER3_MakeRegister", cnn)) { cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.Parameters.AddWithValue("DateFrom", Datefrom); cmd.Parameters.AddWithValue("DateTo", Dateto); cmd.Parameters.Add("Rid", System.Data.SqlDbType.BigInt).Direction = System.Data.ParameterDirection.Output; cmd.Parameters.Add("TotalPayments", System.Data.SqlDbType.Int).Direction = System.Data.ParameterDirection.Output; cmd.Parameters.Add("TotalSum", System.Data.SqlDbType.Decimal).Direction = System.Data.ParameterDirection.Output; cmd.Parameters.Add("TotalDebt", System.Data.SqlDbType.Decimal).Direction = System.Data.ParameterDirection.Output; cmd.Parameters["TotalSum"].Scale = 2; cmd.Parameters["TotalSum"].Precision = 16; cmd.Parameters["TotalDebt"].Scale = 2; cmd.Parameters["TotalDebt"].Precision = 16; cmd.Connection.Open(); using (SqlDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { r = new RegisterRecord(); dr.GetValue("Outtid", out r.Outtid); dr.GetValue("Pcdate", out r.Pcdate); dr.GetValue("Tid", out r.Tid); dr.GetValue("TppId", out r.Tppid); dr.GetValue("Phone", out r.Phone); dr.GetValue("Opcode", out r.Opcode); dr.GetValue("Account", out r.Account); dr.GetValue("CUR", out r.Currency); dr.GetValue("Amount", out r.Amount); dr.GetValue("PIC", out r.PIC); dr.GetValue("Debt", out r.Debt); body.Enqueue(r); cnt++; } } rid = Convert.ToInt64(cmd.Parameters["Rid"].Value); totalPayments = Convert.ToInt32(cmd.Parameters["TotalPayments"].Value); totalSum = Convert.ToDecimal(cmd.Parameters["TotalSum"].Value, CultureInfo.InvariantCulture); totalDebt = Convert.ToDecimal(cmd.Parameters["TotalDebt"].Value, CultureInfo.InvariantCulture); Log("Rid={0} count={1}({4}) sum={2} debt={3}", rid, totalPayments, XConvert.AsAmount(totalSum), XConvert.AsAmount(totalDebt), cnt); Console.WriteLine("Rid={0} count={1}({4}) sum={2} debt={3}", rid, totalPayments, XConvert.AsAmount(totalSum), XConvert.AsAmount(totalDebt), cnt); } // r = null; }
/// <summary> /// Печать параметров /// </summary> /// <param name="Proc"></param> /// <param name="Before"></param> void WriteLog(string Proc, bool Before = true) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("[{0}] {1} {2}: {3} = {4}", IpAddress, Before? "до выполнения": "после выполнения", Proc, "CardNumber", CardNumber); sb.AppendFormat(", Point={0}", Point_oid); sb.AppendFormat(", Agent={0}", Agent_oid); sb.AppendFormat(", Seria={0}", Seria); sb.AppendFormat(", PIN={0}", PIN); sb.AppendFormat(", PINout={0}", PINout); sb.AppendFormat(", Template={0}", Template_tid); Log(sb.ToString()); if (Mode != null) { Log("[{0}] {1} {2}: {3} = {4}", IpAddress, Before? "до выполнения": "после выполнения", Proc, "Mode", Mode); } if (!string.IsNullOrEmpty(OutTid)) { Log("[{0}] {1} {2}: {3} = {4}", IpAddress, Before? "до выполнения": "после выполнения", Proc, "Outtid", OutTid); } if (Tid != null) { Log("[{0}] {1} {2}: {3} = {4}", IpAddress, Before? "до выполнения": "после выполнения", Proc, "Tid", Tid); } if (State != null) { Log("[{0}] {1} {2}: {3} = {4}", IpAddress, Before? "до выполнения": "после выполнения", Proc, "State", State); } foreach (string name in Session.Keys) { // if (!string.IsNullOrEmpty(Session[name])) Log("[{0}] {1} {2}: {3} = {4}", IpAddress, Before? "до выполнения": "после выполнения", Proc, name, Session[name]); } sb.Clear(); foreach (string name in Params.Keys) { if (!string.IsNullOrEmpty(Params[name])) { sb.AppendFormat("{0}={1};", name, Params[name]); } } if (sb.ToString().Length > 0) { Log("[{0}] {1} {2}: Parms = \"{3}\"", IpAddress, Before? "до выполнения": "после выполнения", Proc, sb.ToString()); } if (!string.IsNullOrEmpty(FieldName)) { Log("[{0}] {1} {2}: {3} = {4}", IpAddress, Before? "до выполнения": "после выполнения", Proc, "FiledName", FieldName); Log("[{0}] {1} {2}: {3} = {4}", IpAddress, Before? "до выполнения": "после выполнения", Proc, "FieldValue", FieldValue); } sb.Clear(); foreach (string name in GorodFields.Keys) { if (!string.IsNullOrEmpty(GorodFields[name])) { sb.AppendFormat("{0}={1};", name, GorodFields[name]); } } if (sb.ToString().Length > 0) { Log("[{0}] {1} {2}: Fields = \"{3}\"", IpAddress, Before? "до выполнения": "после выполнения", Proc, sb.ToString()); } sb.Clear(); if (Balance != null || NewBalance != null || Amount != null || NewAmount != null || Commission != null || NewCommission != null) { sb.AppendFormat("[{0}] {1} {2}: ", IpAddress, Before? "до выполнения": "после выполнения", Proc); if (Balance != null) { sb.AppendFormat("Balance = {0}; ", XConvert.AsAmount(Balance)); } if (NewBalance != null) { sb.AppendFormat("NewBalance = {0}; ", XConvert.AsAmount(NewBalance)); } if (Amount != null) { sb.AppendFormat("Amount = {0}; ", XConvert.AsAmount(Amount)); } if (NewAmount != null) { sb.AppendFormat("NewAmount = {0}; ", XConvert.AsAmount(NewAmount)); } if (Commission != null) { sb.AppendFormat("Commission = {0}; ", XConvert.AsAmount(Commission)); } if (NewBalance != null) { sb.AppendFormat("NewCommission = {0}; ", XConvert.AsAmount(NewCommission)); } Log(sb.ToString()); } Log("[{0}] {1} {2}: {3} = {4}", IpAddress, Before? "до выполнения": "после выполнения", Proc, "Status", Status); Log("[{0}] {1} {2}: {3} = {4}", IpAddress, Before? "до выполнения": "после выполнения", Proc, "ErrCode", ErrCode); Log("[{0}] {1} {2}: {3} = {4}", IpAddress, Before? "до выполнения": "после выполнения", Proc, "ErrDesc", ErrDesc); }