protected void OnProcessCompleted(TerminalProcessingOutcome po)
        {
            try
            {
                if (po == null) //exception occurred
                {
                    return;
                }

                switch (po.NextProcessState)
                {
                case EMVTerminalPreProcessingStateEnum.EndProcess:
                    cardQProcessor.StopServiceQProcess();
                    ProcessCompleted?.Invoke(this, new TerminalProcessingOutcomeEventArgs()
                    {
                        TerminalProcessingOutcome = po
                    });
                    break;

                default:
                    throw new DesFireException("Unimplemeted TerminalPreProcessingStateEnum in OnProcessCompleted");
                }
            }
            catch (Exception ex)
            {
                Logger.Log("Error in OnProcessCompleted:" + ex.Message);
                return;
            }
        }
Esempio n. 2
0
        private void Ta_ProcessCompleted(object sender, EventArgs e)
        {
            try
            {
                TerminalProcessingOutcome tpo = (e as TerminalProcessingOutcomeEventArgs).TerminalProcessingOutcome;
                if (tpo == null)//error occurred, error displayed via Ta_ExceptionOccured
                {
                    return;
                }


                if (tpo.UIRequestOnOutcomePresent)
                {
                    SetStatusLabel(string.Format("{0}\n{1}", tpo.UserInterfaceRequest.MessageIdentifier, tpo.UserInterfaceRequest.Status));
                }
            }
            catch (Exception ex)
            {
                ta.CancelTransactionRequest();
                SetStatusLabel(ex.Message);
            }
            finally
            {
                SetProcessButtonEnabled(true);
                SetInstallButtonEnabled(true);
            }
        }
        public void CancelTransactionRequest()
        {
            cardQProcessor.StopServiceQProcess();
            //StopServiceQProcess();
            if (cancellationTokenForPreProcessing != null)
            {
                cancellationTokenForPreProcessing.Cancel();
            }

            TerminalProcessingOutcome processingOutcomeOUT = new TerminalProcessingOutcome()
            {
                NextProcessState          = EMVTerminalPreProcessingStateEnum.EndProcess,
                UIRequestOnOutcomePresent = true
            };
            UserInterfaceRequest uird = new UserInterfaceRequest()
            {
                MessageIdentifier = MessageIdentifiersEnum.ClearDisplay,
                Status            = StatusEnum.ReadyToRead
            };

            processingOutcomeOUT.UserInterfaceRequest = uird;
            OnProcessCompleted(processingOutcomeOUT);
        }
        private async void Ta_ProcessCompleted(object sender, EventArgs e)
        {
            try
            {
                int?            amount = Validate.AmountToCents(totalAmount.Total);
                TransactionType transactionType;
                string          fromAccountNumber    = "";
                string          cardSerialNumberFrom = "";
                string          toAccountNumber      = "";
                string          cardSerialNumberTo   = "";

                SetStatusLabel("Remove card");
                TerminalProcessingOutcome tpo = (e as TerminalProcessingOutcomeEventArgs).TerminalProcessingOutcome;
                if (tpo == null)//error occurred, error displayed via Ta_ExceptionOccured
                {
                    return;
                }

                if (tpo is DesfireTerminalProcessingOutcome)
                {
                    string uid = Formatting.ByteArrayToHexString(((DesfireTerminalProcessingOutcome)tpo).CardDetails.UID);

                    switch (flowType)
                    {
                    case FlowType.SendMoneyFromCardToApp:
                        toAccountNumber      = SessionSingleton.Account.AccountNumberId;
                        cardSerialNumberFrom = uid;
                        transactionType      = TransactionType.SendMoneyFromCardToApp;
                        break;

                    case FlowType.SendMoneyFromAppToCard:
                        fromAccountNumber  = SessionSingleton.Account.AccountNumberId;
                        cardSerialNumberTo = uid;
                        transactionType    = TransactionType.SendMoneyFromAppToCard;
                        break;

                    default:
                        throw new Exception("Unknown flow type:" + flowType);
                    }

                    await CallTransactWebService(fromAccountNumber, toAccountNumber, cardSerialNumberFrom, cardSerialNumberTo, amount, transactionType);

                    Device.BeginInvokeOnMainThread(() =>
                    {
                        lblTransactSummary.Text = "Transaction Completed Succesfully";
                        UpdateView(ViewState.Step3Summary);
                    });
                }
                else
                {
                    SetStatusLabel(string.Format("{0}\n{1}", tpo.UserInterfaceRequest.MessageIdentifier, tpo.UserInterfaceRequest.Status));
                }
            }
            catch (Exception ex)
            {
                Device.BeginInvokeOnMainThread(() =>
                {
                    lblTransactSummary.Text = ex.Message;
                    UpdateView(ViewState.Step3Summary);
                });
            }
        }
Esempio n. 5
0
        private void ProcessCompletion(TerminalProcessingOutcomeEventArgs e, InterFaceType interFaceType)
        {
            TLV      data = null;
            TLV      discretionaryData = null;
            QRDEList qrData            = null;

            try
            {
                long?amount = Convert.ToInt64(totalAmount.Total);

                TerminalProcessingOutcome tpo = e.TerminalProcessingOutcome;
                if (tpo == null)//error occurred, error displayed via Ta_ExceptionOccured
                {
                    return;
                }

                if (tpo is EMVTerminalProcessingOutcome)
                {
                    data = ((EMVTerminalProcessingOutcome)tpo).DataRecord;
                    discretionaryData = ((EMVTerminalProcessingOutcome)tpo).DiscretionaryData;
                    qrData            = ((EMVTerminalProcessingOutcome)tpo).QRData;

                    if (data != null) //error
                    {
                        SetStatusLabel(new UIMessageEventArgs(MessageIdentifiersEnum.RemoveCard, StatusEnum.EndProcessing), interFaceType);

                        //may be a contactless magstripe transaction
                        if (data.Children.Get(EMVTagsEnum.CRYPTOGRAM_INFORMATION_DATA_9F27_KRN.Tag) == null)
                        {
                            txResult = TxResult.ContactlessMagOnline;
                        }
                        else
                        {
                            if (((data.Children.Get(EMVTagsEnum.CRYPTOGRAM_INFORMATION_DATA_9F27_KRN.Tag).Value[0] & 0xC0) >> 6) == (byte)ACTypeEnum.ARQC)
                            {
                                if (interFaceType == InterFaceType.Contact)
                                {
                                    throw new EMVProtocolException("Invalid state for contact, gen ac 2 returned arqc?");
                                }

                                CARDHOLDER_VERIFICATION_METHOD_CVM_RESULTS_9F34_KRN cvmr = new CARDHOLDER_VERIFICATION_METHOD_CVM_RESULTS_9F34_KRN(data.Children.Get(EMVTagsEnum.CARDHOLDER_VERIFICATION_METHOD_CVM_RESULTS_9F34_KRN.Tag));
                                if (cvmr.Value.GetCVMPerformed() == CVMCode.EncipheredPINVerifiedOnline)
                                {
                                    ContactlessApp_PinRequest(data.Children);
                                }

                                txResult = TxResult.ContactlessOnline;
                            }
                            if (((data.Children.Get(EMVTagsEnum.CRYPTOGRAM_INFORMATION_DATA_9F27_KRN.Tag).Value[0] & 0xC0) >> 6) == (byte)ACTypeEnum.TC)
                            {
                                txResult = TxResult.Approved;
                            }
                            if (((data.Children.Get(EMVTagsEnum.CRYPTOGRAM_INFORMATION_DATA_9F27_KRN.Tag).Value[0] & 0xC0) >> 6) == (byte)ACTypeEnum.AAC)
                            {
                                txResult = TxResult.Declined;
                            }
                        }
                    }
                    else if (qrData != null)
                    {
                        if (interFaceType == InterFaceType.QRCodeScanned)
                        {
                            txResult = TxResult.QRCodeScanned;
                        }
                        else if (interFaceType == InterFaceType.QRCodeToPoll)
                        {
                            txResult = TxResult.QRCodeToPoll;
                        }
                    }
                    else
                    {
                        txResult = TxResult.Declined;
                    }

                    SetTxFinalResultLabel(txResult.ToString());
                }
                else
                {
                    SetStatusLabel(new UIMessageEventArgs(tpo.UserInterfaceRequest.MessageIdentifier, tpo.UserInterfaceRequest.Status), interFaceType);
                }
            }
            catch (Exception ex)
            {
                Device.BeginInvokeOnMainThread(() =>
                {
                    UIMessageEventArgs ui = new UIMessageEventArgs(MessageIdentifiersEnum.TryAgain, StatusEnum.ProcessingError)
                    {
                        AdditionalMessage = ex.Message
                    };
                    SetStatusLabel(ui, interFaceType);
                });
            }
            finally
            {
                StopContactPaymentApp();
                StopContactlessPaymentApp();
                StopQRCodePollPaymentApp();

                #region Merge EMV Lists
                if (discretionaryData != null)
                {
                    if (data != null)
                    {
                        data.Children.AddListToList(discretionaryData.Children);
                    }
                }
                #endregion

                TxCompleted?.Invoke(this, new TxCompletedEventArgs(txResult, interFaceType, Optional <TLV> .Create(data), Optional <QRDEList> .Create(qrData)));
            }
        }
        private async void Ta_ProcessCompleted(object sender, EventArgs e)
        {
            try
            {
                int?amount = Validate.AmountToCents(totalAmount.Total);

                TransactionType transactionType;
                string          fromAccountNumber    = "";
                string          cardSerialNumberFrom = "";
                string          toAccountNumber      = "";
                string          cardSerialNumberTo   = "";

                TerminalProcessingOutcome tpo = (e as TerminalProcessingOutcomeEventArgs).TerminalProcessingOutcome;
                if (tpo == null)//error occurred, error displayed via Ta_ExceptionOccured
                {
                    return;
                }

                if (tpo is EMVTerminalProcessingOutcome)
                {
                    TLV dataRecord        = ((EMVTerminalProcessingOutcome)tpo).DataRecord;
                    TLV discretionaryData = ((EMVTerminalProcessingOutcome)tpo).DiscretionaryData;

                    if (dataRecord != null) //error or decline
                    {
                        SetStatusLabel("Remove card");

                        if (discretionaryData != null)
                        {
                            dataRecord.Children.AddListToList(discretionaryData.Children);
                        }

                        string emvData = TLVasJSON.ToJSON(dataRecord);

                        byte[] panBCD;
                        TLV    _5A = dataRecord.Children.Get(EMVTagsEnum.APPLICATION_PRIMARY_ACCOUNT_NUMBER_PAN_5A_KRN.Tag);
                        if (_5A != null)
                        {
                            panBCD = _5A.Value;
                        }
                        else
                        {
                            TLV _57 = dataRecord.Children.Get(EMVTagsEnum.TRACK_2_EQUIVALENT_DATA_57_KRN.Tag);
                            if (_57 == null)
                            {
                                throw new Exception("No PAN found");
                            }
                            String panString = Formatting.ByteArrayToHexString(_57.Value);
                            panBCD = Formatting.StringToBcd(panString.Split('D')[0], false);
                        }

                        switch (flowType)
                        {
                        case FlowType.SendMoneyFromCardToApp:
                            toAccountNumber      = SessionSingleton.Account.AccountNumberId;
                            cardSerialNumberFrom = Formatting.BcdToString(panBCD);
                            transactionType      = TransactionType.SendMoneyFromCardToApp;
                            break;

                        default:
                            throw new Exception("Unknown flow type:" + flowType);
                        }

                        try
                        {
                            await CallPosTransactWebService(fromAccountNumber, toAccountNumber, cardSerialNumberFrom, cardSerialNumberTo, amount, transactionType, emvData);

                            Device.BeginInvokeOnMainThread(() =>
                            {
                                lblTransactSummary.Text = "Transaction Completed Succesfully";
                                UpdateView(ViewState.Step3Summary);
                            });
                        }
                        catch (Exception ex)
                        {
                            Device.BeginInvokeOnMainThread(() =>
                            {
                                lblTransactSummary.Text = "Declined, could not go online.";
                                UpdateView(ViewState.Step3Summary);
                            });
                        }
                    }
                    else
                    {
                        SetStatusLabel(string.Format("{0}\n{1}", tpo.UserInterfaceRequest.MessageIdentifier, tpo.UserInterfaceRequest.Status));
                    }
                }
            }
            catch (Exception ex)
            {
                Device.BeginInvokeOnMainThread(() =>
                {
                    lblTransactSummary.Text = ex.Message;
                    UpdateView(ViewState.Step3Summary);
                });
            }
        }