示例#1
0
        /// <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);
        }
示例#2
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);
        }