/// <summary> /// Collective collect /// </summary> public static async Task <String> Init_HKDME(FinTsClient client, DateTime SettlementDate, List <Pain00800202CcData> PainData, string NumberofTransactions, decimal TotalAmount) { Log.Write("Starting job HKDME: Collective collect money"); client.SEGNUM = SEGNUM.SETInt(3); var TotalAmount_ = TotalAmount.ToString().Replace(",", "."); var connectionDetails = client.ConnectionDetails; string segments = "HKDME:" + client.SEGNUM + ":2+" + connectionDetails.Iban + ":" + connectionDetails.Bic + "+" + TotalAmount_ + ":EUR++" + "+urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.002.02+@@"; var message = pain00800202.Create(connectionDetails.AccountHolder, connectionDetails.Iban, connectionDetails.Bic, SettlementDate, PainData, NumberofTransactions, TotalAmount); segments = segments.Replace("@@", "@" + (message.Length - 1) + "@") + message; if (Helper.IsTANRequired("HKDME")) { client.SEGNUM = SEGNUM.SETInt(4); segments = HKTAN.Init_HKTAN(client, segments); } var TAN = await FinTSMessage.Send(client, FinTSMessage.Create(client, client.HNHBS, client.HNHBK, segments, client.HIRMS)); client.HITAN = Helper.Parse_String(Helper.Parse_String(TAN, "HITAN", "'").Replace("?+", "??"), "++", "+").Replace("??", "?+"); Helper.Parse_Message(client, TAN); return(TAN); }
/// <summary> /// Collect /// </summary> public static string Init_HKDSE(ConnectionDetails connectionDetails, string Payer, string PayerIBAN, string PayerBIC, decimal Amount, string Usage, DateTime SettlementDate, string MandateNumber, DateTime MandateDate, string CreditorIDNumber) { Log.Write("Starting job HKDSE: Collect money"); SEG.NUM = SEGNUM.SETInt(4); string segments = "HKDSE:" + SEG.NUM + ":1+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + "+urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.008.002.02+@@"; var message = pain00800202.Create(connectionDetails.AccountHolder, connectionDetails.IBAN, connectionDetails.BIC, Payer, PayerIBAN, PayerBIC, Amount, Usage, SettlementDate, MandateNumber, MandateDate, CreditorIDNumber); segments = segments.Replace("@@", "@" + (message.Length - 1) + "@") + message; if (Helper.IsTANRequired("HKDSE")) { SEG.NUM = SEGNUM.SETInt(4); segments = HKTAN.Init_HKTAN(segments); } var TAN = FinTSMessage.Send(connectionDetails.Url, FinTSMessage.Create(connectionDetails.HBCIVersion, Segment.HNHBS, Segment.HNHBK, connectionDetails.BlzPrimary, connectionDetails.UserId, connectionDetails.Pin, Segment.HISYN, segments, Segment.HIRMS, SEG.NUM)); Segment.HITAN = Helper.Parse_String(Helper.Parse_String(TAN, "HITAN", "'").Replace("?+", "??"), "++", "+").Replace("??", "?+"); Helper.Parse_Message(TAN); return(TAN); }
/// <summary> /// Account transactions in SWIFT-format /// </summary> /// <param name="connectionDetails">ConnectionDetails object must atleast contain the fields: Url, HBCIVersion, UserId, Pin, Blz, Account, IBAN, BIC</param> /// <param name="anonymous"></param> /// <param name="startDate"></param> /// <param name="endDate"></param> /// <returns> /// Transactions /// </returns> public static List <SWIFTStatement> Transactions(ConnectionDetails connectionDetails, bool anonymous, DateTime?startDate = null, DateTime?endDate = null) { var swiftStatements = new List <SWIFTStatement>(); if (Transaction.INI(connectionDetails, anonymous) == true) { var startDateStr = startDate?.ToString("yyyyMMdd"); var endDateStr = endDate?.ToString("yyyyMMdd"); // Success var BankCode = Transaction.HKKAZ(connectionDetails, startDateStr, endDateStr, null); var Transactions = string.Empty; if (BankCode.Contains("HNSHA")) { Transactions = ":20:STARTUMS" + Helper.Parse_String(BankCode, ":20:STARTUMS", "'HNSHA"); } else // -> Postbank finishes with HNHBS { Transactions = ":20:STARTUMS" + Helper.Parse_String(BankCode, ":20:STARTUMS", "'HNHBS"); } swiftStatements.AddRange(MT940.Serialize(Transactions, connectionDetails.Account)); string BankCode_ = BankCode; while (BankCode_.Contains("+3040::")) { Helper.Parse_Message(BankCode_); var Startpoint = new Regex(@"\+3040::[^:]+:(?<startpoint>[^']+)'").Match(BankCode_).Groups["startpoint"].Value; BankCode_ = Transaction.HKKAZ(connectionDetails, startDateStr, endDateStr, Startpoint); var Transactions_ = ":20:STARTUMS" + Helper.Parse_String(BankCode_, ":20:STARTUMS", "'HNSHA"); swiftStatements.AddRange(MT940.Serialize(Transactions_, connectionDetails.Account)); } return(swiftStatements); } else { Log.Write("Initialization/sync failed"); throw new Exception("Initialization/sync failed"); } }
/// <summary> /// Load prepaid /// </summary> public static string Init_HKPPD(ConnectionDetails connectionDetails, int MobileServiceProvider, string PhoneNumber, int Amount) { Log.Write("Starting job HKPPD: Load prepaid"); string segments = "HKPPD:" + SEGNUM.SETVal(3) + ":2+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + "+" + MobileServiceProvider + "+" + PhoneNumber + "+" + Amount + ",:EUR'"; segments = HKTAN.Init_HKTAN(segments); SEG.NUM = SEGNUM.SETInt(4); var TAN = FinTSMessage.Send(connectionDetails.Url, FinTSMessage.Create(connectionDetails.HBCIVersion, Segment.HNHBS, Segment.HNHBK, connectionDetails.Blz, connectionDetails.UserId, connectionDetails.Pin, Segment.HISYN, segments, Segment.HIRMS, SEG.NUM)); Segment.HITAN = Helper.Parse_String(Helper.Parse_String(TAN, "HITAN", "'").Replace("?+", "??"), "++", "+").Replace("??", "?+"); Helper.Parse_Message(TAN); return(TAN); }
/// <summary> /// Confirm order with TAN /// </summary> /// <param name="connectionDetails">ConnectionDetails object must atleast contain the fields: Url, HBCIVersion, UserId, Pin, Blz</param> /// <param name="TAN"></param> /// <param name="MediumName"></param> /// <returns> /// Bank return codes /// </returns> public static string TAN4(ConnectionDetails connectionDetails, string TAN, string MediumName) { var BankCode = Transaction.TAN4(connectionDetails, TAN, MediumName); if (BankCode.Contains("+0010::") || BankCode.Contains("+0020::")) { var BankCode_ = "HIRMS" + Helper.Parse_String(BankCode, "'HIRMS", "'"); String[] values = BankCode_.Split('+'); string msg = string.Empty; foreach (var item in values) { if (!item.StartsWith("HIRMS")) { msg = msg + "??" + item.Replace("::", ": "); } } return(msg); } else { // Error var BankCode_ = "HIRMS" + Helper.Parse_String(BankCode, "'HIRMS", "'"); String[] values = BankCode_.Split('+'); string msg = string.Empty; foreach (var item in values) { if (!item.StartsWith("HIRMS")) { msg = msg + "??" + item.Replace("::", ": "); } } Log.Write(msg); return(msg); } }
/// <summary> /// Confirm order with TAN /// </summary> /// <param name="TAN"></param> /// <param name="URL"></param> /// <param name="HBCIVersion"></param> /// <param name="BLZ"></param> /// <param name="UserID"></param> /// <param name="PIN"></param> /// <param name="MediumName"></param> /// <returns> /// Bank return codes /// </returns> public static string TAN4(string TAN, string URL, int HBCIVersion, int BLZ, string UserID, string PIN, string MediumName) { var BankCode = Transaction.TAN4(TAN, URL, HBCIVersion, BLZ, UserID, PIN, MediumName); if (BankCode.Contains("+0020::")) { var BankCode_ = "HIRMS" + Helper.Parse_String(BankCode, "'HIRMS", "'"); String[] values = BankCode_.Split('+'); string msg = string.Empty; foreach (var item in values) { if (!item.StartsWith("HIRMS")) { msg = msg + "??" + item.Replace("::", ": "); } } return(msg); } else { // Error var BankCode_ = "HIRMS" + Helper.Parse_String(BankCode, "'HIRMS", "'"); String[] values = BankCode_.Split('+'); string msg = string.Empty; foreach (var item in values) { if (!item.StartsWith("HIRMS")) { msg = msg + "??" + item.Replace("::", ": "); } } Log.Write(msg); return(msg); } }
/// <summary> /// Parse bank error code /// </summary> /// <param name="BankCode"></param> /// <returns></returns> public static string Parse_BankCode_Error(string BankCode) { // Error var BankCode_ = "HIRMS" + Helper.Parse_String(BankCode, "'HIRMS", "'"); String[] values = BankCode_.Split('+'); string msg = string.Empty; foreach (var item in values) { if (!item.StartsWith("HIRMS")) { msg = msg + "??" + item.Replace("::", ": "); } } return(msg); }
/// <summary> /// Transfer /// </summary> public static string Init_HKCCS(ConnectionDetails connectionDetails, string ReceiverName, string ReceiverIBAN, string ReceiverBIC, decimal Amount, string Usage) { Log.Write("Starting job HKCCS: Transfer money"); string segments = string.Empty; string sepaMessage = string.Empty; SEG.NUM = SEGNUM.SETInt(3); if (Segment.HISPAS == 1) { segments = "HKCCS:" + SEG.NUM + ":1+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + "+urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03+@@"; sepaMessage = pain00100103.Create(connectionDetails.AccountHolder, connectionDetails.IBAN, connectionDetails.BIC, ReceiverName, ReceiverIBAN, ReceiverBIC, Amount, Usage, new DateTime(1999, 1, 1)); } else if (Segment.HISPAS == 2) { segments = "HKCCS:" + SEG.NUM + ":1+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + "+urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.002.03+@@"; sepaMessage = pain00100203.Create(connectionDetails.AccountHolder, connectionDetails.IBAN, connectionDetails.BIC, ReceiverName, ReceiverIBAN, ReceiverBIC, Amount, Usage, new DateTime(1999, 1, 1)); } else if (Segment.HISPAS == 3) { segments = "HKCCS:" + SEG.NUM + ":1+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + "+urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.003.03+@@"; sepaMessage = pain00100303.Create(connectionDetails.AccountHolder, connectionDetails.IBAN, connectionDetails.BIC, ReceiverName, ReceiverIBAN, ReceiverBIC, Amount, Usage, new DateTime(1999, 1, 1)); } segments = segments.Replace("@@", "@" + (sepaMessage.Length - 1) + "@") + sepaMessage; if (Helper.IsTANRequired("HKCCS")) { SEG.NUM = SEGNUM.SETInt(4); segments = HKTAN.Init_HKTAN(segments); } var message = FinTSMessage.Create(connectionDetails.HBCIVersion, Segment.HNHBS, Segment.HNHBK, connectionDetails.BlzPrimary, connectionDetails.UserId, connectionDetails.Pin, Segment.HISYN, segments, Segment.HIRMS, SEG.NUM); var response = FinTSMessage.Send(connectionDetails.Url, message); Segment.HITAN = Helper.Parse_String(Helper.Parse_String(response, "HITAN", "'").Replace("?+", "??"), "++", "+").Replace("??", "?+"); Helper.Parse_Message(response); return(response); }
/// <summary> /// Transfer terminated /// </summary> public static async Task<String> Init_HKCSE(FinTsClient client, string ReceiverName, string ReceiverIBAN, string ReceiverBIC, decimal Amount, string Usage, DateTime ExecutionDay) { Log.Write("Starting job HKCSE: Transfer money terminated"); var connectionDetails = client.ConnectionDetails; string segments = string.Empty; string sepaMessage = string.Empty; client.SEGNUM = SEGNUM.SETInt(3); if (client.HISPAS == 1) { segments = "HKCSE:" + client.SEGNUM + ":1+" + connectionDetails.Iban + ":" + connectionDetails.Bic + "+urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03+@@"; sepaMessage = pain00100103.Create(connectionDetails.AccountHolder, connectionDetails.Iban, connectionDetails.Bic, ReceiverName, ReceiverIBAN, ReceiverBIC, Amount, Usage, ExecutionDay); } else if (client.HISPAS == 2) { segments = "HKCSE:" + client.SEGNUM + ":1+" + connectionDetails.Iban + ":" + connectionDetails.Bic + "+urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.002.03+@@"; sepaMessage = pain00100203.Create(connectionDetails.AccountHolder, connectionDetails.Iban, connectionDetails.Bic, ReceiverName, ReceiverIBAN, ReceiverBIC, Amount, Usage, ExecutionDay); } else if (client.HISPAS == 3) { segments = "HKCSE:" + client.SEGNUM + ":1+" + connectionDetails.Iban + ":" + connectionDetails.Bic + "+urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.003.03+@@"; sepaMessage = pain00100303.Create(connectionDetails.AccountHolder, connectionDetails.Iban, connectionDetails.Bic, ReceiverName, ReceiverIBAN, ReceiverBIC, Amount, Usage, ExecutionDay); } segments = segments.Replace("@@", "@" + (sepaMessage.Length - 1) + "@") + sepaMessage; if (Helper.IsTANRequired("HKCSE")) { client.SEGNUM = SEGNUM.SETInt(4); segments = HKTAN.Init_HKTAN(client, segments); } var message = FinTSMessage.Create(client, client.HNHBS, client.HNHBK, segments, client.HIRMS); var response = await FinTSMessage.Send(client, message); client.HITAN = Helper.Parse_String(Helper.Parse_String(response, "HITAN", "'").Replace("?+", "??"), "++", "+").Replace("??", "?+"); Helper.Parse_Message(client, response); return response; }
private static RsaKeyParameters MakeKey(bool isPrivateKey) { byte[] key = null; if (isPrivateKey) { key = Encoding.UTF8.GetBytes(Helper.Parse_String(RDH_KEYSTORE.KEY_SIGNING_PRIVATE_XML, "<Modulus>", "</Modulus")); } else { key = Encoding.GetEncoding("iso8859-1").GetBytes(RDH_KEYSTORE.KEY_SIGNING_PRIVATE); } var Exponent = new byte[] { 1, 0, 1 }; var modulus = new Org.BouncyCastle.Math.BigInteger(1, key); var exponent = new Org.BouncyCastle.Math.BigInteger(Exponent); return(new RsaKeyParameters(isPrivateKey, modulus, exponent)); }
/// <summary> /// Get banker's orders /// </summary> /// <param name="BLZ"></param> /// <param name="IBAN"></param> /// <param name="BIC"></param> /// <param name="URL"></param> /// <param name="HBCIVersion"></param> /// <param name="UserID"></param> /// <param name="PIN"></param> /// <param name="Anonymous"></param> /// <returns> /// Banker's orders /// </returns> public static string GetBankersOrders(int BLZ, string IBAN, string BIC, string URL, int HBCIVersion, string UserID, string PIN, bool Anonymous) { if (Transaction.INI(BLZ, URL, HBCIVersion, UserID, PIN, Anonymous) == true) { // Success var BankCode = Transaction.HKCSB(BLZ, IBAN, BIC, URL, HBCIVersion, UserID, PIN); if (BankCode.Contains("+0020::")) { // Success return(BankCode); } else { // Error var BankCode_ = "HIRMS" + Helper.Parse_String(BankCode, "'HIRMS", "'"); String[] values = BankCode_.Split('+'); string msg = string.Empty; foreach (var item in values) { if (!item.StartsWith("HIRMS")) { msg = msg + "??" + item.Replace("::", ": "); } } Log.Write(msg); return(msg); } } else { return("Error"); } }
/// <summary> /// Get banker's orders /// </summary> /// <param name="connectionDetails">ConnectionDetails object must atleast contain the fields: Url, HBCIVersion, UserId, Pin, Blz, IBAN, BIC</param> /// <param name="anonymous"></param> /// <returns> /// Banker's orders /// </returns> public static string GetBankersOrders(ConnectionDetails connectionDetails, bool anonymous) { if (Transaction.INI(connectionDetails, anonymous) == true) { // Success var BankCode = Transaction.HKCSB(connectionDetails); if (BankCode.Contains("+0020::")) { // Success return(BankCode); } else { // Error var BankCode_ = "HIRMS" + Helper.Parse_String(BankCode, "'HIRMS", "'"); String[] values = BankCode_.Split('+'); string msg = string.Empty; foreach (var item in values) { if (!item.StartsWith("HIRMS")) { msg = msg + "??" + item.Replace("::", ": "); } } Log.Write(msg); return(msg); } } else { return("Error"); } }
/// <summary> /// Account transactions in SWIFT-format /// </summary> /// <param name="Account"></param> /// <param name="BLZ"></param> /// <param name="IBAN"></param> /// <param name="BIC"></param> /// <param name="URL"></param> /// <param name="HBCIVersion"></param> /// <param name="UserID"></param> /// <param name="PIN"></param> /// <param name="Anonymous"></param> /// <param name="startDate"></param> /// <param name="endDate"></param> /// <returns> /// Transactions /// </returns> public static List <SWIFTStatement> Transactions(string Account, int BLZ, string IBAN, string BIC, string URL, int HBCIVersion, string UserID, string PIN, bool Anonymous, DateTime?startDate = null, DateTime?endDate = null) { var swiftStatements = new List <SWIFTStatement>(); if (Transaction.INI(BLZ, URL, HBCIVersion, UserID, PIN, Anonymous) == true) { var startDateStr = startDate?.ToString("yyyyMMdd"); var endDateStr = endDate?.ToString("yyyyMMdd"); // Success var BankCode = Transaction.HKKAZ(Account, BLZ, IBAN, BIC, URL, HBCIVersion, UserID, PIN, startDateStr, endDateStr, null); var Transactions = ":20:STARTUMS" + Helper.Parse_String(BankCode, ":20:STARTUMS", "'HNSHA"); swiftStatements.AddRange(MT940.Serialize(Transactions, Account)); string BankCode_ = BankCode; while (BankCode_.Contains("+3040::")) { Helper.Parse_Message(BankCode_); var Startpoint = new Regex(@"\+3040::[^:]+:(?<startpoint>[^']+)'").Match(BankCode_).Groups["startpoint"].Value; BankCode_ = Transaction.HKKAZ(Account, BLZ, IBAN, BIC, URL, HBCIVersion, UserID, PIN, startDateStr, endDateStr, Startpoint); var Transactions_ = ":20:STARTUMS" + Helper.Parse_String(BankCode_, ":20:STARTUMS", "'HNSHA"); swiftStatements.AddRange(MT940.Serialize(Transactions_, Account)); } return(swiftStatements); } else { Log.Write("Initialization/sync failed"); throw new Exception("Initialization/sync failed"); } }
/// <summary> /// Rebooking /// </summary> public static string Init_HKCUM(ConnectionDetails connectionDetails, string Receiver, string ReceiverIBAN, string ReceiverBIC, decimal Amount, string Usage) { Log.Write("Starting job HKCUM: Rebooking money"); string segments = "HKCUM:" + SEGNUM.SETVal(3) + ":1+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + "+urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.002.03+@@"; var message = pain00100203.Create(connectionDetails.AccountHolder, connectionDetails.IBAN, connectionDetails.BIC, Receiver, ReceiverIBAN, ReceiverBIC, Amount, Usage, new DateTime(1999, 1, 1)); segments = segments.Replace("@@", "@" + (message.Length - 1) + "@") + message; segments = HKTAN.Init_HKTAN(segments); SEG.NUM = SEGNUM.SETInt(4); var TAN = FinTSMessage.Send(connectionDetails.Url, FinTSMessage.Create(connectionDetails.HBCIVersion, Segment.HNHBS, Segment.HNHBK, connectionDetails.BlzPrimary, connectionDetails.UserId, connectionDetails.Pin, Segment.HISYN, segments, Segment.HIRMS, SEG.NUM)); Segment.HITAN = Helper.Parse_String(Helper.Parse_String(TAN, "HITAN", "'").Replace("?+", "??"), "++", "+").Replace("??", "?+"); Helper.Parse_Message(TAN); return(TAN); }
/// <summary> /// Get terminated transfers /// </summary> public static string Init_HKCSB(ConnectionDetails connectionDetails) { Log.Write("Starting job HKCSB: Get terminated transfers"); SEG.NUM = SEGNUM.SETInt(3); string segments = "HKCSB:" + SEG.NUM + ":1+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + "+sepade?:xsd?:pain.001.001.03.xsd'"; if (Helper.IsTANRequired("HKCSB")) { SEG.NUM = SEGNUM.SETInt(4); segments = HKTAN.Init_HKTAN(segments); } string message = FinTSMessage.Create(connectionDetails.HBCIVersion, Segment.HNHBS, Segment.HNHBK, connectionDetails.BlzPrimary, connectionDetails.UserId, connectionDetails.Pin, Segment.HISYN, segments, Segment.HIRMS, SEG.NUM); string response = FinTSMessage.Send(connectionDetails.Url, message); Segment.HITAN = Helper.Parse_String(Helper.Parse_String(response, "HITAN", "'").Replace("?+", "??"), "++", "+").Replace("??", "?+"); Helper.Parse_Message(response); return(response); }
/// <summary> /// Get terminated transfers /// </summary> public static async Task <String> Init_HKCSB(FinTsClient client) { Log.Write("Starting job HKCSB: Get terminated transfers"); client.SEGNUM = SEGNUM.SETInt(3); var connectionDetails = client.ConnectionDetails; string segments = "HKCSB:" + client.SEGNUM + ":1+" + connectionDetails.Iban + ":" + connectionDetails.Bic + "+sepade?:xsd?:pain.001.001.03.xsd'"; if (Helper.IsTANRequired("HKCSB")) { client.SEGNUM = SEGNUM.SETInt(4); segments = HKTAN.Init_HKTAN(client, segments); } string message = FinTSMessage.Create(client, client.HNHBS, client.HNHBK, segments, client.HIRMS); string response = await FinTSMessage.Send(client, message); client.HITAN = Helper.Parse_String(Helper.Parse_String(response, "HITAN", "'").Replace("?+", "??"), "++", "+").Replace("??", "?+"); Helper.Parse_Message(client, response); return(response); }
/// <summary> /// Collective transfer /// </summary> public static string Init_HKCCM(ConnectionDetails connectionDetails, List <pain00100203_ct_data> PainData, string NumberofTransactions, decimal TotalAmount) { Log.Write("Starting job HKCCM: Collective transfer money"); var TotalAmount_ = TotalAmount.ToString().Replace(",", "."); string segments = "HKCCM:" + SEGNUM.SETVal(3) + ":1+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + TotalAmount_ + ":EUR++" + " + urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.002.03+@@"; var message = pain00100203.Create(connectionDetails.AccountHolder, connectionDetails.IBAN, connectionDetails.BIC, PainData, NumberofTransactions, TotalAmount, new DateTime(1999, 1, 1)); segments = segments.Replace("@@", "@" + (message.Length - 1) + "@") + message; segments = HKTAN.Init_HKTAN(segments); SEG.NUM = SEGNUM.SETInt(4); var TAN = FinTSMessage.Send(connectionDetails.Url, FinTSMessage.Create(connectionDetails.HBCIVersion, Segment.HNHBS, Segment.HNHBK, connectionDetails.Blz, connectionDetails.UserId, connectionDetails.Pin, Segment.HISYN, segments, Segment.HIRMS, SEG.NUM)); Segment.HITAN = Helper.Parse_String(Helper.Parse_String(TAN, "HITAN", "'").Replace("?+", "??"), "++", "+").Replace("??", "?+"); Helper.Parse_Message(TAN); return(TAN); }
/// <summary> /// Submit bankers order /// </summary> public static async Task <String> Init_HKCDE(FinTsClient client, string Receiver, string ReceiverIBAN, string ReceiverBIC, decimal Amount, string Usage, DateTime FirstTimeExecutionDay, TimeUnit timeUnit, string Rota, int ExecutionDay, DateTime?LastExecutionDay) { Log.Write("Starting job HKCDE: Submit bankers order"); client.SEGNUM = SEGNUM.SETInt(3); var connectionDetails = client.ConnectionDetails; string segments = "HKCDE:" + client.SEGNUM + ":1+" + connectionDetails.Iban + ":" + connectionDetails.Bic + "+urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03+@@"; var sepaMessage = pain00100103.Create(connectionDetails.AccountHolder, connectionDetails.Iban, connectionDetails.Bic, Receiver, ReceiverIBAN, ReceiverBIC, Amount, Usage, new DateTime(1999, 1, 1)).Replace("'", ""); segments = segments.Replace("@@", "@" + sepaMessage.Length + "@") + sepaMessage; segments += "+" + FirstTimeExecutionDay.ToString("yyyyMMdd") + ":" + (char)timeUnit + ":" + Rota + ":" + ExecutionDay; if (LastExecutionDay != null) { segments += ":" + LastExecutionDay.Value.ToString("yyyyMMdd"); } segments += "'"; if (Helper.IsTANRequired("HKCDE")) { client.SEGNUM = SEGNUM.SETInt(4); segments = HKTAN.Init_HKTAN(client, segments); } string message = FinTSMessage.Create(client, client.HNHBS, client.HNHBK, segments, client.HIRMS); var response = await FinTSMessage.Send(client, message); client.HITAN = Helper.Parse_String(Helper.Parse_String(response, "HITAN", "'").Replace("?+", "??"), "++", "+").Replace("??", "?+"); Helper.Parse_Message(client, response); return(response); }
/// <summary> /// Load prepaid /// </summary> public static async Task <String> Init_HKPPD(FinTsClient client, int MobileServiceProvider, string PhoneNumber, int Amount) { Log.Write("Starting job HKPPD: Load prepaid"); client.SEGNUM = SEGNUM.SETInt(3); var connectionDetails = client.ConnectionDetails; string segments = "HKPPD:" + client.SEGNUM + ":2+" + connectionDetails.Iban + ":" + connectionDetails.Bic + "+" + MobileServiceProvider + "+" + PhoneNumber + "+" + Amount + ",:EUR'"; if (Helper.IsTANRequired("HKPPD")) { client.SEGNUM = SEGNUM.SETInt(4); segments = HKTAN.Init_HKTAN(client, segments); } string message = FinTSMessage.Create(client, client.HNHBS, client.HNHBK, segments, client.HIRMS); var TAN = await FinTSMessage.Send(client, message); client.HITAN = Helper.Parse_String(Helper.Parse_String(TAN, "HITAN", "'").Replace("?+", "??"), "++", "+").Replace("??", "?+"); Helper.Parse_Message(client, TAN); return(TAN); }
/// <summary> /// Submit bankers order /// </summary> public static string Init_HKCDE(ConnectionDetails connectionDetails, string Receiver, string ReceiverIBAN, string ReceiverBIC, decimal Amount, string Usage, DateTime FirstTimeExecutionDay, TimeUnit timeUnit, string Rota, int ExecutionDay) { Log.Write("Starting job HKCDE: Submit bankers order"); string segments = "HKCDE:" + SEGNUM.SETVal(3) + ":1+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + "+urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.002.03+@@"; var message = pain00100203.Create(connectionDetails.AccountHolder, connectionDetails.IBAN, connectionDetails.BIC, Receiver, ReceiverIBAN, ReceiverBIC, Amount, Usage, new DateTime(1999, 1, 1)); message = message.Replace("'", "") + "+" + FirstTimeExecutionDay + ":" + (char)timeUnit + ":" + Rota + ":" + ExecutionDay + "'"; segments = segments.Replace("@@", "@" + (message.Length - 1) + "@") + message; segments = HKTAN.Init_HKTAN(segments); SEG.NUM = SEGNUM.SETInt(4); var TAN = FinTSMessage.Send(connectionDetails.Url, FinTSMessage.Create(connectionDetails.HBCIVersion, Segment.HNHBS, Segment.HNHBK, connectionDetails.Blz, connectionDetails.UserId, connectionDetails.Pin, Segment.HISYN, segments, Segment.HIRMS, SEG.NUM)); Segment.HITAN = Helper.Parse_String(Helper.Parse_String(TAN, "HITAN", "'").Replace("?+", "??"), "++", "+").Replace("??", "?+"); Helper.Parse_Message(TAN); return(TAN); }
/// <summary> /// Request tan medium name /// </summary> /// <param name="connectionDetails">ConnectionDetails object must atleast contain the fields: Url, HBCIVersion, UserId, Pin, Blz</param> /// <returns> /// TAN Medium Name /// </returns> public static string RequestTANMediumName(ConnectionDetails connectionDetails) { var BankCode = Transaction.HKTAB(connectionDetails); if (BankCode.Contains("+0020::")) { var BankCode_ = "HITAB" + Helper.Parse_String(BankCode, "'HITAB", "'"); var msg = BankCode; msg = Helper.Parse_String(msg, "+A:1", "'").Replace(":", ""); return(msg); } else { // Error var BankCode_ = "HIRMS" + Helper.Parse_String(BankCode, "'HIRMS", "'"); String[] values = BankCode_.Split('+'); string msg = string.Empty; foreach (var item in values) { if (!item.StartsWith("HIRMS")) { msg = msg + "??" + item.Replace("::", ": "); } } Log.Write(msg); return(msg); } }
public static List <HBCIBankMessage> Parse_BankCode(string BankCode, object pictureBox, out Image matrixImage, out Image flickerImage, int flickerWidth, int flickerHeight, bool renderFlickerCodeAsGif) #endif { List <HBCIBankMessage> result = new List <HBCIBankMessage>(); flickerImage = null; matrixImage = null; var BankCode_ = "HIRMS" + Helper.Parse_String(BankCode, "'HIRMS", "'"); String[] values = BankCode_.Split('+'); string msg = string.Empty; foreach (var item in values) { if (!item.StartsWith("HIRMS")) { TransactionConsole.Output = item.Replace("::", ": "); } var message = Parse_BankCode_Message(item); if (message != null) { result.Add(message); } } var HITAN = "HITAN" + Helper.Parse_String(BankCode.Replace("?'", "").Replace("?:", ":").Replace("<br>", Environment.NewLine).Replace("?+", "??"), "'HITAN", "'"); string HITANFlicker = string.Empty; var processes = TANProcesses.items; var processname = string.Empty; foreach (var item in processes) { if (item.ProcessNumber.Equals(Segment.HIRMS)) { processname = item.ProcessName; } } // Smart-TAN plus optisch // chipTAN optisch if (processname.Equals("Smart-TAN plus optisch") || processname.Contains("chipTAN optisch")) { HITANFlicker = HITAN; } String[] values_ = HITAN.Split('+'); int i = 1; foreach (var item in values_) { i = i + 1; if (i == 6) { TransactionConsole.Output = TransactionConsole.Output + "??" + item.Replace("::", ": ").TrimStart(); TransactionConsole.Output = TransactionConsole.Output.Replace("??", " ") .Replace("0030: ", "") .Replace("1.", Environment.NewLine + "1.") .Replace("2.", Environment.NewLine + "2.") .Replace("3.", Environment.NewLine + "3.") .Replace("4.", Environment.NewLine + "4.") .Replace("5.", Environment.NewLine + "5.") .Replace("6.", Environment.NewLine + "6.") .Replace("7.", Environment.NewLine + "7.") .Replace("8.", Environment.NewLine + "8."); } } // chipTAN optisch if (processname.Contains("chipTAN optisch")) { string FlickerCode = string.Empty; FlickerCode = "CHLGUC" + Helper.Parse_String(HITAN, "CHLGUC", "CHLGTEXT") + "CHLGTEXT"; FlickerCode flickerCode = new FlickerCode(FlickerCode); flickerCodeRenderer = new FlickerRenderer(flickerCode.Render(), pictureBox); if (!renderFlickerCodeAsGif) { RUN_flickerCodeRenderer(); Action action = STOP_flickerCodeRenderer; TimeSpan span = new TimeSpan(0, 0, 0, 50); ThreadStart start = delegate { RunAfterTimespan(action, span); }; Thread thread = new Thread(start); thread.Start(); } else { flickerImage = flickerCodeRenderer.RenderAsGif(flickerWidth, flickerHeight); } } // Smart-TAN plus optisch if (processname.Equals("Smart-TAN plus optisch")) { HITANFlicker = HITAN.Replace("?@", "??"); string FlickerCode = string.Empty; String[] values__ = HITANFlicker.Split('@'); int ii = 1; foreach (var item in values__) { ii = ii + 1; if (ii == 4) { FlickerCode = item; } } FlickerCode flickerCode = new FlickerCode(FlickerCode.Trim()); flickerCodeRenderer = new FlickerRenderer(flickerCode.Render(), pictureBox); if (!renderFlickerCodeAsGif) { RUN_flickerCodeRenderer(); Action action = STOP_flickerCodeRenderer; TimeSpan span = new TimeSpan(0, 0, 0, 50); ThreadStart start = delegate { RunAfterTimespan(action, span); }; Thread thread = new Thread(start); thread.Start(); } else { flickerImage = flickerCodeRenderer.RenderAsGif(flickerWidth, flickerHeight); } } // Smart-TAN photo if (processname.Equals("Smart-TAN photo")) { var PhotoCode = Helper.Parse_String(BankCode, ".+@", "'HNSHA"); var mCode = new MatrixCode(PhotoCode.Substring(5, PhotoCode.Length - 5)); matrixImage = mCode.CodeImage; mCode.Render(pictureBox); } // PhotoTAN if (processname.Equals("photoTAN-Verfahren")) { // HITAN:5:5:4+4++nmf3VmGQDT4qZ20190130091914641+Bitte geben Sie die photoTan ein+@3031@ image/pngʉPNG var match = Regex.Match(BankCode, @"HITAN.+@\d+@(.+)'HNHBS", RegexOptions.Singleline); if (match.Success) { var PhotoBinary = match.Groups[1].Value; var mCode = new MatrixCode(PhotoBinary); matrixImage = mCode.CodeImage; mCode.Render(pictureBox); } } return(result); }
/// <summary> /// Parse accounts and store informations /// </summary> /// <param name="Message"></param> /// <param name="Items"></param> /// <returns></returns> public static bool Parse_Accounts(string Message, List <AccountInformations> Items) { try { string pattern = $@"HIUPD.*?$"; MatchCollection result = Regex.Matches(Message, pattern, RegexOptions.Multiline); for (int ctr = 0; ctr <= result.Count - 1; ctr++) { string Accountnumber = null; string Accountbankcode = null; string Accountiban = null; string Accountuserid = null; string Accounttype = null; string Accountcurrency = null; string Accountowner = null; List <AccountPermissions> Accountpermissions = new List <AccountPermissions>(); // HIUPD:165:6:4+0123456789::280:10050000+DE22100500000123456789+5985932562+10+EUR+Meier+Peter+Sparkassenbuch Gold var match = Regex.Match(result[ctr].Value, @"HIUPD.*?\+(.*?)\+(.*?)\+(.*?)\+(.*?)\+(.*?)\+(.*?)\+(.*?)\+(.*?)\+"); if (match.Success) { var accountInfo = match.Groups[1].Value; var matchInfo = Regex.Match(accountInfo, @"(\d+):(.*?):280:(\d+)"); if (matchInfo.Success) { Accountnumber = matchInfo.Groups[1].Value; Accountbankcode = matchInfo.Groups[3].Value; } Accountiban = match.Groups[2].Value; Accountuserid = match.Groups[3].Value; Accounttype = match.Groups[4].Value; Accountcurrency = match.Groups[5].Value; Accountowner = $"{match.Groups[6]} {match.Groups[7]}"; Accounttype = match.Groups[8].Value; if (Accountiban?.Length > 2) { // Account permissions string pat = "\\+.*?:1"; MatchCollection res = Regex.Matches(result[ctr].Value, pat, RegexOptions.Singleline); for (int c = 0; c <= res.Count - 1; c++) { if (res[c].Value.Length < 10) { Accountpermissions.Add(new AccountPermissions { Segment = res[c].Value.Replace("+", "").Replace(":1", ""), Description = AccountPermissions.Permission(res[c].Value.Replace("+", "").Replace(":1", "")) }); } } } } else // Fallback { Accountiban = "DE" + Helper.Parse_String(result[ctr].Value, "+DE", "+"); Accountowner = Helper.Parse_String(result[ctr].Value, "EUR+", "+"); Accounttype = Helper.Parse_String(result[ctr].Value.Replace("++EUR+", ""), "++", "++"); if (Accountiban?.Length > 2) { // Account permissions string pat = "\\+.*?:1"; MatchCollection res = Regex.Matches(result[ctr].Value, pat, RegexOptions.Singleline); for (int c = 0; c <= res.Count - 1; c++) { if (res[c].Value.Length < 10) { Accountpermissions.Add(new AccountPermissions { Segment = res[c].Value.Replace("+", "").Replace(":1", ""), Description = AccountPermissions.Permission(res[c].Value.Replace("+", "").Replace(":1", "")) }); } } } } if (Accountnumber?.Length > 2 || Accountiban?.Length > 2) { Items.Add(new AccountInformations() { Accountnumber = Accountnumber, Accountbankcode = Accountbankcode, Accountiban = Accountiban, Accountuserid = Accountuserid, Accounttype = Accounttype, Accountcurrency = Accountcurrency, Accountowner = Accountowner, Accountpermissions = Accountpermissions }); } } if (Items.Count > 0) { return(true); } else { return(false); } } catch (Exception ex) { Log.Write(ex.ToString()); return(false); } }
public static bool Parse_Segment(string UserID, int BLZ, int HBCIVersion, string Message) { try { String[] values = Message.Split('\''); var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); var dir = Path.Combine(documents, Program.Buildname); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } List <string> msg = new List <string>(); foreach (var item in values) { msg.Add(item + Environment.NewLine.Replace(",", "")); } string msg_ = string.Join("", msg.ToArray()); string bpd = "HIBPA" + Parse_String(msg_, "HIBPA", "\r\n" + "HIUPA"); string upd = "HIUPA" + Parse_String(msg_, "HIUPA", "\r\n" + "HNSHA"); // BPD dir = Path.Combine(dir, "BPD"); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } if (!File.Exists(Path.Combine(dir, "280_" + BLZ + ".bpd"))) { using (File.Create(Path.Combine(dir, "280_" + BLZ + ".bpd"))) { }; File.WriteAllText(Path.Combine(dir, "280_" + BLZ + ".bpd"), bpd); } else { File.WriteAllText(Path.Combine(dir, "280_" + BLZ + ".bpd"), bpd); } // UPD dir = Path.Combine(documents, Program.Buildname); dir = Path.Combine(dir, "UPD"); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } if (!File.Exists(Path.Combine(dir, "280_" + BLZ + "_" + UserID + ".upd"))) { using (File.Create(Path.Combine(dir, "280_" + BLZ + "_" + UserID + ".upd"))) { }; File.WriteAllText(Path.Combine(dir, "280_" + BLZ + "_" + UserID + ".upd"), upd); } else { File.WriteAllText(Path.Combine(dir, "280_" + BLZ + "_" + UserID + ".upd"), upd); } foreach (var item in values) { if (item.Contains("HIRMS")) { var item_ = item; if (item_.Contains("3920")) { string TAN = string.Empty; string TANf = string.Empty; string[] procedures = Regex.Split(item_, @"\D+"); foreach (string value in procedures) { if (!string.IsNullOrEmpty(value)) { int i = int.Parse(value); if (Convert.ToString(i).StartsWith("9")) { if (String.IsNullOrEmpty(TAN)) { TAN = Convert.ToString(i); } else { if (String.IsNullOrEmpty(TANf)) { TANf = Convert.ToString(i); } else { TANf = TANf + ";" + Convert.ToString(i); } } } } } Segment.HIRMS = TAN; Segment.HIRMSf = TANf; } } if (item.Contains("HNHBK")) { var ID = Parse_String(item.ToString(), "+1+", ":1"); Segment.HNHBK = ID; } if (item.Contains("HISYN")) { var ID = item.Substring(13, item.Length - 13); Segment.HISYN = ID; } if (item.Contains("HNHBS")) { var item_ = item + "'"; var MSG = Parse_String(item_.Replace("HNHBS:", ""), "+", "'"); if (MSG.Equals("0") || MSG == null) { Segment.HNHBS = "2"; } else { Segment.HNHBS = Convert.ToString(Convert.ToInt16(MSG) + 1); } } if (item.Contains("HISALS")) { var SEG = Parse_String(item.Replace("HISALS:", ""), ":", ":"); Segment.HISALS = SEG; Segment.HISALSf = item; } if (item.Contains("HITANS")) { var TAN = Parse_String(item.Replace("HITANS:", ""), ":", "+").Replace(":", "+"); Segment.HITANS = TAN; } if (item.Contains("HKKAZ")) { if (String.IsNullOrEmpty(Segment.HKKAZ)) { var VER = Parse_String(item, "HKKAZ;", ";"); Segment.HKKAZ = VER; } } } if (!String.IsNullOrEmpty(Segment.HIRMS)) { UserID = string.Empty; return(true); } else { UserID = string.Empty; // Error var BankCode = "HIRMG" + Helper.Parse_String(msg_, "HIRMG", "HNHBS"); String[] values_ = BankCode.Split('+'); foreach (var item in values_) { if (!item.StartsWith("HIRMG")) { Console.WriteLine(item.Replace("::", ": ")); Log.Write(item.Replace("::", ": ")); } } return(false); } } catch (Exception ex) { UserID = string.Empty; Log.Write(ex.ToString()); Console.WriteLine("Software error"); return(false); } }
/// <summary> /// Transactions in camt053 format /// </summary> public static string Init_HKCAZ(ConnectionDetails connectionDetails, string FromDate, string ToDate, string Startpoint, camtVersion camtVers) { string segments = string.Empty; SEG.NUM = SEGNUM.SETInt(3); switch (camtVers) { case camtVersion.camt052: Log.Write("Starting job HKCAZ: Request transactions in camt052 format"); if (String.IsNullOrEmpty(FromDate)) { if (String.IsNullOrEmpty(Startpoint)) { segments = "HKCAZ:" + SEG.NUM + ":" + Segment.HKCAZ + "+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + ":" + connectionDetails.Account + "::280:" + connectionDetails.Blz + "+" + Scheme.camt052 + "+N'"; } else { segments = "HKCAZ:" + SEG.NUM + ":" + Segment.HKCAZ + "+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + ":" + connectionDetails.Account + "::280:" + connectionDetails.Blz + "+" + Scheme.camt052 + "+N++++" + Startpoint + "'"; } } else { if (String.IsNullOrEmpty(Startpoint)) { segments = "HKCAZ:" + SEG.NUM + ":" + Segment.HKCAZ + "+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + ":" + connectionDetails.Account + "::280:" + connectionDetails.Blz + "+" + Scheme.camt052 + "+N+" + FromDate + "+" + ToDate + "'"; } else { segments = "HKCAZ:" + SEG.NUM + ":" + Segment.HKCAZ + "+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + ":" + connectionDetails.Account + "::280:" + connectionDetails.Blz + "+" + Scheme.camt052 + "+N+" + FromDate + "+" + ToDate + "++" + Startpoint + "'"; } } SEG.NUM = SEGNUM.SETInt(3); break; case camtVersion.camt053: Log.Write("Starting job HKCAZ: Request transactions in camt053 format"); if (String.IsNullOrEmpty(FromDate)) { if (String.IsNullOrEmpty(Startpoint)) { segments = "HKCAZ:" + SEG.NUM + ":" + Segment.HKCAZ + "+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + ":" + connectionDetails.Account + "::280:" + connectionDetails.Blz + "+" + Scheme.camt053 + "+N'"; } else { segments = "HKCAZ:" + SEG.NUM + ":" + Segment.HKCAZ + "+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + ":" + connectionDetails.Account + "::280:" + connectionDetails.Blz + "+" + Scheme.camt053 + "+N++++" + Startpoint + "'"; } } else { if (String.IsNullOrEmpty(Startpoint)) { segments = "HKCAZ:" + SEG.NUM + ":" + Segment.HKCAZ + "+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + ":" + connectionDetails.Account + "::280:" + connectionDetails.Blz + "+" + Scheme.camt053 + "+N+" + FromDate + "+" + ToDate + "'"; } else { segments = "HKCAZ:" + SEG.NUM + ":" + Segment.HKCAZ + "+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + ":" + connectionDetails.Account + "::280:" + connectionDetails.Blz + "+" + Scheme.camt053 + "+N+" + FromDate + "+" + ToDate + "++" + Startpoint + "'"; } } break; default: // -> Will never happen, only for compiler return(string.Empty); } if (Helper.IsTANRequired("HKCAZ")) { SEG.NUM = SEGNUM.SETInt(4); segments = HKTAN.Init_HKTAN(segments); } string message = FinTSMessage.Create(connectionDetails.HBCIVersion, Segment.HNHBS, Segment.HNHBK, connectionDetails.BlzPrimary, connectionDetails.UserId, connectionDetails.Pin, Segment.HISYN, segments, Segment.HIRMS, SEG.NUM); string response = FinTSMessage.Send(connectionDetails.Url, message); Segment.HITAN = Helper.Parse_String(Helper.Parse_String(response, "HITAN", "'").Replace("?+", "??"), "++", "+").Replace("??", "?+"); Helper.Parse_Message(response); return(response); }
/// <summary> /// Parse bank message and handle tan process /// </summary> /// <param name="BankCode"></param> /// <param name="pictureBox"></param> /// <param name="flickerImage"></param> /// <param name="flickerWidth"></param> /// <param name="flickerHeight"></param> /// <param name="renderFlickerCodeAsGif"></param> public static void Parse_BankCode(string BankCode, PictureBox pictureBox, out Image flickerImage, int flickerWidth, int flickerHeight, bool renderFlickerCodeAsGif) { flickerImage = null; var BankCode_ = "HIRMS" + Helper.Parse_String(BankCode, "'HIRMS", "'"); String[] values = BankCode_.Split('+'); string msg = string.Empty; foreach (var item in values) { if (!item.StartsWith("HIRMS")) { TransactionConsole.Output = item.Replace("::", ": "); } } var HITAN = "HITAN" + Helper.Parse_String(BankCode.Replace("?'", "").Replace("?:", ":").Replace("<br>", Environment.NewLine).Replace("?+", "??"), "'HITAN", "'"); string HITANFlicker = string.Empty; var processes = TANProcesses.items; var processname = string.Empty; foreach (var item in processes) { if (item.ProcessNumber.Equals(Segment.HIRMS)) { processname = item.ProcessName; } } // Smart-TAN plus optisch // chipTAN optisch if (processname.Equals("Smart-TAN plus optisch") || processname.Contains("chipTAN optisch")) { HITANFlicker = HITAN; } String[] values_ = HITAN.Split('+'); int i = 1; foreach (var item in values_) { i = i + 1; if (i == 6) { TransactionConsole.Output = TransactionConsole.Output + "??" + item.Replace("::", ": ").TrimStart(); } } // chipTAN optisch if (processname.Contains("chipTAN optisch")) { string FlickerCode = string.Empty; FlickerCode = "CHLGUC" + Helper.Parse_String(HITAN, "CHLGUC", "CHLGTEXT") + "CHLGTEXT"; FlickerCode flickerCode = new FlickerCode(FlickerCode); flickerCodeRenderer = new FlickerRenderer(flickerCode.Render(), pictureBox); if (!renderFlickerCodeAsGif) { RUN_flickerCodeRenderer(); Action action = STOP_flickerCodeRenderer; TimeSpan span = new TimeSpan(0, 0, 0, 50); ThreadStart start = delegate { RunAfterTimespan(action, span); }; Thread thread = new Thread(start); thread.Start(); } else { flickerImage = flickerCodeRenderer.RenderAsGif(flickerWidth, flickerHeight); } } // Smart-TAN plus optisch if (processname.Equals("Smart-TAN plus optisch")) { HITANFlicker = HITAN.Replace("?@", "??"); string FlickerCode = string.Empty; String[] values__ = HITANFlicker.Split('@'); int ii = 1; foreach (var item in values__) { ii = ii + 1; if (ii == 4) { FlickerCode = item; } } FlickerCode flickerCode = new FlickerCode(FlickerCode.Trim()); flickerCodeRenderer = new FlickerRenderer(flickerCode.Render(), pictureBox); if (!renderFlickerCodeAsGif) { RUN_flickerCodeRenderer(); Action action = STOP_flickerCodeRenderer; TimeSpan span = new TimeSpan(0, 0, 0, 50); ThreadStart start = delegate { RunAfterTimespan(action, span); }; Thread thread = new Thread(start); thread.Start(); } else { flickerImage = flickerCodeRenderer.RenderAsGif(flickerWidth, flickerHeight); } } // Smart-TAN photo if (processname.Equals("Smart-TAN photo")) { var PhotoCode = Helper.Parse_String(BankCode, ".+@", "'HNSHA"); var mCode = new MatrixCode(PhotoCode.Substring(5, PhotoCode.Length - 5)); } }
/// <summary> /// Parse message and extract public bank keys -> Encryption, Signing /// </summary> /// <param name="Message"></param> /// <param name="BLZ"></param> /// <param name="UserID"></param> /// <returns></returns> public static bool Parse_Segment_RDH_Key(string Message, int BLZ, string UserID) { var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); var dir = Path.Combine(documents, Program.Buildname); Message = Message.Replace("'?", "||?"); String[] values = Message.Split('\''); List <string> msg = new List <string>(); foreach (var item in values) { msg.Add(item + Environment.NewLine.Replace(",", "")); } string msg_ = string.Join("", msg.ToArray()); string bpd = "HIBPA" + Parse_String(msg_, "HIBPA", "\r\n" + "HIUPA"); string upd = "HIUPA" + Parse_String(msg_, "HIUPA", "\r\n" + "HNSHA"); // BPD dir = Path.Combine(dir, "BPD"); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } if (!File.Exists(Path.Combine(dir, "280_" + BLZ + ".bpd"))) { using (File.Create(Path.Combine(dir, "280_" + BLZ + ".bpd"))) { }; File.WriteAllText(Path.Combine(dir, "280_" + BLZ + ".bpd"), bpd); } else { File.WriteAllText(Path.Combine(dir, "280_" + BLZ + ".bpd"), bpd); } // UPD dir = Path.Combine(documents, Program.Buildname); dir = Path.Combine(dir, "UPD"); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } if (!File.Exists(Path.Combine(dir, "280_" + BLZ + "_" + UserID + ".upd"))) { using (File.Create(Path.Combine(dir, "280_" + BLZ + "_" + UserID + ".upd"))) { }; File.WriteAllText(Path.Combine(dir, "280_" + BLZ + "_" + UserID + ".upd"), upd); } else { File.WriteAllText(Path.Combine(dir, "280_" + BLZ + "_" + UserID + ".upd"), upd); } foreach (var item in values) { if (item.Contains("HNHBK")) { var ID = Parse_String(item.ToString(), "+1+", ":1"); Segment.HNHBK = ID; } if (item.Contains("HISYN")) { var ID = item.Substring(13, item.Length - 13); Segment.HISYN = ID; } if (item.Contains("HIISA")) { if (item.Contains(":V:10")) { var item_ = item.ToString().Replace("||?", "'?"); RDH_KEYSTORE.KEY_ENCRYPTION_PUBLIC_BANK = Parse_String(item_, "@248@", ":12:"); } } if (item.Contains("HIISA")) { if (item.Contains(":S:10")) { var item_ = item.ToString().Replace("||?", "'?"); RDH_KEYSTORE.KEY_SIGNING_PUBLIC_BANK = Parse_String(item_, "@248@", ":12:"); } } } if (!String.IsNullOrEmpty(RDH_KEYSTORE.KEY_ENCRYPTION_PUBLIC_BANK) && !String.IsNullOrEmpty(RDH_KEYSTORE.KEY_SIGNING_PUBLIC_BANK)) { // Update hbci key RDHKEY.Update(RDHKEY.RDHKEYFILE, RDHKEY.RDHKEYFILEPWD); // Release rdhkey credentials RDHKEY.RDHKEYFILE = string.Empty; RDHKEY.RDHKEYFILEPWD = string.Empty; return(true); } else { // Error var BankCode = "HIRMG" + Helper.Parse_String(msg_, "HIRMG", "HNHBS"); String[] values_ = BankCode.Split('+'); foreach (var item in values_) { if (!item.StartsWith("HIRMG")) { Console.WriteLine(item.Replace("::", ": ")); Log.Write(item.Replace("::", ": ")); } } return(false); } }
/// <summary> /// Parsing segment -> UPD, BPD /// </summary> /// <param name="UserID"></param> /// <param name="BLZ"></param> /// <param name="HBCIVersion"></param> /// <param name="Message"></param> /// <returns></returns> public static bool Parse_Segment(string UserID, int BLZ, int HBCIVersion, string Message) { try { String[] values = Message.Split('\''); List <string> msg = new List <string>(); foreach (var item in values) { msg.Add(item + Environment.NewLine.Replace(",", "")); } string msg_ = string.Join("", msg.ToArray()); string bpd = "HIBPA" + Parse_String(msg_, "HIBPA", "\r\n" + "HIUPA"); string upd = "HIUPA" + Parse_String(msg_, "HIUPA", "\r\n" + "HNSHA"); if (Trace.Enabled) { var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); var dir = Path.Combine(documents, Program.Buildname); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } // BPD dir = Path.Combine(dir, "BPD"); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } if (!File.Exists(Path.Combine(dir, "280_" + BLZ + ".bpd"))) { using (File.Create(Path.Combine(dir, "280_" + BLZ + ".bpd"))) { }; File.WriteAllText(Path.Combine(dir, "280_" + BLZ + ".bpd"), bpd); } else { File.WriteAllText(Path.Combine(dir, "280_" + BLZ + ".bpd"), bpd); } // UPD dir = Path.Combine(documents, Program.Buildname); dir = Path.Combine(dir, "UPD"); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } if (!File.Exists(Path.Combine(dir, "280_" + BLZ + "_" + UserID + ".upd"))) { using (File.Create(Path.Combine(dir, "280_" + BLZ + "_" + UserID + ".upd"))) { }; File.WriteAllText(Path.Combine(dir, "280_" + BLZ + "_" + UserID + ".upd"), upd); } else { File.WriteAllText(Path.Combine(dir, "280_" + BLZ + "_" + UserID + ".upd"), upd); } } foreach (var item in values) { if (item.Contains("HIRMS")) { var item_ = item; if (item_.Contains("3920")) { string TAN = string.Empty; string TANf = string.Empty; string[] procedures = Regex.Split(item_, @"\D+"); foreach (string value in procedures) { int i; if (!string.IsNullOrEmpty(value) && int.TryParse(value, out i)) { if (Convert.ToString(i).StartsWith("9")) { if (String.IsNullOrEmpty(TAN)) { TAN = i.ToString(); } if (String.IsNullOrEmpty(TANf)) { TANf = i.ToString(); } else { TANf += $";{i}"; } } } } if (string.IsNullOrEmpty(Segment.HIRMS)) { Segment.HIRMS = TAN; } else { if (!TANf.Contains(Segment.HIRMS)) { throw new Exception($"Invalid HIRMS/Tan-Mode detected. Please choose one of the allowed modes: {TANf}"); } } Segment.HIRMSf = TANf; // Parsing TAN processes if (!String.IsNullOrEmpty(Segment.HIRMS)) { Parse_TANProcesses(bpd); } } } if (item.Contains("HNHBK")) { var ID = Parse_String(item.ToString(), "+1+", ":1"); Segment.HNHBK = ID; } if (item.Contains("HISYN")) { var ID = item.Substring(item.IndexOf("+") + 1); Segment.HISYN = ID; } if (item.Contains("HNHBS")) { var item_ = item + "'"; var MSG = Parse_String(item_.Replace("HNHBS:", ""), "+", "'"); if (MSG.Equals("0") || MSG == null) { Segment.HNHBS = "2"; } else { Segment.HNHBS = Convert.ToString(Convert.ToInt16(MSG) + 1); } } if (item.Contains("HISALS")) { var SEG = Parse_String(item.Replace("HISALS:", ""), ":", ":"); Segment.HISALS = SEG; Segment.HISALSf = item; } if (item.Contains("HITANS")) { var TAN = Parse_String(item.Replace("HITANS:", ""), ":", "+").Replace(":", "+"); Segment.HITANS = TAN; } if (item.Contains("HKKAZ")) { string pattern = @"HKKAZ;.*?;"; Regex rgx = new Regex(pattern); string sentence = item; foreach (Match match in rgx.Matches(sentence)) { var VER = Parse_String(match.Value, "HKKAZ;", ";"); if (String.IsNullOrEmpty(Segment.HKKAZ)) { Segment.HKKAZ = VER; } else { if (int.Parse(VER) > int.Parse(Segment.HKKAZ)) { Segment.HKKAZ = VER; } } } // Fallback if HKKAZ is not delivered by BPD (eg. Postbank) if (String.IsNullOrEmpty(Segment.HKKAZ)) { Segment.HKKAZ = "6"; } } } if (!String.IsNullOrEmpty(Segment.HIRMS)) { UserID = string.Empty; return(true); } else { UserID = string.Empty; // Error var BankCode = "HIRMG" + Helper.Parse_String(msg_, "HIRMG", "HNHBS"); String[] values_ = BankCode.Split('+'); foreach (var item in values_) { if (!item.StartsWith("HIRMG")) { Console.WriteLine(item.Replace("::", ": ")); Log.Write(item.Replace("::", ": ")); } } return(false); } } catch (Exception ex) { UserID = string.Empty; Log.Write(ex.ToString()); Console.WriteLine($"Software error: {ex.Message}"); return(false); } }
/// <summary> /// Transactions /// </summary> public static string Init_HKKAZ(ConnectionDetails connectionDetails, string FromDate, string ToDate, string Startpoint) { Log.Write("Starting job HKKAZ: Request transactions"); string segments = string.Empty; SEG.NUM = SEGNUM.SETInt(3); if (String.IsNullOrEmpty(FromDate)) { if (String.IsNullOrEmpty(Startpoint)) { if (Convert.ToInt16(Segment.HKKAZ) < 7) { segments = "HKKAZ:" + SEG.NUM + ":" + Segment.HKKAZ + "+" + connectionDetails.Account + "::280:" + connectionDetails.Blz + "+N'"; } else { segments = "HKKAZ:" + SEG.NUM + ":" + Segment.HKKAZ + "+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + ":" + connectionDetails.Account + "::280:" + connectionDetails.Blz + "+N'"; } } else { if (Convert.ToInt16(Segment.HKKAZ) < 7) { segments = "HKKAZ:" + SEG.NUM + ":" + Segment.HKKAZ + "+" + connectionDetails.Account + "::280:" + connectionDetails.Blz + "+N++++" + Startpoint + "'"; } else { segments = "HKKAZ:" + SEG.NUM + ":" + Segment.HKKAZ + "+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + ":" + connectionDetails.Account + "::280:" + connectionDetails.Blz + "+N++++" + Startpoint + "'"; } } } else { if (String.IsNullOrEmpty(Startpoint)) { if (Convert.ToInt16(Segment.HKKAZ) < 7) { segments = "HKKAZ:" + SEG.NUM + ":" + Segment.HKKAZ + "+" + connectionDetails.Account + "::280:" + connectionDetails.Blz + "+N+" + FromDate + "+" + ToDate + "'"; } else { segments = "HKKAZ:" + SEG.NUM + ":" + Segment.HKKAZ + "+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + ":" + connectionDetails.Account + "::280:" + connectionDetails.Blz + "+N+" + FromDate + "+" + ToDate + "'"; } } else { if (Convert.ToInt16(Segment.HKKAZ) < 7) { segments = "HKKAZ:" + SEG.NUM + ":" + Segment.HKKAZ + "+" + connectionDetails.Account + "::280:" + connectionDetails.Blz + "+N+" + FromDate + "+" + ToDate + "++" + Startpoint + "'"; } else { segments = "HKKAZ:" + SEG.NUM + ":" + Segment.HKKAZ + "+" + connectionDetails.IBAN + ":" + connectionDetails.BIC + ":" + connectionDetails.Account + "::280:" + connectionDetails.Blz + "+N+" + FromDate + "+" + ToDate + "++" + Startpoint + "'"; } } } if (Helper.IsTANRequired("HKKAZ")) { SEG.NUM = SEGNUM.SETInt(4); segments = HKTAN.Init_HKTAN(segments); } string message = FinTSMessage.Create(connectionDetails.HBCIVersion, Segment.HNHBS, Segment.HNHBK, connectionDetails.BlzPrimary, connectionDetails.UserId, connectionDetails.Pin, Segment.HISYN, segments, Segment.HIRMS, SEG.NUM); string response = FinTSMessage.Send(connectionDetails.Url, message); Segment.HITAN = Helper.Parse_String(Helper.Parse_String(response, "HITAN", "'").Replace("?+", "??"), "++", "+").Replace("??", "?+"); Helper.Parse_Message(response); return(response); }
/// <summary> /// Fill given <code>TANDialog</code> and wait for user to enter a TAN. /// </summary> /// <param name="BankCode"></param> /// <param name="pictureBox"></param> /// <param name="flickerImage"></param> /// <param name="flickerWidth"></param> /// <param name="flickerHeight"></param> /// <param name="renderFlickerCodeAsGif"></param> public static async Task <string> WaitForTanAsync(FinTsClient client, HBCIDialogResult dialogResult, TANDialog tanDialog) { var BankCode_ = "HIRMS" + Parse_String(dialogResult.RawData, "'HIRMS", "'"); String[] values = BankCode_.Split('+'); foreach (var item in values) { if (!item.StartsWith("HIRMS")) { TransactionConsole.Output = item.Replace("::", ": "); } } var HITAN = "HITAN" + Parse_String(dialogResult.RawData.Replace("?'", "").Replace("?:", ":").Replace("<br>", Environment.NewLine).Replace("?+", "??"), "'HITAN", "'"); string HITANFlicker = string.Empty; var processes = TanProcesses.Items; var processname = string.Empty; foreach (var item in processes) { if (item.ProcessNumber.Equals(client.HIRMS)) { processname = item.ProcessName; } } // Smart-TAN plus optisch // chipTAN optisch if (processname.Equals("Smart-TAN plus optisch") || processname.Contains("chipTAN optisch")) { HITANFlicker = HITAN; } String[] values_ = HITAN.Split('+'); int i = 1; foreach (var item in values_) { i = i + 1; if (i == 6) { TransactionConsole.Output = TransactionConsole.Output + "??" + item.Replace("::", ": ").TrimStart(); TransactionConsole.Output = TransactionConsole.Output.Replace("??", " ") .Replace("0030: ", "") .Replace("1.", Environment.NewLine + "1.") .Replace("2.", Environment.NewLine + "2.") .Replace("3.", Environment.NewLine + "3.") .Replace("4.", Environment.NewLine + "4.") .Replace("5.", Environment.NewLine + "5.") .Replace("6.", Environment.NewLine + "6.") .Replace("7.", Environment.NewLine + "7.") .Replace("8.", Environment.NewLine + "8."); } } // chipTAN optisch if (processname.Contains("chipTAN optisch")) { string FlickerCode = string.Empty; FlickerCode = "CHLGUC" + Helper.Parse_String(HITAN, "CHLGUC", "CHLGTEXT") + "CHLGTEXT"; FlickerCode flickerCode = new FlickerCode(FlickerCode); flickerCodeRenderer = new FlickerRenderer(flickerCode.Render(), tanDialog.PictureBox); if (!tanDialog.RenderFlickerCodeAsGif) { RUN_flickerCodeRenderer(); Action action = STOP_flickerCodeRenderer; TimeSpan span = new TimeSpan(0, 0, 0, 50); ThreadStart start = delegate { RunAfterTimespan(action, span); }; Thread thread = new Thread(start); thread.Start(); } else { tanDialog.FlickerImage = flickerCodeRenderer.RenderAsGif(tanDialog.FlickerWidth, tanDialog.FlickerHeight); } } // Smart-TAN plus optisch if (processname.Equals("Smart-TAN plus optisch")) { HITANFlicker = HITAN.Replace("?@", "??"); string FlickerCode = string.Empty; String[] values__ = HITANFlicker.Split('@'); int ii = 1; foreach (var item in values__) { ii = ii + 1; if (ii == 4) { FlickerCode = item; } } FlickerCode flickerCode = new FlickerCode(FlickerCode.Trim()); flickerCodeRenderer = new FlickerRenderer(flickerCode.Render(), tanDialog.PictureBox); if (!tanDialog.RenderFlickerCodeAsGif) { RUN_flickerCodeRenderer(); Action action = STOP_flickerCodeRenderer; TimeSpan span = new TimeSpan(0, 0, 0, 50); ThreadStart start = delegate { RunAfterTimespan(action, span); }; Thread thread = new Thread(start); thread.Start(); } else { tanDialog.FlickerImage = flickerCodeRenderer.RenderAsGif(tanDialog.FlickerWidth, tanDialog.FlickerHeight); } } // Smart-TAN photo if (processname.Equals("Smart-TAN photo")) { var PhotoCode = Parse_String(dialogResult.RawData, ".+@", "'HNSHA"); var mCode = new MatrixCode(PhotoCode.Substring(5, PhotoCode.Length - 5)); tanDialog.MatrixImage = mCode.CodeImage; mCode.Render(tanDialog.PictureBox); } // PhotoTAN if (processname.Equals("photoTAN-Verfahren")) { // HITAN:5:5:4+4++nmf3VmGQDT4qZ20190130091914641+Bitte geben Sie die photoTan ein+@3031@ image/pngʉPNG var match = Regex.Match(dialogResult.RawData, @"HITAN.+@\d+@(.+)'HNHBS", RegexOptions.Singleline); if (match.Success) { var PhotoBinary = match.Groups[1].Value; var mCode = new MatrixCode(PhotoBinary); tanDialog.MatrixImage = mCode.CodeImage; mCode.Render(tanDialog.PictureBox); } } return(await tanDialog.WaitForTanAsync()); }