コード例 #1
0
        /// <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());
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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());
        }
コード例 #4
0
        /// <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);
        }
コード例 #5
0
 /// <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);
     }
 }
コード例 #6
0
        /// <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}");
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        /// <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
コード例 #9
0
        /// <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);
        }
コード例 #10
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());
            }
        }
コード例 #11
0
        /// <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);
            }
        }
コード例 #12
0
        /// <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);
        }
コード例 #13
0
        /// <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;
        }
コード例 #14
0
        /// <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);
        }