private void SetBackHeader(PS_ERIP temp)
        {
            var    paylist    = temp?.ResponseReq?.PayRecord;
            string PrevHeader = null;
            var    payrec     = paylist?.FirstOrDefault();

            if (payrec == null)
            {
                return;
            }
            if (paylist?.Count == 1)
            {
                PrevHeader = payrec.Name;
                if (payrec.GetPayListType == "0")
                {
                    PrevHeader = null;
                }
            }
            else
            {
                PrevHeader = payrec.GroupRecord?.Name;
            }
            HeaderHistory.BackTo(PrevHeader, true);
            LabelCurrent = HeaderHistory.CurrentHeader;
        }
        private async Task SendConfirmRequest(PS_ERIP confirmRequestArg)
        {
            Ex.Log($"{nameof(XmlTransactionsManager)}.{nameof(SendConfirmRequest)}()");
            bool   success  = false;
            int    interval = 10;
            string request  = await Serialize(confirmRequestArg);

            while (!success)
            {
                var response = await GetEripResponse(request);

                if (response.ResponseReq.ErrorCode == 0)
                {
                    success = true;
                }
                Ex.Log($"{nameof(SendConfirmRequest)}(): ConfirmResponse Error={response.ResponseReq.ErrorCode};");
                if (confirmRequestArg?.ResponseReq?.PayRecord?.FirstOrDefault()?.PaymentID == null)
                {
                    break;
                }
                await Task.Delay(interval * 1000);

                if (interval < 1400)
                {
                    interval *= 3;
                }
            }
        }
        private string AssembleRunOpResponCheck(PS_ERIP responArg)
        {
            var CheckRunOpResp = new StringBuilder();

            try
            {
                responArg.ResponseReq.PayRecord.FirstOrDefault()?.Check?.CheckHeader?.CheckLine?.ForEach(x =>
                {
                    CheckRunOpResp.AppendLine(x?.Value);
                    Ex.Try(x?.Value != null, () =>
                    {
                        if (x.Value.Contains("Дата платежа"))
                        {
                            var mustLength  = x.Value.Length;
                            var str         = "Код платежа:";
                            var emptyLength = mustLength - str.Length - lastKioskReceipt.Length;
                            if (emptyLength >= 0)
                            {
                                var emptyStr = "                                                                           "
                                               .trySubstring(0, emptyLength);
                                CheckRunOpResp.AppendLine($"{str}{emptyStr}{lastKioskReceipt}");
                            }
                        }
                    });
                });
            }
            catch (Exception ex)
            {
                ex.Log();
            }

            return(CheckRunOpResp?.ToString());
        }
Example #4
0
 public static PS_ERIP SetPosError(this PS_ERIP eripArg, MDOM_POS arg)
 {
     try
     {
         if (arg.EnumType == PosQAType.PURResponse)
         {
             eripArg.EnumType = EripQAType.POSPayResponse;
         }
         if (arg.EnumType == PosQAType.VOIResponse)
         {
             eripArg.EnumType = EripQAType.POSCancelResponse;
         }
         if (arg.EnumType == PosQAType.UnknownResponse)
         {
             eripArg.EnumType = EripQAType.UnknownResponse;
         }
         eripArg.ResponseReq.ErrorCode = arg.ResponseReq.ErrorCode ?? 0;
         eripArg.ResponseReq.ErrorText = arg.ResponseReq.ErrorText;
         if (arg.ResponseReq.ErrorCode == 16)
         {
             eripArg.ResponseReq.KioskError = arg.ResponseReq.ResponseCode ?? eripArg.ResponseReq.KioskError;
             eripArg.ResponseReq.ErrorText  = arg.ResponseReq.VisualHostResponse ?? eripArg.ResponseReq.ErrorText;
         }
     }
     catch (Exception ex) { ex.Log(); }
     return(eripArg);
 }
Example #5
0
        public MDOM_POS GetCancelVOIRequest(PS_ERIP reqArg)
        {
            string KioskReceipt = reqArg.ResponseReq.KioskReceipt;
            string PC_ID        = reqArg.ResponseReq.PayRecord?.FirstOrDefault()?.PC_ID;

            return(GetCancelVOIRequest(PC_ID, KioskReceipt));
        }
        private async Task <string> Serialize(PS_ERIP argReq)
        {
            XDocument reqXml = await SerializationUtil.Serialize(argReq);

            string request = reqXml?.ToString();

            return(request);
        }
Example #7
0
        public static PS_ERIP PsEripCreate()
        {
            var item = new PS_ERIP();

            item.ResponseReq.TerminalID = StaticMain.Settings.ERIP.TerminalID;
            item.ResponseReq.Version    = StaticMain.Settings.ERIP.version;
            return(item);
        }
        private async Task <PS_ERIP> GetEripResponse(string request)
        {
            Ex.Log($"{nameof(XmlTransactionsManager)}.{nameof(GetEripResponse)}()");
            XDocument responseXml = await PostGetHTTP.PostStringGetXML(StaticMain.Settings.ERIP.url, request);

            PS_ERIP response = await SerializationUtil.Deserialize <PS_ERIP>(responseXml);

            return(response);
        }
Example #9
0
 public static PS_ERIP Accept(this PS_ERIP eripArg, PS_ERIP arg)
 {
     try
     {
         eripArg.ResponseReq.TerminalID = arg.ResponseReq.TerminalID ?? eripArg.ResponseReq.TerminalID;
         eripArg.ResponseReq.Version    = arg.ResponseReq.Version ?? eripArg.ResponseReq.Version;
     }
     catch (Exception ex) { ex.Log(); }
     return(eripArg);
 }
        private async Task <PS_ERIP> Transaction(PS_ERIP reqArg = null)
        {
            string request = await Serialize(reqArg ?? list.Current.Request);

            var response = await GetEripResponse(request);

            list.SetResponse(response);
            await HandleResponseWithoutUI(response);

            return(response);
        }
        private async Task <PS_ERIP> GetConfirmRequest(PS_ERIP RespRunOper, string argConfirmCode)
        {
            Ex.Log($"{nameof(XmlTransactionsManager)}.{nameof(GetConfirmRequest)}()");
            PS_ERIP confirmReq = Factory.PsEripCreate();

            confirmReq.EnumType = EripQAType.ConfirmRequest;
            confirmReq.ResponseReq.PayRecord = RespRunOper.ResponseReq.PayRecord.Copy();
            confirmReq.Accept(this.Request)?.ConfirmClear();
            confirmReq.ResponseReq.PayRecord[0].KioskReceipt = RespRunOper.ResponseReq.KioskReceipt.Copy();
            confirmReq.ResponseReq.PayRecord[0].ConfirmCode  = argConfirmCode;
            //string req = await Serialize(confirmReq);
            //PS_ERIP resp = await GetEripResponse(req);
            return(confirmReq);
        }
Example #12
0
 public static PS_ERIP RunOpRequestClear(this PS_ERIP eripArg)
 {
     try
     {
         PayRecord payrec = eripArg.ResponseReq.PayRecord[0];
         Ex.TryLog(() => payrec.Lookups        = null);
         Ex.TryLog(() => payrec.Check          = null);
         Ex.TryLog(() => payrec.GroupRecord    = null);
         Ex.TryLog(() => payrec.GetPayListType = null);
         Ex.TryLog(() => payrec.StornoMode     = null);
     }
     catch (Exception ex) { ex.Log(); }
     return(eripArg);
 }
        public async Task <PS_ERIP> HomeRequest()
        {
            isBackToCurrent = false;
            PS_ERIP req = null;;

            if (list.Count <= 0)
            {
                await CreateInitialRequest();
            }
            else
            {
                req = list.HomePage().Request;
            }
            return(await Transaction(req));
        }
Example #14
0
 public static PS_ERIP Accept(this PS_ERIP eripArg, MDOM_POS arg)
 {
     try
     {
         eripArg.ResponseReq.PayDate      = arg?.ResponseReq?.PayDate;
         eripArg.ResponseReq.KioskReceipt = arg?.ResponseReq?.KioskReceipt;
         eripArg.ResponseReq.PAN          = arg?.ResponseReq?.PAN;
         eripArg.ResponseReq.TypePAN      = arg?.ResponseReq?.TypePAN;
         eripArg.ResponseReq.KioskReceipt = arg?.ResponseReq?.KioskReceipt;
         var payrec = eripArg.ResponseReq?.PayRecord?.FirstOrDefault();
         payrec.PC_ID = arg.ResponseReq?.PC_ID;
     }
     catch (Exception ex) { ex.Log(); }
     return(eripArg);
 }
        public async Task <PS_ERIP> NextRequest(object arg = null)
        {
            Ex.Log($"{nameof(XmlTransactionsManager)}.{nameof(NextRequest)}()");
            isBackToCurrent = true;
            await CheckForNULL();

            PS_ERIP eripBody = await HandleResponseFromUI(arg);

            isBackToCurrent = false;
            list.CreateNextPage(eripBody);
            if (eripBody.EnumType == EripQAType.POSPayResponse || eripBody.EnumType == EripQAType.POSCancelResponse)
            {
                return(eripBody);
            }
            return(await Transaction());
        }
        private async Task <PS_ERIP> HandleResponseFromUI(object param)
        {
            Ex.Log($"{nameof(XmlTransactionsManager)}.{nameof(HandleResponseFromUI)}()");
            PS_ERIP @return      = null;
            var     rootResponse = list.Current.Response;

            if (rootResponse.EnumType == EripQAType.GetPayListResponse)
            {
                var paylist = rootResponse.ResponseReq.PayRecord;
                if (paylist.Count > 1)
                {
                    if (param is PayRecord)
                    {
                        PayRecord payrecArg   = param as PayRecord;
                        var       requestCopy = list.Current.Request.Copy();
                        requestCopy.ResponseReq.PayCode = payrecArg.Code;
                        return(requestCopy);
                    }
                }
                if (paylist.Count == 1)
                {
                    if (param is PS_ERIP)
                    {
                        PS_ERIP eripArg     = param as PS_ERIP;
                        PS_ERIP requestCopy = null;
                        //if (eripArg.ResponseReq.PaySumma != null)
                        //{
                        //    requestCopy = list.Current.Request.Copy();
                        //    requestCopy.ResponseReq.PaySumma = eripArg.ResponseReq.PaySumma;
                        //}
                        PayRecord payrecArg = eripArg.ResponseReq.PayRecord.FirstOrDefault();
                        return(await HandlePayRecordParam(payrecArg, requestCopy));
                    }
                    if (param is PayRecord)
                    {
                        PayRecord payrecArg = param as PayRecord;
                        return(await HandlePayRecordParam(payrecArg));
                    }
                }
                if (paylist.Count <= 0)
                {
                    Ex.Throw($"{nameof(HandleResponseFromUI)}(): paylist.Count <= 0)");
                }
            }
            return(@return);
        }
Example #17
0
        public void CreateNextPage(PS_ERIP item)
        {
            var page = new RequestNavigation();

            if (item.EnumType == EripQAType.POSPayResponse)
            {
                page.SetResponse(item);
            }
            else
            {
                page.Request = item;
            }

            page.SetPrevIndex(currentIndex);
            this.Add(page);
            Ex.Log($"{nameof(XmlHistory)}.{nameof(CreateNextPage)}(): curr={currentIndex} prev={list[currentIndex].PrevIndex};");
            Ex.Log($"{nameof(XmlHistory)}.{nameof(CreateNextPage)}(): currReq={Current?.Request?.EnumType} prevReq={PrevTransaction?.Request?.EnumType};");
        }
Example #18
0
 public static PS_ERIP ConfirmClear(this PS_ERIP eripArg)
 {
     try
     {
         PayRecord payrec = eripArg.ResponseReq.PayRecord[0];
         Ex.TryLog(() => payrec.AttrRecord    = null);
         Ex.TryLog(() => payrec.Check         = null);
         Ex.TryLog(() => payrec.Lookups       = null);
         Ex.TryLog(() => payrec.PayCommission = null);
         Ex.TryLog(() => payrec.Summa         = null);
         Ex.TryLog(() => payrec.PayAll        = null);
         Ex.TryLog(() => payrec.Currency      = null);
         Ex.TryLog(() => payrec.Fine          = null);
         //Ex.TryLog(() => payrec.ClaimID = null);
         Ex.TryLog(() => payrec.AttrRecord = null);
     }
     catch (Exception ex) { ex.Log(); }
     return(eripArg);
 }
Example #19
0
 public static PS_ERIP ClearAttrRecords(this PS_ERIP eripArg)
 {
     try
     {
         eripArg.ResponseReq.PayRecord[0].AttrRecord.ForEach(attr =>
         {
             attr.MinLength = null;
             attr.MaxLength = null;
             attr.Min       = null;
             attr.Max       = null;
             attr.Mandatory = null;
             attr.Lookup    = null;
             attr.Type      = null;
             attr.Hint      = null;
         });
     }
     catch (Exception ex) { ex.Log(); }
     return(eripArg);
 }
        private void BuildErrorPage(PS_ERIP rootResponse)
        {
            var    resp = rootResponse.ResponseReq;
            string str  = $"{resp.ErrorText}";

            if (rootResponse.EnumType == EripQAType.POSPayResponse)
            {
                str = $"Оплата не была произведена.\n\nОшибка {resp.ErrorCode}: {resp.ErrorText};";
                if (resp.ErrorCode != 128 && resp.ErrorCode != 16)
                {
                    Ex.Error($"Unknown POS Error:\nОшибка {resp.ErrorCode}: {resp.ErrorText};");
                }
            }
            if (resp.ErrorCode == 128) //timeout 30s
            {
                str = $"Истекло время ожидания карты.(Код 128)\nОплата не была произведена.\n\nПопробуйте еще раз.";
            }
            if (resp.ErrorCode == 16) //canceled by user
            {
                //string tempStr = $"Отменено пользователем.(Код 16)\nОплата не была произведена.";
                str = $"Ошибка {resp.KioskError}: {resp.ErrorText}";
            }
            Ex.Info($"View Error Page building: response={rootResponse.EnumType} displayed to user:\n{str}");
            var control = Controls.CentralLabelBorder(str);

            control.Foreground = Brushes.DarkRed;
            var pic = Controls.IconBig(PackIconKind.CloseCircleOutline, Brushes.Red);

            idleDetector.ChangeIdleTimeRestart(idleTimeAfterPayment * 2);
            views.AddControl(pic);
            views.AddControl(control);
            var button = Controls.ButtonAccept("Вернуться");

            button.ButtonControl.Command = vmodel.HomePageCommand;
            views.AddControl(new TextBlock());
            views.AddControl(new TextBlock());
            views.AddControl(button);
        }
 private Task CheckRunOperationResponse(PS_ERIP responArg)
 {
     if (responArg.EnumType == EripQAType.RunOperationResponse)
     {
         Ex.Log($"{nameof(XmlTransactionsManager)}.{nameof(CheckRunOperationResponse)}()");
         string confirmArg = "0";
         if (responArg.ResponseReq.ErrorCode == 0)// УСПЕХ RunOper
         {
             confirmArg = "1";
             list.Current.SetBackToHome();
             string CheckRunOpResp = AssembleRunOpResponCheck(responArg);
             this.lastPCID         = null;
             this.lastKioskReceipt = null;
             RunPrintingsAnotherThread(CheckRunOpResp);
         }
         if (responArg.ResponseReq.ErrorCode != 0) //ОШИБКА RunOper
         {
             confirmArg = "0";
             CancelPayPOS().RunAsync();
         }
         ConfirmTransactionAsync(responArg, confirmArg).RunAsync();
     }
     return(Task.CompletedTask);
 }
        private async Task CreateInitialRequest()
        {
            PS_ERIP homeErip = Factory.PsEripHomeCreate();

            list.CreateNextPage(homeErip);
        }
        private async Task <PS_ERIP> HandlePayRecordParam(PayRecord payrecArg, PS_ERIP requestArg = null)
        {
            PS_ERIP @return = null;

            if (payrecArg == null)
            {
                Ex.Throw <ArgumentNullException>($"{nameof(HandlePayRecordParam)}(): PayRecord argument = null");
            }
            PS_ERIP requestCopy = requestArg ?? list.Current.Request.Copy();

            if (payrecArg.GetPayListType == "1" || payrecArg.GetPayListType == "2")
            {
                Ex.Log($"{nameof(HandlePayRecordParam)}(): GetPayListType=1/2; SessionID={payrecArg.SessionId}");
                requestCopy.ResponseReq.SessionId  = payrecArg.SessionId;
                requestCopy.ResponseReq.AttrRecord = new List <AttrRecordRequest>();
                payrecArg.AttrRecord.ForEach(attr =>
                {
                    var newAttr    = new AttrRecordRequest(attr);
                    newAttr.Change = 1;
                    requestCopy.ResponseReq.AttrRecord.Add(newAttr);
                });
                return(requestCopy);
            }
            if (payrecArg.GetPayListType == "0")
            {
                Ex.Log($"GetPayListType=0; SessionID={payrecArg.SessionId}");
                Ex.Try(false, () => payrecArg.Summa = payrecArg.Summa.Replace(",", "."));
                lastPOSTransaction.CreatePayPosRequest(payrecArg);
                string request = await Serialize(lastPOSTransaction.Request);

                MDOM_POS PosRespon = await GetPosResponse(request);

                lastPOSTransaction.Response = PosRespon;
                string fakeRespon = @"      <MDOM_POS>
        <PURResponse>
          <ErrorCode>0</ErrorCode>
          <PayDate>04/11/2019 15:54:18</PayDate>
          <KioskReceipt>0002</KioskReceipt>
          <PC_ID>000000000000</PC_ID>
          <PAN>522208******0693</PAN>
          <TypePAN>MS</TypePAN>
          <Receipt>
            *****************************
            DEMO MODE
            ONLY FOR TEST
            ДЕМОНСТРАЦИОННЫЙ РЕЖИМ
            ТОЛЬКО ДЛЯ ТЕСТИРОВАНИЯ
            *****************************
            **** TRAINING MODE ****
            ТЕРМИНАЛ: PTS01001
            Торговец: 0000001
            Тестовый терминал
            Расвиком


            КАРТ-ЧЕК: 990003/000001
            ERN: 2
            * ДЛЯ КЛИЕНТА *
            ОПЛАТА
            04.11.2019
            КАРТА: 522208******0693
            Ввод данных - (CL)
            Сумма                           1.00 BYN
            КОД: 00
            ЗАВЕРШЕНО УСПЕШНО
            КОД АВТ.: XXXXXX
            AID: A0000000041010
            APP: Mastercard
          </Receipt>
        </PURResponse>
      </MDOM_POS>";                                       //FAKE RESPONSE
                    //Ex.Log($"TEST ПОДСТАВА ответа от POS вместо реального");
                if (PosRespon.ResponseReq.ErrorCode == 0) //УСПЕХ POS
                {
                    this.lastPCID         = PosRespon?.ResponseReq?.PC_ID;
                    this.lastKioskReceipt = PosRespon?.ResponseReq?.KioskReceipt;
                    var responCopy = list.Current.Response.Copy();
                    responCopy.EnumType = EripQAType.RunOperationRequest;
                    responCopy.Accept(requestCopy);
                    responCopy.Accept(PosRespon).RunOpRequestClear();;
                    responCopy.ResponseReq.SessionId = payrecArg.SessionId;
                    var payrec = responCopy.ResponseReq.PayRecord.FirstOrDefault();
                    payrec.SessionId = payrecArg.SessionId;
                    Ex.Try(false, () => payrec.Summa = payrec.Summa.Replace(",", "."));
                    responCopy.ClearAttrRecords();
                    return(responCopy);
                }
                if ((PosRespon.ResponseReq.ErrorCode != null && PosRespon.ResponseReq.ErrorCode != 0) || PosRespon.ResponseReq.ErrorCode == null) //ОШИБКА POS
                {
                    var eripResponPosError = Factory.PsEripCreate().SetPosError(PosRespon);
                    if (PosRespon.ResponseReq.ErrorCode == 16)
                    {
                        Task.Run(() =>
                        {
                            try
                            {
                                Font font      = SetFont();
                                var posReceipt = PosRespon.ResponseReq.Receipt;
                                Print(posReceipt, font);
                            }
                            catch (Exception ex)
                            {
                                ex.Show("Print if ErroCode=16");
                            }
                        }).RunAsync();
                    }
                    return(eripResponPosError);
                }
            }
            return(@return);
        }
 private async Task HandleResponseWithoutUI(PS_ERIP response)
 {
     await CheckRunOperationResponse(response);
 }
        private async Task ConfirmTransactionAsync(PS_ERIP responArg, string confirmArg)
        {
            PS_ERIP confirmRequest = await GetConfirmRequest(responArg, confirmArg);

            SendConfirmRequest(confirmRequest).RunAsync();
        }
Example #26
0
 public XmlHistory SetResponse(PS_ERIP argResponse)
 {
     Ex.Log($"{nameof(XmlHistory)}.{nameof(SetResponse)}() before: CurrRespon={Current?.Response?.EnumType}, newRespon={argResponse};");
     this.Current.SetResponse(argResponse);
     return(this);
 }