コード例 #1
0
        public void NewComponent()
        {
            Iso8583Message message      = new Iso8583Message();
            object         newComponent = message.NewComponent();

            Assert.IsTrue(newComponent is Iso8583Message);
        }
コード例 #2
0
ファイル: Procesr.cs プロジェクト: tobeoct/SwitchManager
        public void RouteToDestination(Iso8583Message message, SinkNode sinknode)
        {
            int maxNumberOfEntries = 3;
            int serverTimeOut      = 60000;


            ClientPeer clientPeer = new Client().StartClient(sinknode);

            int retries = 0;

            while (retries < maxNumberOfEntries)
            {
                if (clientPeer.IsConnected)
                {
                    break;
                }
                else
                {
                    //clientPeer.Close();
                    retries++;
                    clientPeer.Connect();
                }

                Thread.Sleep(5000);
            }

            PeerRequest request = null;

            if (clientPeer.IsConnected)
            {
                request = new PeerRequest(clientPeer, message);
                request.Send();
                request.WaitResponse(serverTimeOut);
                //request.MarkAsExpired();   //uncomment to test timeout

                if (request.Expired)
                {
                    //logger.Log("Connection timeout.");

                    Console.WriteLine("Response received too late"); //Response received too late
                }
                //                    if (request != null)
                //                    {
                //                        response = request.ResponseMessage;
                //                        //logger.Log("Message Recieved From FEP");
                //
                //                    }

                clientPeer.Close();
                //                    return response as Iso8583Message;
            }
            else
            {
                //logger.Log("Could not connect to Sink Node");
                //clientPeer.Close();
                Console.WriteLine("Client Peer is not Connected");
            }

            //clientPeer.Close();
        }
コード例 #3
0
        public void Clone()
        {
            Iso8583Message message = new Iso8583Message(1200);

            // Add fields.
            for (int i = 0; i < _fields.Length; i++)
            {
                message.Fields.Add(_fields[i]);
            }

            message.Header = new StringMessageHeader("HEADER");

            Iso8583Message cloned = ( Iso8583Message)message.Clone();

            Assert.IsTrue(cloned.Fields.Count == message.Fields.Count);
            Assert.IsNotNull(cloned.Header);
            Assert.IsTrue(cloned.MessageTypeIdentifier == message.MessageTypeIdentifier);

            Assert.IsTrue(message.Header != cloned.Header);
            for (int i = 0; i < _fields.Length; i++)
            {
                Assert.IsTrue(message[_fields[i].FieldNumber] !=
                              cloned[_fields[i].FieldNumber]);
            }
        }
コード例 #4
0
        public void CopyTo()
        {
            Iso8583Message src = new Iso8583Message(1200);
            Iso8583Message dst = new Iso8583Message(1100);

            Assert.IsTrue(src.Fields.Count == 0);
            Assert.IsNull(src.Header);
            Assert.IsTrue(dst.Fields.Count == 0);
            Assert.IsNull(dst.Header);

            // Add fields.
            for (int i = 0; i < _fields.Length; i++)
            {
                src.Fields.Add(_fields[i]);
            }

            src.Header = new StringMessageHeader("HEADER");

            Assert.IsTrue(src.Fields.Count == _fields.Length);

            src.CopyTo(dst);

            Assert.IsTrue(src.MessageTypeIdentifier == dst.MessageTypeIdentifier);
            Assert.IsTrue(dst.Fields.Count == _fields.Length);
            Assert.IsNotNull(dst.Header);

            Assert.IsTrue(src.Header != dst.Header);
            for (int i = 0; i < _fields.Length; i++)
            {
                Assert.IsTrue(src[_fields[i].FieldNumber] !=
                              dst[_fields[i].FieldNumber]);
            }
        }
コード例 #5
0
        public void IsNetworkManagement()
        {
            Iso8583Message message = new Iso8583Message();

            message.MessageTypeIdentifier = 1110;
            Assert.IsFalse(message.IsNetworkManagement());

            message.MessageTypeIdentifier = 1210;
            Assert.IsFalse(message.IsNetworkManagement());

            message.MessageTypeIdentifier = 1310;
            Assert.IsFalse(message.IsNetworkManagement());

            message.MessageTypeIdentifier = 1410;
            Assert.IsFalse(message.IsNetworkManagement());

            message.MessageTypeIdentifier = 1510;
            Assert.IsFalse(message.IsNetworkManagement());

            message.MessageTypeIdentifier = 1610;
            Assert.IsFalse(message.IsNetworkManagement());

            message.MessageTypeIdentifier = 1710;
            Assert.IsFalse(message.IsNetworkManagement());

            message.MessageTypeIdentifier = 1810;
            Assert.IsTrue(message.IsNetworkManagement());
        }
コード例 #6
0
        public void IsFeeCollection()
        {
            Iso8583Message message = new Iso8583Message();

            message.MessageTypeIdentifier = 1110;
            Assert.IsFalse(message.IsFeeCollection());

            message.MessageTypeIdentifier = 1210;
            Assert.IsFalse(message.IsFeeCollection());

            message.MessageTypeIdentifier = 1310;
            Assert.IsFalse(message.IsFeeCollection());

            message.MessageTypeIdentifier = 1410;
            Assert.IsFalse(message.IsFeeCollection());

            message.MessageTypeIdentifier = 1510;
            Assert.IsFalse(message.IsFeeCollection());

            message.MessageTypeIdentifier = 1610;
            Assert.IsFalse(message.IsFeeCollection());

            message.MessageTypeIdentifier = 1710;
            Assert.IsTrue(message.IsFeeCollection());

            message.MessageTypeIdentifier = 1810;
            Assert.IsFalse(message.IsFeeCollection());
        }
コード例 #7
0
        public void IsAdministrative()
        {
            Iso8583Message message = new Iso8583Message();

            message.MessageTypeIdentifier = 1110;
            Assert.IsFalse(message.IsAdministrative());

            message.MessageTypeIdentifier = 1210;
            Assert.IsFalse(message.IsAdministrative());

            message.MessageTypeIdentifier = 1310;
            Assert.IsFalse(message.IsAdministrative());

            message.MessageTypeIdentifier = 1410;
            Assert.IsFalse(message.IsAdministrative());

            message.MessageTypeIdentifier = 1510;
            Assert.IsFalse(message.IsAdministrative());

            message.MessageTypeIdentifier = 1610;
            Assert.IsTrue(message.IsAdministrative());

            message.MessageTypeIdentifier = 1710;
            Assert.IsFalse(message.IsAdministrative());

            message.MessageTypeIdentifier = 1810;
            Assert.IsFalse(message.IsAdministrative());
        }
コード例 #8
0
        static void Listener_Receive(object sender, ReceiveEventArgs e)
        {
            //Cast event sender as ClientPeer
            ListenerPeer sourcePeer = sender as ListenerPeer;

            // Get source node from client - client Name = SourceNode ID
            long sourceID = Convert.ToInt64(sourcePeer.Name); //wher message is coming from

            //then use the ID to retrieve the source node

            //Get the Message received
            Iso8583Message originalMessage = e.Message as Iso8583Message;

            //continue coding
            SourceNode sourceNode = new SourceNode
            {
                Name      = ConfigurationSettings.AppSettings["NodeNameTroughSwitch"],
                IPAddress = ConfigurationSettings.AppSettings["NodeIPThroughSwitch"],
                Port      = ConfigurationSettings.AppSettings["NodePortThroughSwitch"]
            };
            CheckSourceNode checkSourceNode = new CheckSourceNode();

            //checkSourceNode.SourceNode(sourceNode, originalMessage);
            checkSourceNode.SourceNode(originalMessage);
            //originalMessage.SetResponseMessageTypeIdentifier();
            sourcePeer.Send(originalMessage);
            sourcePeer.Listener.Start();
        }
コード例 #9
0
        public void LogTransaction(Iso8583Message message, string type, string narration)
        {
            TransactionLog transactionLog = new TransactionLog();
            double         fee            = ExtractFee(message);

            transactionLog.CardPan = message.Fields[2].Value.ToString();
            if (message.IsRequest())
            {
                transactionLog.ResponseCode = "";
            }
            else
            {
                transactionLog.ResponseCode = message.Fields[39].Value.ToString();
            }
            transactionLog.Amount   = (float)(ExtractAmount(message) + fee);
            transactionLog.Account1 = message.Fields[102].Value.ToString();
            if (message.Fields[103] != null)
            {
                transactionLog.Account2 = message.Fields[103].Value.ToString();
            }

            transactionLog.STAN            = message.Fields[11].Value.ToString();
            transactionLog.TransactionDate = DateTime.Now;
            transactionLog.MTI             = message.MessageTypeIdentifier.ToString();
            transactionLog.TypeOfEntry     = type;
            transactionLog.Narration       = narration;
            //transactionLog.ResponseDescription = message.Fields[39].Value.ToString();

            var _context = new ApplicationDbContext();

            _context.TransactionLogs.Add(transactionLog);
            _context.SaveChanges();
        }
コード例 #10
0
ファイル: Processor.cs プロジェクト: tobeoct/Core-Banking-App
        private static Iso8583Message PerformReversal(Iso8583Message message, ListenerPeer listener)
        {
            var STAN = ExtractSTAN(message);

            message = SetFee(message, 0);
            var transactionsToReverse = _context.TransactionLogs.Where(c => c.STAN.Equals(STAN) && !c.Narration.Equals("Reversal")).ToList();

            try
            {
                string responseCode = null;

                if (transactionsToReverse != null || transactionsToReverse.Count > 0)
                {
                    foreach (var transaction in transactionsToReverse)
                    {
                        if (!transaction.Narration.Equals("Balance Enquiry"))
                        {
                            if (transaction.TypeOfEntry.Equals("Debit"))
                            {
                                if (transaction.Account2 == null)
                                {
                                    bool remote1 = false;
                                    if (transaction.RemoteOnUs == true)
                                    {
                                        remote1 = true;
                                    }

                                    responseCode = CBA.PerformDoubleEntry("Credit", transaction.Account1, transaction.Amount, remote1);
                                    var isoAmt = Convert.ToDouble(FormatTo2Dp(Convert.ToDecimal(transaction.Amount))) * 100;
                                    message.Fields.Add(4, isoAmt.ToString().PadLeft(10, '0'));
                                    new TransactionLogger().LogTransaction(message, "Credit", "Reversal");
                                    transaction.STAN = transaction.STAN + "R";

                                    continue;
                                }
                            }
                            bool remote = false;
                            if (transaction.RemoteOnUs == true)
                            {
                                remote = true;
                            }
                            responseCode = CBA.PerformDoubleEntry("Debit", transaction.Account1, transaction.Amount, remote);
                            var isoAmount = Convert.ToDouble(FormatTo2Dp(Convert.ToDecimal(transaction.Amount))) * 100;
                            message.Fields.Add(4, isoAmount.ToString().PadLeft(10, '0'));
                            new TransactionLogger().LogTransaction(message, "Debit", "Reversal");
                            transaction.STAN = transaction.STAN + "R";
                        }
                    }
                    _context.SaveChanges();
                    message = SetResponseMessage(message, responseCode);
                    message = SendResponseMessage(listener, message);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
            return(message);
        }
コード例 #11
0
        private static Iso8583Message ProcessIntraBankTransfer(Iso8583Message msg, CustomerAccount customerAccount, decimal amount, decimal totalCharges, decimal totalAmt)
        {
            UtilityLogic.LogMessage("Processing Intra-bank transfer");
            GlAccount intraBankTransferIncomeGl = glRepo.GetByName("IntraBankTransferIncomeGl");

            if (intraBankTransferIncomeGl == null)
            {
                msg.Fields.Add(MessageField.RESPONSE_FIELD, ResponseCode.ISSUER_OR_SWITCH_INOPERATIVE);
                return(msg);
            }
            var toAccountNumber = Convert.ToInt64(msg.Fields[MessageField.TO_ACCOUNT_ID_FIELD].Value);
            var toAct           = new CustomerAccountRepository().GetByAccountNumber(toAccountNumber);

            if (toAct == null)
            {
                msg.Fields.Add(MessageField.RESPONSE_FIELD, ResponseCode.NO_SAVINGS_ACCOUNT);
                return(msg);
            }
            if (!(new CustomerAccountLogic().CustomerAccountHasSufficientBalance(customerAccount, totalAmt))) //insufficient balance
            {
                msg.Fields.Add(39, "51");                                                                     //insufficient funds (in the ATM)
                return(msg);
            }

            DebitCustomer(customerAccount, totalAmt);
            CreditCustomer(toAct, amount);
            CreditGl(intraBankTransferIncomeGl, totalCharges);

            msg.Fields.Add(39, "00");       //successful transaction
            UtilityLogic.LogMessage("Transfer executed successfully");
            return(msg);
        }
コード例 #12
0
        public void IsFinancial()
        {
            Iso8583Message message = new Iso8583Message();

            message.MessageTypeIdentifier = 1110;
            Assert.IsFalse(message.IsFinancial());

            message.MessageTypeIdentifier = 1210;
            Assert.IsTrue(message.IsFinancial());

            message.MessageTypeIdentifier = 1310;
            Assert.IsFalse(message.IsFinancial());

            message.MessageTypeIdentifier = 1410;
            Assert.IsFalse(message.IsFinancial());

            message.MessageTypeIdentifier = 1510;
            Assert.IsFalse(message.IsFinancial());

            message.MessageTypeIdentifier = 1610;
            Assert.IsFalse(message.IsAdvice());

            message.MessageTypeIdentifier = 1710;
            Assert.IsFalse(message.IsFinancial());

            message.MessageTypeIdentifier = 1810;
            Assert.IsFalse(message.IsFinancial());
        }
コード例 #13
0
        public void LogTransaction(Iso8583Message message)
        {
            TransactionLog transactionLog = new TransactionLog();

            transactionLog.CardPan = message.Fields[2].Value.ToString();
            if (message.IsRequest())
            {
                transactionLog.ResponseCode = "";
            }
            else
            {
                transactionLog.ResponseCode = message.Fields[39].Value.ToString();
            }
            transactionLog.MTI = message.MessageTypeIdentifier.ToString();

            transactionLog.Amount   = Convert.ToDecimal(message.Fields[4].Value);
            transactionLog.Account1 = message.Fields[102].Value.ToString();
            if (message.Fields[103] != null)
            {
                transactionLog.Account2 = message.Fields[103].Value.ToString();
            }
            transactionLog.STAN            = message.Fields[11].Value.ToString();
            transactionLog.TransactionDate = DateTime.Now;
            //transactionLog.OriginalDataElement = message.Fields[90].Value.ToString();
            //transactionLog.ResponseDescription = message.Fields[39].Value.ToString();

            //EntityLogic<TransactionLog> LogLogic = new EntityLogic<TransactionLog>();
            //LogLogic.Insert(transactionLog);
            //LogLogic.Commit();
            var LogLogic = unitOfwork.EntityRepository <TransactionLog>();

            LogLogic.Save(transactionLog);
        }
コード例 #14
0
        private void ClientPeerOnReceive(object sender, ReceiveEventArgs e)
        {
            ClientPeer clientPeer = sender as ClientPeer;
            //logger.Log("Connected to ==> " + clientPeer.Name);

            Iso8583Message receivedMsg = e.Message as Iso8583Message;
        }
コード例 #15
0
ファイル: Processor.cs プロジェクト: tobeoct/Core-Banking-App
        private static Iso8583Message SetFee(Iso8583Message message, double?fee)
        {
            string feeAmount = ConvertFeeToISOFormat(fee);

            message.Fields.Add(28, feeAmount);
            return(message);
        }
コード例 #16
0
ファイル: Processor.cs プロジェクト: tobeoct/SwitchManager
 private Iso8583Message SetResponseMessage(Iso8583Message message, string responseCode)
 {
     Console.WriteLine("Setting Response Message ...");
     message.SetResponseMessageTypeIdentifier();
     message.Fields.Add(39, responseCode);
     return(message);
 }
コード例 #17
0
        /// <summary>
        /// It ad several fields to the specified message.
        /// </summary>
        /// <param name="message"></param>
        private static void AddFields(Message message)
        {
            message.Fields.Add(3, "999999");
            message.Fields.Add(11, "000001");
            message.Fields.Add(12, "103400");
            message.Fields.Add(13, "1124");
            message.Fields.Add(24, "9");
            message.Fields.Add(41, "TEST1");
            message.Fields.Add(52, new byte[] { 0x15, 0x20, 0x25, 0x30, 0x35, 0x40, 0x45, 0x50 });

            Iso8583Message innerFixedSizeMsg = new Iso8583Message(800);

            innerFixedSizeMsg.Fields.Add(3, "A");
            innerFixedSizeMsg.Fields.Add(6, "123");
            innerFixedSizeMsg.Fields.Add(8, "The key");
            message.Fields.Add(61, innerFixedSizeMsg);
            innerFixedSizeMsg.Parent = message; // This is done by the message formatter.

            Message innerVarSizeMsg = new Message();

            innerVarSizeMsg.Fields.Add(1, "4");
            innerVarSizeMsg.Fields.Add(2, "101");
            innerVarSizeMsg.Fields.Add(4, "John Doe");
            innerVarSizeMsg.Fields.Add(6, "67");
            innerVarSizeMsg.Fields.Add(7, new byte[] { 0x75, 0xB0, 0xB5 });
            message.Fields.Add(62, innerVarSizeMsg);
            innerVarSizeMsg.Parent = message;   // This is done by the message formatter.
        }
コード例 #18
0
        /// <summary>
        /// It ad several fields to the specified message.
        /// </summary>
        /// <param name="message"></param>
        private static void AddAnotherFields(Message message)
        {
            message.Fields.Add(3, "111111");
            message.Fields.Add(11, "1000001");
            message.Fields.Add(12, "103401");
            message.Fields.Add(13, "1224");
            message.Fields.Add(24, "8");
            message.Fields.Add(41, "TEST2");
            message.Fields.Add(52, new byte[] { 0x55, 0x60, 0x65, 0x70, 0x75, 0x80, 0x85, 0x90 });

            Iso8583Message innerFixedSizeMsg = new Iso8583Message(810);

            innerFixedSizeMsg.Fields.Add(3, "B");
            innerFixedSizeMsg.Fields.Add(6, "456");
            innerFixedSizeMsg.Fields.Add(8, "Another key");
            message.Fields.Add(61, innerFixedSizeMsg);
            innerFixedSizeMsg.Parent = message; // This is done by the message formatter.

            Message innerVarSizeMsg = new Message();

            innerVarSizeMsg.Fields.Add(1, "5");
            innerVarSizeMsg.Fields.Add(2, "109");
            innerVarSizeMsg.Fields.Add(4, "John Peter Doe");
            innerVarSizeMsg.Fields.Add(6, "167");
            innerVarSizeMsg.Fields.Add(7, new byte[] { 0x95, 0xA0, 0xA5 });
            message.Fields.Add(62, innerVarSizeMsg);
            innerVarSizeMsg.Parent = message;   // This is done by the message formatter.
        }
コード例 #19
0
        //where (Client_RequestDone) and (Client_RequestCancelled) are methods you need to implement.
        //Their signatures are as follows:


        //When the requested send to a Sink (client) is done
        static void Client_RequestDone(object sender, PeerRequestDoneEventArgs e)
        {
            Iso8583Message response   = e.Request.ResponseMessage as Iso8583Message;
            SourceNode     sourceNode = e.Request.Payload as SourceNode;

            //continue coding
        }
コード例 #20
0
        //When the requested send to a Sink (client) is NOT done
        static void Client_RequestCancelled(object sender, PeerRequestCancelledEventArgs e)
        {
            Iso8583Message message = e.Request.RequestMessage as Iso8583Message;
            SourceNode     source  = e.Request.Payload as SourceNode;

            //continue coding
        }
コード例 #21
0
ファイル: Processor.cs プロジェクト: tobeoct/Core-Banking-App
        private static string ExtractTransactionType(Iso8583Message message)
        {
            string trxType = message.Fields[3].Value.ToString().Substring(0, 2);

            Debug.WriteLine("Trx Type : " + trxType);
            return(trxType);
        }
コード例 #22
0
        public void IsReversalOrChargeBack()
        {
            Iso8583Message message = new Iso8583Message();

            message.MessageTypeIdentifier = 1110;
            Assert.IsFalse(message.IsReversalOrChargeBack());

            message.MessageTypeIdentifier = 1210;
            Assert.IsFalse(message.IsReversalOrChargeBack());

            message.MessageTypeIdentifier = 1310;
            Assert.IsFalse(message.IsReversalOrChargeBack());

            message.MessageTypeIdentifier = 1410;
            Assert.IsTrue(message.IsReversalOrChargeBack());

            message.MessageTypeIdentifier = 1510;
            Assert.IsFalse(message.IsReversalOrChargeBack());

            message.MessageTypeIdentifier = 1610;
            Assert.IsFalse(message.IsReversalOrChargeBack());

            message.MessageTypeIdentifier = 1710;
            Assert.IsFalse(message.IsReversalOrChargeBack());

            message.MessageTypeIdentifier = 1810;
            Assert.IsFalse(message.IsReversalOrChargeBack());
        }
コード例 #23
0
ファイル: Processor.cs プロジェクト: tobeoct/Core-Banking-App
        private static string ExtractSTAN(Iso8583Message message)
        {
            string STAN = message.Fields[11].Value.ToString();

            Debug.WriteLine("STAN : " + STAN);
            return(STAN);
        }
コード例 #24
0
ファイル: Processor.cs プロジェクト: tobeoct/Core-Banking-App
        private static string ExtractRRN(Iso8583Message message)
        {
            string RRN = message.Fields[37].Value.ToString();

            Debug.WriteLine("RRN : " + RRN);
            return(RRN);
        }
コード例 #25
0
ファイル: Processor.cs プロジェクト: tobeoct/Core-Banking-App
        private static string ExtractTerminalID(Iso8583Message message)
        {
            var field41    = message.Fields[41].Value.ToString();
            var terminalID = field41.Substring(1, field41.Length - 1);

            return(terminalID);
        }
コード例 #26
0
ファイル: Processor.cs プロジェクト: tobeoct/SwitchManager
        private Iso8583Message CheckMessageType(Iso8583Message originalMessage, SourceNode sourceNode, out bool returnMessage)
        {
            Console.WriteLine("Checking Message Type ...");
            if (originalMessage.MessageTypeIdentifier == 421 || originalMessage.MessageTypeIdentifier == 420)
            {
                bool           doReversal     = false; //doReversal
                Iso8583Message reversalIsoMsg = null;
                reversalIsoMsg = PerformReversal(originalMessage, out doReversal);

                if (!doReversal)
                {
                    //Reversal already done somewhere else or something went wrong
                    //LogTransaction(reversalIsoMsg);
                    //returnMessage = true to return message in the ProcessMessage method
                    //if returnMessage is false, continue using the message in the ProcessMessage method
                    returnMessage = true;
                    return(reversalIsoMsg);
                }
                //do reversal
                //change message to reversal message
                originalMessage = reversalIsoMsg;
                //LogTransaction(message, sourceNode);
                returnMessage = true;
            }

            returnMessage = false;
            return(originalMessage);
        }
コード例 #27
0
        private static Iso8583Message ProcessPaymentByDeposit(Iso8583Message msg, CbaProcessor.CbaListener.MessageSource msgSource, decimal amount)
        {
            UtilityLogic.LogMessage("Processing payment by deposit");
            if (!(msgSource == CbaListener.MessageSource.OnUs))
            {
                msg.Fields.Add(MessageField.RESPONSE_FIELD, "31"); //bank not supported
                return(msg);
            }
            //Credit custAct and debit AtmGl
            var toAccountNumber = Convert.ToInt64(msg.Fields[MessageField.TO_ACCOUNT_ID_FIELD].Value);
            var toAct           = new CustomerAccountRepository().GetByAccountNumber(toAccountNumber);

            if (toAct == null)
            {
                msg.Fields.Add(MessageField.RESPONSE_FIELD, ResponseCode.NO_SAVINGS_ACCOUNT);
                return(msg);
            }
            var atmGl = new GlAccountRepository().GetByName("ATMGL");

            if (atmGl == null)
            {
                msg.Fields.Add(39, ResponseCode.ISSUER_OR_SWITCH_INOPERATIVE);   //Issuer or switch inoperative.
                return(msg);
            }
            CreditCustomer(toAct, amount);
            DebitGl(atmGl, amount);

            msg.Fields.Add(39, "00");       //successful transaction
            UtilityLogic.LogMessage("Payment Transaction successful");
            return(msg);
        }
コード例 #28
0
ファイル: Merchant.cs プロジェクト: cromwell95/caja-puntonet
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        //[STAThread]
        static void Main(string[] args)
        {
            Console.WriteLine("Is running.");
            VolatileStanSequencer _sequencer;
            Socket        _socket;
            AddressFamily _family;

            _sequencer = new VolatileStanSequencer();
            Iso8583Message echoMsg = new Iso8583Message(800);

            echoMsg.Fields.Add(Field3ProcCode, "990000");
            DateTime transmissionDate = DateTime.Now;

            echoMsg.Fields.Add(Field7TransDateTime, string.Format("{0}{1}", string.Format("{0:00}{1:00}", transmissionDate.Month, transmissionDate.Day), string.Format("{0:00}{1:00}{2:00}", transmissionDate.Hour, transmissionDate.Minute, transmissionDate.Second)));
            echoMsg.Fields.Add(Field11Trace, _sequencer.Increment().ToString());
            echoMsg.Fields.Add(Field24Nii, "101");
            echoMsg.Fields.Add(Field41TerminalCode, "12131415");
            echoMsg.Fields.Add(Field42MerchantCode, "000000852963  ");
            IMessageFormatter _formatter = new Iso8583Bin1987MessageFormatter();

            //formatterContext.GetData();
            echoMsg.Formatter = _formatter;
            //echoMsg.Formatter.Format(echoMsg, ref formatterContext);

            byte[] bBufferRecive;
            byte[] bBuffer = echoMsg.GetBytes();
            byte[] bHeader = Hex2Byte("6000018000");
            int    iTalla  = bBuffer.Length + bHeader.Length;

            byte[] bTalla = Hex2Byte(Convert.ToString(iTalla, 16).PadLeft(4, '0'));
            _family = AddressFamily.InterNetwork;
            _socket = new Socket(_family, SocketType.Stream, ProtocolType.Tcp);
            _socket.Connect("192.168.123.39", 9004);
            _socket.Send(bTalla);
            _socket.Send(bHeader);
            _socket.Send(bBuffer);
            Console.WriteLine(Byte2Hex(bTalla) + Byte2Hex(bHeader) + Byte2Hex(bBuffer));
            _socket.ReceiveTimeout = 10000;
            bBufferRecive          = new byte[_socket.ReceiveBufferSize];
            _socket.Receive(bBufferRecive);
            Hashtable ISO = TransaformaIso(bBufferRecive);

            byte[] bBody = (byte[])ISO["Body"];
            //FormatterContext formatterContext = new FormatterContext(FormatterContext.DefaultBufferSize);
            //formatterContext.Write(bBody);
            ParserContext _parserContext = new ParserContext(bBody.Length);

            _parserContext.Initialize();
            _parserContext.ResizeBuffer(bBody.Length);
            _parserContext.Write(bBody);

            Iso8583Message echoMsgResp = (Iso8583Message)echoMsg.Formatter.Parse(ref _parserContext);

            //echoMsg.Formatter.Format(echoMsg, ref formatterContext);
            Console.WriteLine(Byte2Hex(bBody));
            Console.WriteLine(echoMsgResp.ToString());
            _socket.Close();
            Console.ReadLine();
        }
コード例 #29
0
ファイル: Processor.cs プロジェクト: tobeoct/Core-Banking-App
        private static double ExtractAmount(Iso8583Message message)
        {
            double amount = 0;

            amount = ConvertIsoAmountToDouble(message.Fields[4].Value.ToString());
            Debug.WriteLine("Amount : " + amount);
            return(amount);
        }
コード例 #30
0
ファイル: Processor.cs プロジェクト: tobeoct/Core-Banking-App
        private static string ExtractAccountNumber(Iso8583Message message)
        {
            string accountNumber = "";

            accountNumber = message.Fields[102].Value.ToString();
            Debug.WriteLine("Account Number : " + accountNumber);
            return(accountNumber);
        }
コード例 #31
0
        private Iso8583Message GetReversalMessage(Iso8583Message isoMessage, out bool conReversal)
        {
            conReversal = true;
               string originalDataElement;
               try
               {
               originalDataElement = isoMessage.Fields[90].ToString();
               }
               catch (Exception)
               {
               Logger.Log("Original data element is empty");
               conReversal = false;
               SetReponseMessage(isoMessage, "12");
               isoMessage.MessageTypeIdentifier = 430;
               return isoMessage;
               }

               //originalDataElement = originalDataElement.Remove(0, 23);
               TransactionLog transactionLog = new TransactionLogManager().GetByOriginalDataElement(originalDataElement, out originalDataElement);
               Logger.Log("Original Data Element: " + originalDataElement);
               if (transactionLog == null)
               {
               Logger.Log("\n Transaction log not found");
               conReversal = false;
               SetReponseMessage(isoMessage, "25");
               isoMessage.MessageTypeIdentifier = 430;
               return isoMessage;
               }

               if (transactionLog.IsReversed)
               {
               Logger.Log("\n Transaction has already been reversed");
               conReversal = false;
               SetReponseMessage(isoMessage, "94");
               return isoMessage;
               }

               Logger.Log("\n Continue with reversal");
               isoMessage.Fields.Add(102, transactionLog.Account2);
               isoMessage.Fields.Add(103, transactionLog.Account1);

               return isoMessage;
        }
コード例 #32
0
 private Iso8583Message SetReponseMessage(Iso8583Message isoMessage, string code)
 {
     isoMessage.SetResponseMessageTypeIdentifier();
        isoMessage.Fields.Add(39, code);
        return isoMessage;
 }
コード例 #33
0
        private Iso8583Message ToFEP(Iso8583Message msgToSend, SinkNode sinkNode, out bool needReversal)
        {
            Message response = null;
               string responseMsg = string.Empty;
               needReversal = false;
               try
               {
               if (msgToSend == null)
               {
                   Logger.Log("Iso message is null.");
                   return SetReponseMessage(msgToSend, "20");  //Invalid response
               }

               if (sinkNode == null)
               {
                   Logger.Log("Sink node is null.");
                   return SetReponseMessage(msgToSend, "91");  //Issuer inoperative
               }

               int maxNoRetries = 3;
               int serverTimeout = 60000;

               sinkNode.IsActive = true;
               ClientPeer _clientPeer = new ClientPeer(sinkNode.Name, new TwoBytesNboHeaderChannel(
                       new Iso8583Ascii1987BinaryBitmapMessageFormatter(), sinkNode.IPAddress,
                       Convert.ToInt16(sinkNode.Port)), new Trx.Messaging.BasicMessagesIdentifier(11));
               _clientPeer.Connect();
               Thread.Sleep(1800);
               int retries = 0;
               while (retries < maxNoRetries)
               {
                   if (_clientPeer.IsConnected)
                   {
                       break;
                   }
                   else
                   {
                       _clientPeer.Close();
                       retries++;
                       _clientPeer.Connect();
                   }
                   Thread.Sleep(2000);
               }

               PeerRequest request = null;
               if (_clientPeer.IsConnected)
               {
                   request = new PeerRequest(_clientPeer, msgToSend);
                   request.Send();
                   request.WaitResponse(serverTimeout);
                   //request.MarkAsExpired();   //uncomment to test timeout

                   if (request.Expired)
                   {
                       Logger.Log("Connection timeout.");
                       needReversal = true;
                       return SetReponseMessage(msgToSend, "68");  //Response received too late
                   }
                   if (request != null)
                   {
                       response = request.ResponseMessage;
                       //ResponseMessage = GetResponseMesage(response as Iso8583Message);
                   }
                   return response as Iso8583Message;
               }
               else
               {
                   Console.WriteLine("\n Could not connect to the Sink Node..");
                   Console.BackgroundColor = ConsoleColor.Red;
                   Logger.Log("\n Could not connect to the Sink Node.");
                   return SetReponseMessage(msgToSend, "91");
               }
               }
               catch (Exception ex)
               {
               Logger.Log("ERROR: " + ex.Message);
               return SetReponseMessage(msgToSend, "06");  //Error
               }
        }
コード例 #34
0
        public Iso8583Message ValidateMessage(Iso8583Message originalMessage, int sourceID)
        {
            Logger.Log("\n Enter Validator");
               //get source Node.
               SourceNode sourceNode = new SourceNodeManager().GetByID(sourceID);

               DateTime transmissionDate = DateTime.UtcNow;
               //format TransactionDate
               string transactionDate = string.Format("{0}{1}",
                 string.Format("{0:00}{1:00}", transmissionDate.Month, transmissionDate.Day),
                 string.Format("{0:00}{1:00}{2:00}", transmissionDate.Hour,
                 transmissionDate.Minute, transmissionDate.Second));

               //set Original Data Element
             string originalDataElement = string.Format("{0}{1}{2}", originalMessage.MessageTypeIdentifier.ToString(), originalMessage.Fields[11].ToString(), transactionDate);
               //add original data element to original message
               originalMessage.Fields.Add(90, originalDataElement);

               //Do Message Log
               Logger.LogTransaction(originalMessage, sourceNode);

               //  Check if it is reversal message and do the needful
               if (originalMessage.MessageTypeIdentifier == 421)
               {
               Logger.Log("\n This is a reversal");
               bool conReversal;
               Iso8583Message reversalIsoMsg = GetReversalMessage(originalMessage, out conReversal);
               if (!conReversal)
               {
                   Logger.LogTransaction(reversalIsoMsg);
                   return reversalIsoMsg;
               }
               originalMessage = reversalIsoMsg;
               Logger.LogTransaction(originalMessage, sourceNode);
               }

               string theCardPan = originalMessage.Fields[2].Value.ToString();
               string tranasactionTypeCode = originalMessage.Fields[3].Value.ToString().Substring(0, 2);
               double amount = Convert.ToDouble(originalMessage.Fields[4].Value);
               string orgExpiry = originalMessage.Fields[14].Value.ToString();

               string code = originalMessage.Fields[123].ToString().Substring(13, 2);

               Channel channel = new ChannelManager().GetByCode(code);
               Fee fee = null;
              // string cardPAN = theCardPan.Substring(0, 6);
               Route theRoute = new RouteManager().GetRouteByCardPan(theCardPan.Substring(0, 6));
               TransactionType transactionType = new TransactionTypeManager().GetByCode(tranasactionTypeCode);
               Iso8583Message responseMessage;

               //check if card has expired
               DateTime cardExpiryDate = ParseExpiryDate(orgExpiry);

               if(cardExpiryDate < DateTime.Now)
               {
               responseMessage = SetReponseMessage(originalMessage, "54");         //Expired card
               Logger.LogTransaction(responseMessage, sourceNode);
               return responseMessage;
               }

               if (amount <= 0 && tranasactionTypeCode != "31")
               {
               responseMessage = SetReponseMessage(originalMessage, "13");         //Invalid amount
               Logger.LogTransaction(responseMessage, sourceNode);
               return responseMessage;
               }

               if (theRoute == null)
               {
               Logger.Log("Sink node is null.");
               responseMessage = SetReponseMessage(originalMessage, "15");         //No such issuer
               Logger.LogTransaction(responseMessage, sourceNode);
               return responseMessage;
               }
               SinkNode sinkNode = theRoute.SinkNode;
               if (sinkNode == null)
               {
               Logger.Log("Sink node is null.");
               responseMessage = SetReponseMessage(originalMessage, "91");  //Issuer inoperative
               Logger.LogTransaction(responseMessage, sourceNode);
               return responseMessage;
               }

               Logger.Log("Loading SourceNode Schemes");

               var theSchemes = sourceNode.Schemes;
               Scheme scheme = null;
               try
               {
               scheme = theSchemes.Where(x => x.Route.CardPAN == theCardPan.Substring(0,6)).SingleOrDefault();
               }
               catch (Exception ex)
               {
               Logger.Log("Error: \n" + ex.Message);
               responseMessage = SetReponseMessage(originalMessage, "31"); // Lazy load error : Set correct response code later
               Logger.LogTransaction(responseMessage, sourceNode);
               return responseMessage;
               }

               if (scheme == null)
               {
               responseMessage = SetReponseMessage(originalMessage, "92"); // Route not allowed : Set correct response code later
               Logger.LogTransaction(responseMessage, sourceNode);
               return responseMessage;
               }

              // int panCount = sourceNode.Schemes.Count(x => x.Route == theRoute);
               Logger.Log("Scheme : " + scheme.Name + " Loaded");

               Logger.Log("Getting fee:");
               fee = GetFeeIfTransactionIsAllowed(transactionType, channel, scheme);
               if (fee == null)
               {
               responseMessage = SetReponseMessage(originalMessage, "58"); // Transaction type not allowed in this scheme
               Logger.LogTransaction(responseMessage, sourceNode, scheme);
               return responseMessage;
               }
               else
               {
               originalMessage = SetFee(originalMessage, CalculateFee(fee, amount));
               }
               bool needReversal = false;

               Iso8583Message msgFromFEP = ToFEP(originalMessage, sinkNode, out needReversal);

               Logger.LogTransaction(msgFromFEP, sourceNode, scheme, fee, needReversal);

               return msgFromFEP;
        }
コード例 #35
0
        public static void LogTransaction(Iso8583Message incomingMessage, SourceNode sourceNode = null, Scheme scheme = null, Fee fee = null, bool needReversal = false)
        {
            var instCode = incomingMessage.Fields[2].ToString().Substring(0, 6);
               string transactionTypeCode = (incomingMessage.Fields[3].ToString().Substring(0, 2));
               string channelCode = incomingMessage.Fields[123].ToString().Substring(13, 2);
               string cardPan = incomingMessage.Fields[2].ToString();
               string response = string.Empty;
               string responseCode = string.Empty;
               DateTime transmissionDate = DateTime.UtcNow;

               TransactionLog transactionLog = new TransactionLog();
               try
               {
               transactionLog.MTI = incomingMessage.MessageTypeIdentifier.ToString();
               transactionLog.STAN = incomingMessage.Fields[11].ToString();
               transactionLog.Amount = Convert.ToDouble(incomingMessage.Fields[4].ToString());
               transactionLog.CardPAN = cardPan;
               var channel = new ChannelManager().GetByCode(channelCode);
               if (channel != null)
               {
                   transactionLog.Channel = channel.Name;
               }
               var trnx = new TransactionTypeManager().GetByCode(transactionTypeCode);
               if (trnx != null)
               {
                   transactionLog.TransactionType = trnx.Name;
               }
               transactionLog.SourceNode = sourceNode.Name;
               transactionLog.TransactionDate = transmissionDate;
               transactionLog.DateCreated = DateTime.Now;
               transactionLog.DateModified = DateTime.Now;

               string orDataElt = incomingMessage.Fields[90].ToString();
               int length = orDataElt.Length;
               transactionLog.OriginalDataElement = orDataElt.Length > 19 ? orDataElt.Remove(0, (length - 19)) : orDataElt;

               try
               {
                   responseCode = incomingMessage.Fields[39].Value.ToString();
               }
               catch (Exception) { }

               if (scheme != null)
               {
                   transactionLog.Scheme = scheme.Name;
                   transactionLog.Route = scheme.Route.Name;

                   transactionLog.SinkNode = scheme.Route.SinkNode.Name;
               }

               try
               {
                   string value = incomingMessage.Fields[28].Value.ToString();
                   decimal result = 0;
                   if (Decimal.TryParse(value, out result))
                   {
                       transactionLog.Charge = result;
                   }
               }
               catch (Exception) { }
               if (fee != null)
               {
                   transactionLog.Fee = fee.Name;
               }
               if (responseCode != null)
               {
                   transactionLog.ResponseCode = responseCode;
               }
               if (responseCode != null)
               {
                   transactionLog.ResponseDescription = MessageDefinition.GetResponseDescription(responseCode);
               }
               string acc1 = incomingMessage.Fields[102].Value.ToString();
               string acc2 = incomingMessage.Fields[103].Value.ToString();
               transactionLog.Account1 = acc1;
               transactionLog.Account2 = acc2;
               transactionLog.IsReversePending = needReversal;

               if (incomingMessage.MessageTypeIdentifier.ToString() == "430" && responseCode == "00")
               {
                   transactionLog.IsReversed = true;
                   // SetReversalStatus(incomingMsg, responseCode);  //here
               }

               if (new TransactionLogManager().AddTransactionLog(transactionLog))
               {
                   Log("Transaction log::: " + transactionLog.STAN + " " + transactionLog.TransactionDate);
               }
               else
               {
                   Log("Transaction log::: not successful");
               }
               }
               catch (Exception ex)
               {
               Log("Error occurred while logging transaction \n" + ex.Message);
               Console.ForegroundColor = ConsoleColor.Red;
               }
        }
コード例 #36
0
        private Iso8583Message BuildReversalIsoMessage(TransactionLog log)
        {
            Iso8583Message echoMessage = new Iso8583Message(421);
               try
               {
               echoMessage.Fields.Add(2, log.CardPAN);
               echoMessage.Fields.Add(3, string.Format("{0}2000", "01"));
               echoMessage.Fields.Add(4, log.Amount.ToString());
               DateTime transmissionDate = DateTime.Now;
               echoMessage.Fields.Add(7, string.Format("{0}{1}",
                   string.Format("{0:00}{1:00}", transmissionDate.Month, transmissionDate.Day),
                   string.Format("{0:00}{1:00}{2:00}", transmissionDate.Hour,
                   transmissionDate.Minute, transmissionDate.Second)));
               echoMessage.Fields.Add(11, log.STAN);
               echoMessage.Fields.Add(12, string.Format("{0:00}{1:00}{2:00}", transmissionDate.Hour,
                   transmissionDate.Minute, transmissionDate.Second));
               echoMessage.Fields.Add(13, string.Format("{0:00}{1:00}", transmissionDate.Month, transmissionDate.Day));

               //echoMsg.Fields.Add(15, DateTime.Today.ToString("yyMM"));
               echoMessage.Fields.Add(22, "123");
               echoMessage.Fields.Add(25, "12");
               echoMessage.Fields.Add(28, "C000000");
               echoMessage.Fields.Add(29, "C000000");
               //echoMsg.Fields.Add(30, "C00000000");
               echoMessage.Fields.Add(32, "100002");
               //echoMsg.Fields.Add(35, string.Format("{0}={1:yyMM}", cardPAN, xpiryDate));
               //echoMsg.Fields.Add(37, transactionLog.RetrivalRefNo);
               //echoMsg.Fields.Add(40, "101");
               echoMessage.Fields.Add(41, "1701230J");
               echoMessage.Fields.Add(42, "VIACARD");
               echoMessage.Fields.Add(43, "Yaba, Office, Lagos");
               echoMessage.Fields.Add(49, "566");
               echoMessage.Fields.Add(90, "00000000000000000000000" + log.OriginalDataElement);
               echoMessage.Fields.Add(102, log.Account1);
               echoMessage.Fields.Add(103, log.Account2);
               echoMessage.Fields.Add(123, "01".PadLeft(15, '0'));
               Message inner = new Message();
               inner.Fields.Add(2, "IMNODE_00426629");
               //inner.Fields.Add(3, "ATMsrc      PRUICCsnk   000119000119ICCGroup    ");
               //inner.Fields.Add(20, DateTime.Today.ToString("yyMMdd"));

               echoMessage.Fields.Add(127, inner);
               }
               catch (Exception)
               {
               Logger.Log("Problem building reversal message");
               return null;
               }
               return echoMessage;
        }
コード例 #37
0
 private Iso8583Message SetFee(Iso8583Message message, double feeAmount)
 {
     message.Fields.Add(28, feeAmount.ToString());
        return message;
 }