예제 #1
0
        /// <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.");
                }
            }
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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);
        }