public void NewComponent() { Iso8583Message message = new Iso8583Message(); object newComponent = message.NewComponent(); Assert.IsTrue(newComponent is Iso8583Message); }
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(); }
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]); } }
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]); } }
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()); }
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()); }
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()); }
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(); }
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(); }
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); }
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); }
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()); }
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); }
private void ClientPeerOnReceive(object sender, ReceiveEventArgs e) { ClientPeer clientPeer = sender as ClientPeer; //logger.Log("Connected to ==> " + clientPeer.Name); Iso8583Message receivedMsg = e.Message as Iso8583Message; }
private static Iso8583Message SetFee(Iso8583Message message, double?fee) { string feeAmount = ConvertFeeToISOFormat(fee); message.Fields.Add(28, feeAmount); return(message); }
private Iso8583Message SetResponseMessage(Iso8583Message message, string responseCode) { Console.WriteLine("Setting Response Message ..."); message.SetResponseMessageTypeIdentifier(); message.Fields.Add(39, responseCode); return(message); }
/// <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. }
/// <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. }
//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 }
//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 }
private static string ExtractTransactionType(Iso8583Message message) { string trxType = message.Fields[3].Value.ToString().Substring(0, 2); Debug.WriteLine("Trx Type : " + trxType); return(trxType); }
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()); }
private static string ExtractSTAN(Iso8583Message message) { string STAN = message.Fields[11].Value.ToString(); Debug.WriteLine("STAN : " + STAN); return(STAN); }
private static string ExtractRRN(Iso8583Message message) { string RRN = message.Fields[37].Value.ToString(); Debug.WriteLine("RRN : " + RRN); return(RRN); }
private static string ExtractTerminalID(Iso8583Message message) { var field41 = message.Fields[41].Value.ToString(); var terminalID = field41.Substring(1, field41.Length - 1); return(terminalID); }
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); }
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); }
/// <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(); }
private static double ExtractAmount(Iso8583Message message) { double amount = 0; amount = ConvertIsoAmountToDouble(message.Fields[4].Value.ToString()); Debug.WriteLine("Amount : " + amount); return(amount); }
private static string ExtractAccountNumber(Iso8583Message message) { string accountNumber = ""; accountNumber = message.Fields[102].Value.ToString(); Debug.WriteLine("Account Number : " + accountNumber); return(accountNumber); }
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; }
private Iso8583Message SetReponseMessage(Iso8583Message isoMessage, string code) { isoMessage.SetResponseMessageTypeIdentifier(); isoMessage.Fields.Add(39, code); return isoMessage; }
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 } }
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; }
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; } }
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; }
private Iso8583Message SetFee(Iso8583Message message, double feeAmount) { message.Fields.Add(28, feeAmount.ToString()); return message; }