/// <summary> /// Ждём статус 12 /// </summary> void Wait12() { Log($"{Tid} [BLACK] {Account} - Ожидание отмены платежа"); // Пратёж из BlackList ещё не установлен в Городе в статус 12. // Будем ждать! int time = 0; while (true) { // Ожидаем 10 сек. Thread.Sleep(10000); // Проверяем состояние платежа GetGorodState(); Log($"{Tid} [BLACK] {Account} S={AmountAll.AsCF()} New state={State}"); if (State == 12) { break; } time += 1; if (time >= 600) { Log($"{Tid} [BLACK] {Account} S={AmountAll.AsCF()} Timeout."); throw new ApplicationException($"{Tid} [BLACK] {Account} S={AmountAll.AsCF()} Timeout."); } } }
/// <summary> /// Создание строки ответа /// </summary> void MakeAnswer() { stResponse = "<Response>\r\n"; stResponse += $"\t<UniqID>{Session}</UniqID>\r\n"; stResponse += $"\t<ErrCode>{ErrCode}</ErrCode>\r\n"; stResponse += $"\t<ErrDesc>{ErrDesc}</ErrDesc>\r\n"; if (!string.IsNullOrEmpty(Fam)) { stResponse += $"\t<Fam>{Fam.ToUpper()}</Fam>\r\n"; } if (!string.IsNullOrEmpty(Name)) { stResponse += $"\t<Name>{Name.ToUpper()}</Name>\r\n"; } if (!string.IsNullOrEmpty(SName)) { stResponse += $"\t<SName>{SName.ToUpper()}</SName>\r\n"; } stResponse += $"\t<FIO>{Fio.ToUpper()}</FIO>\r\n"; stResponse += $"\t<GKID>{GKID}</GKID>\r\n"; stResponse += $"\t<TID>{TemplateTid}</TID>\r\n"; stResponse += $"\t<Balance>{Balance.AsCF()}</Balance>\r\n"; stResponse += $"\t<Appendix>{Bank}</Appendix>\r\n"; stResponse += "</Response>\r\n"; Log("Подготовлен ответ:\r\n{0}", stResponse); }
/// <summary> /// Проверка дневного лимита пользователя сайта /// </summary> /// <returns></returns> public bool DayLimitExceeded(bool New) { int account = 0; decimal pays = 0M; try { // Получить номер лицевого счёта плательщика if ((account = GetPayerAccount()) != 0) { // RootLog($"{Tid} [DLIM] Проверка дневного лимита."); // Чтение информации о переопределении для Account RedefineForAccount(account); RootLog($"{Tid} [DLIM] Проверка дневного лимита {account} лимит={DayLimit.AsCF()} разовый={OnePayment.AsCF()}"); pays = PaysInTime(account); if (pays + Amount > DayLimit) { RootLog($"{Tid} [DLIM] Превышен дневной лимит для {account} Сумма= {(pays + Amount).AsCF()} Лимит= {DayLimit.AsCF()}"); state = 0; errCode = 12; errDesc = $"[Фин.кон-ль] превышен дневной лимт. Отложен."; UpdateState(Tid, state: State, errCode: ErrCode, errDesc: ErrDesc, locked: 0); // Ищем переопределение для агента. // GetAgentFromList(); // RootLog($"{Tid} [DLIM] Для агента AgentID=\"{AgentId}\" заданы параметры: Limit={AmountLimit.AsCurrency()} Delay={AmountDelay} часов Notify={Notify}"); // Сообщать о превышении не будем СМС !!! // Отправить СМС-уведомление, усли список уведомлений не пуст // if (New && State == 0) // SendNotification(Notify, $"Payer={account} S={AmountAll.AsCF()} превышен дневной лимит."); // RootLog($"{Tid} [DLIM - stop] {Service}/{Gateway} Card={account} Pays={(pays + Amount).AsCF()} Lim={DayLimit.AsCF()} превышен дневной лимт - State={State}"); return(true); } if (Amount > OnePayment) { RootLog($"{Tid} [DLIM - stop] Превышен размер разового платежа для {account} Платёж= {Amount.AsCF()} Лимит= {OnePayment.AsCF()}"); state = 0; errCode = 12; errDesc = $"[Фин.кон-ль] превышен разовый платёж. Отложен."; UpdateState(Tid, state: State, errCode: ErrCode, errDesc: ErrDesc, locked: 0); return(true); } // Добавить платёж в Pays if (New && State == 0) { AddPay(account); } RootLog($"{Tid} [DLIM] Account={account} Конец проверки."); } } catch (Exception ex) { RootLog($"{Tid} [DLIM] Ph={Phone} Ac={Account} Number={Number}\r\n{ex}"); } return(false); }
/// <summary> /// Проверка баланса счёта агента /// </summary> /// <returns></returns> bool CheckBalance() { RootLog($"{Tid} [Rapida.CheckBalance - start] {Session}"); string Result = Get(Host + $"?function=getbalance&PaymExtId={Session}"); // Если ршибка SSL-соединения попробуем ещё раз if ((WebExceptionStatus)ErrCode == WebExceptionStatus.SecureChannelFailure && Attempts++ < 5) { Wait(20); return(CheckBalance()); } // Получение статуса запроса string sResult = XPath.GetString(Result, "/Response/Result"); errDesc = XPath.GetString(Result, "/Response/Description"); // Если запрос завершился с ошибкой вернем -1 if (sResult.ToUpper() != "OK") { errCode = XPath.GetInt(Result, "/Response/ErrCode").Value; state = 12; // Ошибка на стороне сервиса РАРИДА RootLog($"{Tid} [Rapida.CheckBalance - finish] {Session} Result={sResult} {ErrDesc}"); return(false); } // Проверка баланса Balance = XPath.GetDec(Result, "/Response/Data/Balance").Value; if (Balance < Amount) { RootLog($"{Tid} [Rapida.CheckBalance - finish] {Session} Баланс {Balance} меньше размера платежа. Сервис приостанавливается\r\nResult={sResult}: {ErrDesc}"); errCode = 12; errDesc = "Шлюз временно заблокирован"; state = 0; return(false); } else { RootLog($"{Tid} [Rapida.CheckBalance - finish] {Session} {Service} sResult={sResult} Balance={Balance.AsCF()} Amount={Amount.AsCF()}"); } errCode = 0; state = 1; return(true); }