/// <summary> /// Создаёт запрос check/pay/status /// </summary> /// <param name="old_state"></param> /// <returns></returns> public override int MakeRequest(int old_state) { StringBuilder p = new StringBuilder(); try { pcdate = Pcdate.AddHours(-1); } catch (Exception) { pcdate = DateTime.Now.AddHours(-1); } operdate = DateTime.Now.AddHours(-1); try { // выполнить проверку возможности платежа и вернуть баланс счёта if (old_state == 0) { ReqType = "queryPayeeInfo"; p.AppendFormat("reqType={0}", ReqType); if (!string.IsNullOrEmpty(SvcTypeID)) { p.AppendFormat("&svcTypeId={0}", HttpUtility.UrlEncode(SvcTypeID)); } p.AppendFormat("&svcNum={0}", SvcNum); if (!string.IsNullOrEmpty(Phone) && Provider == "rt") { p.AppendFormat("&svcNum=7{0}", SvcNum); } if (!string.IsNullOrEmpty(SvcSubNum)) { p.AppendFormat("&svcSubNum={0}", SvcSubNum); } p.Append("&queryFlags=13"); // Остаток на счёте p.AppendFormat("&agentAccount={0}", agentAccount); // Остаток на счёте } // Создать запрос Pay else if (old_state == 1) { ReqType = "createPayment"; p.AppendFormat("reqType={0}", ReqType); p.AppendFormat("&srcPayId={0}", Tid); if (!string.IsNullOrEmpty(SvcTypeID)) { p.AppendFormat("&svcTypeId={0}", HttpUtility.UrlEncode(SvcTypeID)); } // p.AppendFormat("&svcNum={0}", SvcNum); if (!string.IsNullOrEmpty(Phone) && Provider == "rt") { p.AppendFormat("&svcNum=7{0}", SvcNum); } else { p.AppendFormat("&svcNum={0}", SvcNum); } if (!string.IsNullOrEmpty(SvcSubNum)) { p.AppendFormat("&svcSubNum={0}", SvcSubNum); } // Непустой для РТ-Мобайл // if (!string.IsNullOrEmpty(agentAccount)) // p.AppendFormat("&payTime={0}", HttpUtility.UrlEncode(XConvert.AsDateTZ(Pcdate, Settings.Tz))); p.AppendFormat("&payTime={0}", HttpUtility.UrlEncode(XConvert.AsDateTZ(Operdate, Settings.Tz))); p.AppendFormat("&reqTime={0}", HttpUtility.UrlEncode(XConvert.AsDateTZ(Pcdate, Settings.Tz))); p.AppendFormat("&payAmount={0}", (int)(Amount * 100m)); p.AppendFormat("&agentAccount={0}", agentAccount); // PayDetails = string.Format("{0}|{1}|{3}", SvcSubNum, PayAmount, PayPurpose); p.Append("&payCurrId=RUB"); p.Append("&payPurpose=0"); p.AppendFormat("&payComment={0}", HttpUtility.UrlEncode(Comment)); } // Создать запрос Status else if (old_state == 3) { if (queryFlag != "") { p.Append("reqType=getPaymentStatus"); if (!string.IsNullOrEmpty(Account)) { p.AppendFormat("&svcNum={0}", Account); } if (!string.IsNullOrEmpty(AccountParam)) { p.AppendFormat("&svcSubNum={0}", AccountParam); } if (SvcTypeID != "") { p.AppendFormat("&svcTypeId={0}", HttpUtility.UrlEncode(SvcTypeID)); } p.AppendFormat("&queryFlags={0}", queryFlag); } else if (Tid != 0 && Tid != int.MinValue) { p.Append("reqType=getPaymentStatus"); } else { p.Append("reqType=getPaymentsStatus"); } if (Tid != 0 && Tid != int.MinValue) { p.AppendFormat("&srcPayId={0}", Tid); } if (StatusType != null) { p.AppendFormat("&statusType={0}", StatusType); } if (StartDate != null) { p.AppendFormat("&startDate={0}", HttpUtility.UrlEncode(XConvert.AsDateTZ(StartDate, Settings.Tz))); } if (EndDate != null) { p.AppendFormat("&endDate={0}", HttpUtility.UrlEncode(XConvert.AsDateTZ(EndDate, Settings.Tz))); } // Непустой для РТ-Мобайл // if (!string.IsNullOrEmpty(agentAccount)) p.AppendFormat("&agentAccount={0}", agentAccount); } // Запрос на отмену платежа else if (old_state == 8) { ReqType = "abandonPayment"; p.AppendFormat("reqType={0}", ReqType); p.AppendFormat("&srcPayId={0}", Tid); p.AppendFormat("&reqTime={0}", HttpUtility.UrlEncode(XConvert.AsDateTZ(Pcdate, Settings.Tz))); // Непустой для РТ-Мобайл // if (!string.IsNullOrEmpty(agentAccount)) p.AppendFormat("&agentAccount={0}", agentAccount); } else { errCode = 2; errDesc = string.Format("Неизвестное состояние ({0}) платежа", old_state); state = 11; Log(ErrDesc); RootLog(ErrDesc); return(1); } } catch (Exception ex) { RootLog("{0}\r\n{1}", ex.Message, ex.StackTrace); } // p.AppendFormat("&reqTime={0}", UrlEncode(XConvert.AsDateTZ(Pcdate))); // stRequest = HttpUtility.UrlEncode(p.ToString()).Replace(HttpUtility.UrlEncode("&"), "&").Replace(HttpUtility.UrlEncode("="), "="); stRequest = p.ToString(); Log("\r\nComment: {0}", SvcComment); // Log("Запрос к {0}\r\n=======================================\r\n{1}", Host, stRequest.Replace("&", "\r\n")); // Log(stRequest); // stRequest = HttpUtility.UrlEncode(stRequest); // Log(" \r\n--------------------------------------\r\n{0}", stRequest.Replace("%26", "\r\n")); return(0); }
/// <summary> /// Финансовы контроль /// </summary> protected virtual bool FinancialCheck(bool newPay) { string x = null; // Если тип терминала не определён: считаем терминал и включаем финюконтроль // if (State == 0 && (tt == 1 || tt == 3)) // Если только новый платёж if (State == 0) { if (!string.IsNullOrEmpty(Phone)) { x = Phone; } else if (!string.IsNullOrEmpty(Account) && string.IsNullOrEmpty(Number) && string.IsNullOrEmpty(Card)) // Если задан Number, то используется он { x = Account; } else if (!string.IsNullOrEmpty(Number) && string.IsNullOrEmpty(Card)) // Если только не задан Card { x = Number; } else if (!string.IsNullOrEmpty(Card)) { x = Card; } else { RootLog($"{Tid} [FCHK] {Provider} {Service}/{Gateway} Не задан номер счёта"); return(false); } // Проверим в чёрном списке (не важно, хоть с сайта) if (FindInBlackList(x)) { return(true); } // Если номер телефона в списке исключаемых завершить финансовый контроль if (FindInLists(Settings.Lists, x, 1) == 1) // Найден в белом списке { RootLog($"{Tid} [FCHK] Provider={Provider} {Service}/{Gateway} Num=\"{x}\" найден в белом списке, завершение проверки"); return(false); } // Получаем тип терминала из БД Город // 1 - Терминал // 2 - Рабочее место // 3 - Сайт List <CheckedProvider> ProviderList = LoadProviderList(); int tt = Terminal == 281 ? 3 : TerminalType; string trm = Terminal != int.MinValue ? Terminal.ToString() : "NOREG"; // Ищем переопределение для агента. GetAgentFromList(); RootLog($"{Tid} [FCHK] Для агента AgentID=\"{AgentId}\" заданы параметры: Limit={AmountLimit.AsCurrency()} Delay={AmountDelay} часов Notify={Notify}"); foreach (var item in ProviderList) { string _provider = string.IsNullOrEmpty(Provider) ? "": Provider.ToLower(); string _service = string.IsNullOrEmpty(Service) ? "" : Service.ToLower(); string _gateway = string.IsNullOrEmpty(Gateway) ? "" : Gateway.ToLower(); if (_provider == item.Name.ToLower() && _service == item.Service.ToLower() && _gateway == item.Gateway.ToLower() && item.TerminalType == tt) { // Переопределяем правило лимитов для провайдера amountLimit = item.Limit > amountLimit? item.Limit: AmountLimit; // check = true; RootLog($"{Tid} [FCHK] Переопределение для {Provider} {Service}/{Gateway} Type={tt}: AmountLimit={AmountLimit.AsCF()}"); break; } } // Строго больше! if (AmountAll > AmountLimit && Pcdate.AddHours(AmountDelay) >= DateTime.Now) // Проверка отправки СМС { // RootLog($"{Tid} [FCHK] {Provider} {Service}/{Gateway} Trm={Terminal} Limit={AmountLimit.AsCF()} Amount{AmountAll.AsCF()}"); // RootLog($"{Tid} [FCHK] {Provider} {Service}/{Gateway} Pcdate+delay={Pcdate.AddHours(AmountDelay).AsCF()} Limit={AmountLimit.AsCF()} Amount{AmountAll.AsCF()}"); state = 0; errCode = 11; errDesc = $"[Фин.кон-ль] Отложен до {Pcdate.AddHours(AmountDelay)}"; UpdateState(Tid, state: State, errCode: ErrCode, errDesc: ErrDesc, locked: 0); RootLog($"{Tid} [FCHK] {Provider} {Service}/{Gateway} Trm={Terminal} Acc={x} A={Amount.AsCF()} S={AmountAll.AsCF()} Limit={AmountLimit.AsCF()} - Отложен до {Pcdate.AddHours(AmountDelay).AsCF()}"); // Отправить СМС-уведомление, усли список уведомлений не пуст // Отправлять СМС только для терминалов if (newPay && !string.IsNullOrEmpty(Notify) && TerminalType == 1) { SendNotification(Notify, $"Num={x} S={AmountAll.AsCF()} Trm={Terminal} блок до {Pcdate.AddHours(AmountDelay).AsCF()}"); } // Не найден в белом списке - на контроль! return(true); } // Если меньше допустимого лимита, не ставить на контроль RootLog($"{Tid} [FCHK - stop] {Service}/{Gateway} Num=\"{x}\" сумма платежа {AmountAll.AsCurrency()} меньше общего лимита {AmountLimit.AsCurrency()}, завершение проверки"); } return(false); }