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()); }
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); }
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); }
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); }
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); }
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)); }
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); }
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};"); }
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); }
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(); }
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); }