public async Task <BankingResult <string> > RequestAccountsAccessAsync(AccountsAccessRequest model) { FlowContext flowContext = new FlowContext { Id = model.FlowId, ConnectorType = ConnectorType.BE_BNP, FlowType = FlowType.AccountsAccess, RedirectUrl = model.RedirectUrl }; var redirect = $"{apiUrl}{relativeUrlAuthPart}/authorize?response_type=code&client_id={_settings.AppClientId}&redirect_uri={WebUtility.UrlEncode($"{model.RedirectUrl}")}&scope=aisp&state={model.FlowId}"; return(new BankingResult <string>(ResultStatus.REDIRECT, "", redirect, null, flowContext: flowContext)); }
public async Task <BankingResult <string> > RequestAccountsAccessAsync(AccountsAccessRequest model) { FlowContext flowContext = new FlowContext { Id = model.FlowId, ConnectorType = ConnectorType.BE_BNP, FlowType = FlowType.AccountsAccess, RedirectUrl = model.RedirectUrl }; var brand = ConnectorType == ConnectorType.BE_HELLO_BANK ? "hb" : (ConnectorType == ConnectorType.BE_FINTRO ? "fintro" : "bnppf"); var redirect = $"{authUrl2}/authorize?response_type=code&client_id={_settings.AppClientId}&redirect_uri={WebUtility.UrlEncode($"{model.RedirectUrl}")}&scope=aisp&state={model.FlowId}&brand={brand}"; return(new BankingResult <string>(ResultStatus.REDIRECT, "", redirect, null, flowContext: flowContext)); }
public async Task <BankingResult <string> > RequestAccountsAccessAsync(AccountsAccessRequest model) { try { var client = GetClient(); client.DefaultRequestHeaders.Add("Accept", "application/vnd.belfius.api+json; version=1"); client.DefaultRequestHeaders.Add("Accept-Language", "en"); client.DefaultRequestHeaders.Add("Redirect-URI", $"{model.RedirectUrl}?flowId={model.FlowId}"); client.DefaultRequestHeaders.Add("Code-Challenge-Method", "S256"); var codeVerifier = Guid.NewGuid().ToString(); string codeChallenge; using (SHA256 sha256Hash = SHA256.Create()) { codeChallenge = Convert.ToBase64String(sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(codeVerifier))); } client.DefaultRequestHeaders.Add("Code-Challenge", codeChallenge); var url = basePath + $"/consent-uris?scope=AIS&iban={model.SingleAccount}"; var result = await client.GetAsync(url); string rawData = await result.Content.ReadAsStringAsync(); var accountAccessResult = JsonConvert.DeserializeObject <BelfiusAccountAccessResponse[]>(rawData).FirstOrDefault(); var flowContext = new FlowContext { Id = model.FlowId, ConnectorType = ConnectorType, FlowType = FlowType.AccountsAccess, CodeVerifier = codeVerifier, RedirectUrl = model.RedirectUrl, AccountAccessProperties = new AccountAccessProperties { SingleAccount = model.SingleAccount } }; return(new BankingResult <string>(ResultStatus.REDIRECT, url, accountAccessResult.consent_uri, rawData, flowContext: flowContext)); } catch (ApiCallException e) { throw e; } catch (ApiUnauthorizedException e) { throw e; } catch (PagerException e) { throw e; } catch (SdkUnauthorizedException e) { throw e; } catch (Exception e) { await LogAsync(apiUrl, 500, Http.Get, e.ToString()); throw e; } }
public async Task <BankingResult <string> > RequestAccountsAccessAsync(AccountsAccessRequest model) { try { var request = new BerlinGroupAccountAccessRequest { access = new BerlinGroupAccess { allPsd2 = (model.TransactionAccounts == null && model.BalanceAccounts == null) ? "allAccounts" : null, balances = model.BalanceAccounts?.Select(x => new BerlinGroupAccountIban { iban = x }).ToList(), transactions = model.TransactionAccounts?.Select(x => new BerlinGroupAccountIban { iban = x }).ToList() }, combinedServiceIndicator = false, frequencyPerDay = model.FrequencyPerDay, recurringIndicator = true, validUntil = DateTime.Today.AddDays(90).ToString("yyyy-MM-dd") }; var payload = JsonConvert.SerializeObject(request); var content = new StringContent(payload, Encoding.UTF8, "application/json"); var client = GetClient(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); client.DefaultRequestHeaders.Add("PSU-IP-Address", model.PsuIp); client.DefaultRequestHeaders.Add("TPP-Redirect-Preferred", "true"); client.DefaultRequestHeaders.Add("TPP-Redirect-URI", model.RedirectUrl + $"?flowId={model.FlowId}"); client.DefaultRequestHeaders.Add("TPP-Nok-Redirect-URI", model.RedirectUrl + $"?flowId={model.FlowId}&error"); var url = "/sgbt/lu/bg/v1/consents"; var result = await client.PostAsync(url, content); string rawData = await result.Content.ReadAsStringAsync(); var accountAccessResult = JsonConvert.DeserializeObject <BankingSDK.LU.SocieteGenerale.Models.SocieteGeneraleAccountsAccessResponse>(rawData); if (string.IsNullOrEmpty(accountAccessResult._links.scaRedirect)) { content = new StringContent("", Encoding.UTF8, "application/json"); client = GetClient(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); string url2 = $"/sgbt/lu/bg/v1/consents/{accountAccessResult.consentId}/authorisations"; result = await client.PostAsync(url2, content); string rawData2 = await result.Content.ReadAsStringAsync(); var consentAthorisation = JsonConvert.DeserializeObject <SocieteGeneraleAuthorization>(rawData2); accountAccessResult._links.scaRedirect = consentAthorisation._links.scaRedirect; rawData += rawData2; url += url2; } var flowContext = new FlowContext { Id = model.FlowId, ConnectorType = ConnectorType, FlowType = FlowType.AccountsAccess, AccountAccessProperties = new AccountAccessProperties { ConsentId = accountAccessResult.consentId, ValidUntil = DateTime.Today.AddDays(90).Date, BalanceAccounts = model.BalanceAccounts, TransactionAccounts = model.TransactionAccounts } }; return(new BankingResult <string>(ResultStatus.REDIRECT, url, accountAccessResult._links.scaRedirect, rawData, flowContext: flowContext)); } catch (ApiCallException e) { throw e; } catch (ApiUnauthorizedException e) { throw e; } catch (PagerException e) { throw e; } catch (SdkUnauthorizedException e) { throw e; } catch (Exception e) { await LogAsync(apiUrl, 500, Http.Get, e.ToString()); throw e; } }
public async Task <BankingResult <string> > RequestAccountsAccessAsync(AccountsAccessRequest model) { try { var request = new BerlinGroupAccountAccessRequest { access = new BerlinGroupAccess { balances = new List <BerlinGroupAccountIban> { new BerlinGroupAccountIban { iban = model.SingleAccount } }, transactions = new List <BerlinGroupAccountIban> { new BerlinGroupAccountIban { iban = model.SingleAccount } } }, combinedServiceIndicator = false, frequencyPerDay = model.FrequencyPerDay, recurringIndicator = true, validUntil = DateTime.Today.AddDays(89).ToString("yyyy-MM-dd") }; var payload = JsonConvert.SerializeObject(request); var content = new StringContent(payload, Encoding.UTF8, "application/json"); content.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json"); var client = GetClient(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); client.DefaultRequestHeaders.Add("PSU-IP-Address", model.PsuIp); client.DefaultRequestHeaders.Add("TPP-Redirect-URI", model.RedirectUrl); var url = "/psd2/v2/consents"; var result = await client.PostAsync(url, content); string rawData = await result.Content.ReadAsStringAsync(); var accountAccessResult = JsonConvert.DeserializeObject <BerlinGroupAccountsAccessResponse>(rawData); //var codeVerifier = "WtTEuIaHve9RS_mMK6P99Z_RWL5cLTOqAJ2ar2BeN9g"; var codeVerifier = Guid.NewGuid().ToString(); string codeChallenge; using (SHA256 sha256Hash = SHA256.Create()) { codeChallenge = Convert.ToBase64String(sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(codeVerifier))).Replace("=", "").Replace("+", "-").Replace("/", "_");//"IObWtymAvqW35KPIr8Gsl8jbKJUoL7Dx_EijWCvkwEM"; } string mainCompany; switch (ConnectorType) { case ConnectorType.BE_KBC: mainCompany = "0001"; break; case ConnectorType.BE_CBC: mainCompany = "0002"; break; case ConnectorType.BE_KBC_BRUSSELS: mainCompany = "0001&company=9998"; break; default: throw new Exception("Unknown connector type"); } // to specify the language add &language=NL //var redirect = $"{apiUrl}/ASK/oauth/authorize/1?client_id={_settings.NcaId}&redirect_uri={WebUtility.UrlEncode(model.RedirectUrl)}&response_type=code&scope={WebUtility.UrlEncode($"AIS:{accountAccessResult.consentId}")}&state={model.FlowId}&language=NL&mainCompany={mainCompany}&code_challenge={WebUtility.UrlEncode(codeChallenge)}&code_challenge_method=S256"; var redirect = $"{RedirectUrl}/ASK/oauth/authorize/1?client_id={_settings.NcaId}&redirect_uri={WebUtility.UrlEncode(model.RedirectUrl)}&response_type=code&scope={WebUtility.UrlEncode($"AIS:{accountAccessResult.consentId}")}&state={model.FlowId}&mainCompany={mainCompany}&code_challenge={WebUtility.UrlEncode(codeChallenge)}&code_challenge_method=S256"; var flowContext = new FlowContext { Id = model.FlowId, ConnectorType = ConnectorType, FlowType = FlowType.AccountsAccess, CodeVerifier = codeVerifier, RedirectUrl = model.RedirectUrl, AccountAccessProperties = new AccountAccessProperties { ConsentId = accountAccessResult.consentId, ValidUntil = DateTime.Today.AddDays(89).Date, SingleAccount = model.SingleAccount } }; return(new BankingResult <string>(ResultStatus.REDIRECT, url, redirect, rawData, flowContext: flowContext)); } catch (ApiCallException e) { throw e; } catch (SdkUnauthorizedException e) { throw e; } catch (Exception e) { await LogAsync(apiUrl, 500, Http.Get, e.ToString()); throw e; } }
static async Task Main(string[] args) { var services = new ServiceCollection(); services.AddBankingSdk(); // Setting general settings of BankingSDk BankSettings generalBankSettings = new BankSettings(); generalBankSettings.NcaId = "VALID_NCA_ID"; string filePath = @"C:\Users\Yassine\Documents\StageEntrainement\BankingSDK - Copie\BankingSDK\Test\TestApp\example_eidas_client_tls.cer"; string filePath2 = @"C:\Users\Yassine\Documents\StageEntrainement\BankingSDK - Copie\BankingSDK\Test\TestApp\example_eidas_client_signing.cer"; generalBankSettings.TlsCertificate = new X509Certificate2(filePath, "banking"); generalBankSettings.SigningCertificate = new X509Certificate2(filePath2, "banking"); SdkApiSettings.CompanyKey = "1df53a2d-26aa-4ef1-9f3c-09a1092e5413"; SdkApiSettings.ApplicationKey = "d7726cbf-e51f-4e0e-a3bb-132913ad8032"; SdkApiSettings.Secret = "W2ANVUVRQS7AKBFCZLKHGLWXCC6FRUGXAV3O3E33H7D1ZULX6ME6UKOKGNKSXPA6LK9YH1JUSR9JI58S0JIEPKCZHSIQ4KF27GPOUWPFDTODKECLP11OG5RBHJRZT20HMHLBPT7D4DB559PCP6BCS1VBZOHKF0VK3G1D2B564XUD4VFH4OJW1YZVVKLBLW8ER0CYIMKOBEH4GSGEI9Q1Q9SERGRSZ3UHZQVDTR9SD4UWQ4ODDH3MGGXSI7GC42ZH"; SdkApiSettings.TppLegalName = "EXTHAND"; SdkApiSettings.IsSandbox = false; //BankingSDK. bankConnector = new Connector(generalBankSettings); BankingSDK.BE.KBC.BeKbcConnector bankConnector = new BeKbcConnector(generalBankSettings); string userId = Guid.NewGuid().ToString(); string userContect = (await bankConnector.RegisterUserAsync(userId)).GetData().ToJson(); string callBackUrl = "https://developer.bankingsdk.com/callback"; AccountsAccessRequest accountsAccessRequest = new AccountsAccessRequest { FlowId = SdkApiSettings.ApplicationKey, FrequencyPerDay = 4, RedirectUrl = callBackUrl, PsuIp = "10.10.10.10", SingleAccount = "BE91732047678076" }; BankingResult <string> bankingResult = await bankConnector.RequestAccountsAccessAsync(accountsAccessRequest); if (bankingResult.GetStatus() == ResultStatus.REDIRECT) { // We get the flow context. var flowContext = bankingResult.GetFlowContext(); string redirectUrlOnTheBank = bankingResult.GetData(); var psi = new ProcessStartInfo(@"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"); psi.Arguments = redirectUrlOnTheBank; Process.Start(psi); Console.WriteLine("QueryString received?"); string queryString = Console.ReadLine(); BankingResult <IUserContext> result = await bankConnector.RequestAccountsAccessFinalizeAsync(flowContext, queryString); if (result.GetStatus() == ResultStatus.DONE) { Console.WriteLine("Ok. Cool."); BankingResult <List <Account> > accounts = await bankConnector.GetAccountsAsync(); foreach (Account account in accounts.GetData()) { Console.WriteLine("Account " + account.Iban); BankingResult <List <Balance> > resultBalances = await bankConnector.GetBalancesAsync(account.Iban); if (resultBalances.GetStatus() == ResultStatus.DONE) { List <Balance> accountBalances = resultBalances.GetData(); foreach (Balance balance in accountBalances) { Console.WriteLine(" Balance : " + balance.BalanceAmount + " " + balance.ReferenceDate?.ToString("dd MMM yyyy")); } } } } } Console.ReadLine(); return; }
public async Task <BankingResult <string> > RequestAccountsAccessAsync(AccountsAccessRequest model) { try { Console.Write("Je vais ecrire " + model.RedirectUrl); Console.Write("Je vais ecrire " + model.FlowId); Console.Write("Je vais ecrire " + model.SingleAccount); Console.Write("Je vais ecrire " + model.PsuIp); Console.Write("Je vais ecrire " + model.FrequencyPerDay); var client = GetClient(); client.DefaultRequestHeaders.Add("Accept", "application/vnd.belfius.api+json; version=2"); client.DefaultRequestHeaders.Add("Accept-Language", "en"); client.DefaultRequestHeaders.Add("Redirect-URI", $"{model.RedirectUrl}"); client.DefaultRequestHeaders.Add("Code-Challenge-Method", "S256"); // var codeVerifier = Guid.NewGuid().ToString().Replace("-", ""); var codeVerifier = Guid.NewGuid().ToString() + "_" + Guid.NewGuid().ToString(); string codeChallenge; using (SHA256 sha256Hash = SHA256.Create()) { codeChallenge = Convert.ToBase64String(sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(codeVerifier))) .Split('=')[0].Replace("+", "-").Replace("/", "_"); } client.DefaultRequestHeaders.Add("Code-Challenge", codeChallenge); var url = basePath + $"/consent-uris?scope=AIS&iban={model.SingleAccount}"; Console.Write("Je vais ecrire Yass" + url); Console.Write("Je vais ecrire Code" + codeChallenge); var result = await client.GetAsync(url); string rawData = await result.Content.ReadAsStringAsync(); var accountAccessResult = JsonConvert.DeserializeObject <BelfiusAccountAccessResponse[]>(rawData).FirstOrDefault(); var flowContext = new FlowContext { Id = model.FlowId, ConnectorType = ConnectorType, FlowType = FlowType.AccountsAccess, CodeVerifier = codeVerifier, RedirectUrl = model.RedirectUrl, AccountAccessProperties = new AccountAccessProperties { SingleAccount = model.SingleAccount } }; if (!accountAccessResult.consent_uri.Contains("?")) { accountAccessResult.consent_uri += "?"; } else { accountAccessResult.consent_uri += "&"; } accountAccessResult.consent_uri += "state=" + HttpUtility.UrlEncode(model.FlowId); return(new BankingResult <string>(ResultStatus.REDIRECT, url, accountAccessResult.consent_uri, rawData, flowContext: flowContext)); } catch (ApiCallException e) { throw e; } catch (ApiUnauthorizedException e) { throw e; } catch (PagerException e) { throw e; } catch (SdkUnauthorizedException e) { throw e; } catch (Exception e) { Console.Write("Check ca : " + apiUrl); await LogAsync(apiUrl, 500, Http.Get, e.ToString()); throw e; } }
static async Task Main(string[] args) { var services = new ServiceCollection(); services.AddBankingSdk(); // Setting general settings of BankingSDk BankSettings generalBankSettings = new BankSettings(); generalBankSettings.NcaId = "VALID_NCA_ID"; generalBankSettings.TlsCertificate = new X509Certificate2("ING-eidas_tls.pfx", "bankingsdk"); generalBankSettings.SigningCertificate = new X509Certificate2("ING-eidas_signing.pfx", "bankingsdk"); SdkApiSettings.CompanyKey = "f954a771-509b-43c9-a064-0a3f9c9bb9d3"; SdkApiSettings.ApplicationKey = "4d972ae0-13cf-44ad-a20a-9ff44b884ce7"; SdkApiSettings.Secret = "MMH74H6OCI5CHPX1OS56PI6HSEGAVZ9PU8V8KTXL87ADBB23VJX1OFDDPAOZA53MIPRI4ZQ54T8SI2FRLMPMCIBP5RSKE7LCEX5WTU952164HV5W46NYQQKAOCMNHF07I5NU7T71NTTKLHHJW5QHUWWXN4HQHWYWB9VLHKZK9WL669ZH5D0LZSMVI0HCLQT157JLV5CLGFI7L00OFAVE5N7SW9CRDW9SCUA9ZNV9APEUJPKS936K5P5SA1YV3VIT"; SdkApiSettings.TppLegalName = "EXTHAND"; SdkApiSettings.IsSandbox = true; BankingSDK.BE.ING.BeIngConnector bankConnector = new BeIngConnector(generalBankSettings); //BankingSDK.BE.KBC.BeKbcConnector bankConnector = new BeKbcConnector(generalBankSettings); string userId = Guid.NewGuid().ToString(); string userContect = (await bankConnector.RegisterUserAsync(userId)).GetData().ToJson(); string callBackUrl = "https://developer.bankingsdk.com/callback"; AccountsAccessRequest accountsAccessRequest = new AccountsAccessRequest { FlowId = SdkApiSettings.ApplicationKey, FrequencyPerDay = 4, RedirectUrl = callBackUrl, PsuIp = "127.0.0.1", SingleAccount = "BE91732047678076" }; BankingResult <string> bankingResult = await bankConnector.RequestAccountsAccessAsync(accountsAccessRequest); if (bankingResult.GetStatus() == ResultStatus.REDIRECT) { // We get the flow context. var flowContext = bankingResult.GetFlowContext(); string redirectUrlOnTheBank = bankingResult.GetData(); var psi = new ProcessStartInfo(@"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"); psi.Arguments = redirectUrlOnTheBank; Process.Start(psi); Console.WriteLine("QueryString received?"); string queryString = Console.ReadLine(); BankingResult <IUserContext> result = await bankConnector.RequestAccountsAccessFinalizeAsync(flowContext, queryString); if (result.GetStatus() == ResultStatus.DONE) { Console.WriteLine("Ok. Cool."); BankingResult <List <Account> > accounts = await bankConnector.GetAccountsAsync(); foreach (Account account in accounts.GetData()) { Console.WriteLine("Account " + account.Iban); BankingResult <List <Balance> > resultBalances = await bankConnector.GetBalancesAsync(account.Iban); if (resultBalances.GetStatus() == ResultStatus.DONE) { List <Balance> accountBalances = resultBalances.GetData(); foreach (Balance balance in accountBalances) { Console.WriteLine(" Balance : " + balance.BalanceAmount + " " + balance.ReferenceDate?.ToString("dd MMM yyyy")); } } } } } Console.ReadLine(); return; }
static async Task Main(string[] args) { var services = new ServiceCollection(); services.AddBankingSdk(); string userContext = ""; string sourceIban = "LU147856985236589658"; /* * For payment */ string counterpartIban = "LU147856985236589659"; string counterpartName = "test"; string remittance = "Test BankingSDK payment to be refund"; double paymentAmount = 1.37; /* * the URL where the Bank will redirect. * Majority of banks requires it to be among the callback URLs defined during the sandbox or * production onboarding */ string callBackUrl = "https://www.bankingsdk.com/"; // Setting general settings of BankingSDk BankSettings generalBankSettings = new BankSettings(); // Official TPP ID given by central bank authorities generalBankSettings.NcaId = "VALID_NCA_ID"; // identification certificate aka QWAC // generalBankSettings.TlsCertificate = new X509Certificate2("ING-eidas_tls.pfx", "YOUR_PASSWORD"); // signing certificate aka QSEAL // generalBankSettings.SigningCertificate = new X509Certificate2("ING-eidas_signing.pfx", "YOUR_PASSWORD"); // URL of the public PEM file (rarely (never?) used in sandbox) generalBankSettings.PemFileUrl = "https://my.domain.tldn/qwac-public.pem"; /* * Data to identify your company and application in BankingSDK developer platform developer.BankingSDK.com */ SdkApiSettings.CompanyKey = "f954a771-509b-43c9-a064-0a3f9c9bb9d3"; SdkApiSettings.ApplicationKey = "4d972ae0-13cf-44ad-a20a-9ff44b884ce7"; SdkApiSettings.Secret = "MMH74H6OCI5CHPX1OS56PI6HSEGAVZ9PU8V8KTXL87ADBB23VJX1OFDDPAOZA53MIPRI4ZQ54T8SI2FRLMPMCIBP5RSKE7LCEX5WTU952164HV5W46NYQQKAOCMNHF07I5NU7T71NTTKLHHJW5QHUWWXN4HQHWYWB9VLHKZK9WL669ZH5D0LZSMVI0HCLQT157JLV5CLGFI7L00OFAVE5N7SW9CRDW9SCUA9ZNV9APEUJPKS936K5P5SA1YV3VIT"; /* * You TPP legal name */ SdkApiSettings.TppLegalName = "TTP_NAME"; /* * Want to work in sandbox mode, so the SDK will take bank's sandbox API URLs */ SdkApiSettings.IsSandbox = true; /* * Want to debug the body sent and received into developer.BankingSDK.com logging * Take care of privacy of the data contained in thos bodies !!! * Should only be used in production tests */ SdkApiSettings.IsDebug = true; /* * BNP */ /* * BNP App client Id and secret received when creating the sandbox app or when onboarding in production * Some bank only needs the client id, some don't use it and only need the identity inside the qwac cert */ generalBankSettings.AppClientId = "DefaultApplication_SANDBOX_c26a5f47-e6c4-41c5-8a8c-cb4ff7d4e006"; generalBankSettings.AppClientSecret = "0f64ed93-f9e4-4c4e-89e2-7dc8fc966ea3"; /* * Direct instantiation of the connector without using the BankingFactory. Mandatory when using connector * that are still in development which are not accessible through the factory */ var bankConnector = new LuBilConnector(generalBankSettings); /* * If you don't want to do the SCA into the bank each time you run the App, * grab the user context from the console debug output and past it here. * You should do it to test the token refreshing in the SDK Connector. * The user context may change when getting balance or transaction so pay attention to console output * This userContext should be saved for later reuse in a normal app */ userContext = "{\"UserId\":\"1d623d7c-d419-411e-9fa4-07a9979ac499\",\"Tokens\":[{\"TokenType\":\"Bearer\",\"AccessToken\":\"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJvSjNmUkF2Sk91TVZFTlZpRThobmFCM0pWRW5kSVo4el81RXd2dk5MVEdBIn0.eyJqdGkiOiJlYTk5OTZmNC04MWZiLTRlNzMtYTM4NS0zNWFhZjQyN2Q2ZTYiLCJleHAiOjE2MDc5NDYwOTYsIm5iZiI6MCwiaWF0IjoxNjA3OTQ1Nzk2LCJpc3MiOiJodHRwczovL2FwaS1sb2dpbi5iaWwuY29tL2F1dGgvcmVhbG1zL1RQUCIsImF1ZCI6ImJyb2tlciIsInN1YiI6IjU4NDQ0OWM2LTQ4MTUtNGQ3ZC04MzJiLWZlYzRiNWZlMTE4YiIsInR5cCI6IkJlYXJlciIsImF6cCI6IkRlZmF1bHRBcHBsaWNhdGlvbl9TQU5EQk9YX2MyNmE1ZjQ3LWU2YzQtNDFjNS04YThjLWNiNGZmN2Q0ZTAwNiIsIm5vbmNlIjoiOWIzNjNkMzgtNzUwMS00M2NhLTk5YjQtZDA4MWY2MTQ3MGQ3IiwiYXV0aF90aW1lIjoxNjA3OTQ0ODczLCJzZXNzaW9uX3N0YXRlIjoiMzQxNTYxZjItNmJjNi00NmZlLTg1ZDYtNmQwODVjOTYzMjgwIiwiYWNyIjoiMSIsInJlc291cmNlX2FjY2VzcyI6eyJicm9rZXIiOnsicm9sZXMiOlsicmVhZC10b2tlbiJdfX0sInNjb3BlIjoib2ZmbGluZV9hY2Nlc3MgcHJvZmlsZSBlbWFpbCBhaXNwIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJvcmdhbml6YXRpb24iOiJCRTA3MDE5NjE1ODEiLCJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsImFpc3AiXSwicHJlZmVycmVkX3VzZXJuYW1lIjoicHN1X3JldGFpbCJ9.M-bKwvJ6YVRh0-uYByPp1gH-eg7NVLhl8uvbDuvG9XNmzZjpPaREmO9ae3csr-oLkCFlWxbQxKxdt4HgCIj_eM8Of1pmm0Tt9SMshyCm-rNlIfs1oDISEE8USLbSC84oyQARZPxq64f-xnIIyd7v6rs2j1dt7cKtfrOby_WQ1Mod3NQjKQniwlR6kEpMq9P0tmMCNnic-yQHu8sgURHGazr3CBNJMC3P71RSZBmg7LGvBNAniLy3jH9Jrwenmz4j811h51XTuhhrNeRKP7cTfOWbqJQ-GV2L7rvlDo5GgnuyKIxKixvcjFwRNSOtGNXm7vAnkyMIO5eQ5tkfEEXI5Q\",\"TokenValidUntil\":\"2020-12-14T11:40:36.6404961+00:00\",\"RefreshToken\":\"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI5MTEyZGYxMC05NDM5LTRkMGEtYTRhNy0zMzI2ZDY2YmM2MzMifQ.eyJqdGkiOiJjMTg5YzRmZS02YzdiLTRlZmYtOGE4Yy1hMjVmZWNkYjhmOTkiLCJleHAiOjAsIm5iZiI6MCwiaWF0IjoxNjA3OTQ1Nzk2LCJpc3MiOiJodHRwczovL2FwaS1sb2dpbi5iaWwuY29tL2F1dGgvcmVhbG1zL1RQUCIsImF1ZCI6Imh0dHBzOi8vYXBpLWxvZ2luLmJpbC5jb20vYXV0aC9yZWFsbXMvVFBQIiwic3ViIjoiNTg0NDQ5YzYtNDgxNS00ZDdkLTgzMmItZmVjNGI1ZmUxMThiIiwidHlwIjoiT2ZmbGluZSIsImF6cCI6IkRlZmF1bHRBcHBsaWNhdGlvbl9TQU5EQk9YX2MyNmE1ZjQ3LWU2YzQtNDFjNS04YThjLWNiNGZmN2Q0ZTAwNiIsIm5vbmNlIjoiOWIzNjNkMzgtNzUwMS00M2NhLTk5YjQtZDA4MWY2MTQ3MGQ3IiwiYXV0aF90aW1lIjowLCJzZXNzaW9uX3N0YXRlIjoiMzQxNTYxZjItNmJjNi00NmZlLTg1ZDYtNmQwODVjOTYzMjgwIiwicmVzb3VyY2VfYWNjZXNzIjp7ImJyb2tlciI6eyJyb2xlcyI6WyJyZWFkLXRva2VuIl19fSwic2NvcGUiOiJvZmZsaW5lX2FjY2VzcyBwcm9maWxlIGVtYWlsIGFpc3AifQ.iwLOzJYbFqGOLa0XTk6nruCIdIYpn1NtqXpPlpZR9Y0\"}],\"Accounts\":[{\"AccessToken\":\"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJvSjNmUkF2Sk91TVZFTlZpRThobmFCM0pWRW5kSVo4el81RXd2dk5MVEdBIn0.eyJqdGkiOiJlYTk5OTZmNC04MWZiLTRlNzMtYTM4NS0zNWFhZjQyN2Q2ZTYiLCJleHAiOjE2MDc5NDYwOTYsIm5iZiI6MCwiaWF0IjoxNjA3OTQ1Nzk2LCJpc3MiOiJodHRwczovL2FwaS1sb2dpbi5iaWwuY29tL2F1dGgvcmVhbG1zL1RQUCIsImF1ZCI6ImJyb2tlciIsInN1YiI6IjU4NDQ0OWM2LTQ4MTUtNGQ3ZC04MzJiLWZlYzRiNWZlMTE4YiIsInR5cCI6IkJlYXJlciIsImF6cCI6IkRlZmF1bHRBcHBsaWNhdGlvbl9TQU5EQk9YX2MyNmE1ZjQ3LWU2YzQtNDFjNS04YThjLWNiNGZmN2Q0ZTAwNiIsIm5vbmNlIjoiOWIzNjNkMzgtNzUwMS00M2NhLTk5YjQtZDA4MWY2MTQ3MGQ3IiwiYXV0aF90aW1lIjoxNjA3OTQ0ODczLCJzZXNzaW9uX3N0YXRlIjoiMzQxNTYxZjItNmJjNi00NmZlLTg1ZDYtNmQwODVjOTYzMjgwIiwiYWNyIjoiMSIsInJlc291cmNlX2FjY2VzcyI6eyJicm9rZXIiOnsicm9sZXMiOlsicmVhZC10b2tlbiJdfX0sInNjb3BlIjoib2ZmbGluZV9hY2Nlc3MgcHJvZmlsZSBlbWFpbCBhaXNwIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJvcmdhbml6YXRpb24iOiJCRTA3MDE5NjE1ODEiLCJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsImFpc3AiXSwicHJlZmVycmVkX3VzZXJuYW1lIjoicHN1X3JldGFpbCJ9.M-bKwvJ6YVRh0-uYByPp1gH-eg7NVLhl8uvbDuvG9XNmzZjpPaREmO9ae3csr-oLkCFlWxbQxKxdt4HgCIj_eM8Of1pmm0Tt9SMshyCm-rNlIfs1oDISEE8USLbSC84oyQARZPxq64f-xnIIyd7v6rs2j1dt7cKtfrOby_WQ1Mod3NQjKQniwlR6kEpMq9P0tmMCNnic-yQHu8sgURHGazr3CBNJMC3P71RSZBmg7LGvBNAniLy3jH9Jrwenmz4j811h51XTuhhrNeRKP7cTfOWbqJQ-GV2L7rvlDo5GgnuyKIxKixvcjFwRNSOtGNXm7vAnkyMIO5eQ5tkfEEXI5Q\",\"Id\":\"1ee1f9d4d11255bb85x270377c2927b9\",\"Iban\":\"LU1600501234925111\",\"Currency\":\"EUR\",\"Description\":\"LU1600501234925111\"},{\"AccessToken\":\"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJvSjNmUkF2Sk91TVZFTlZpRThobmFCM0pWRW5kSVo4el81RXd2dk5MVEdBIn0.eyJqdGkiOiJlYTk5OTZmNC04MWZiLTRlNzMtYTM4NS0zNWFhZjQyN2Q2ZTYiLCJleHAiOjE2MDc5NDYwOTYsIm5iZiI6MCwiaWF0IjoxNjA3OTQ1Nzk2LCJpc3MiOiJodHRwczovL2FwaS1sb2dpbi5iaWwuY29tL2F1dGgvcmVhbG1zL1RQUCIsImF1ZCI6ImJyb2tlciIsInN1YiI6IjU4NDQ0OWM2LTQ4MTUtNGQ3ZC04MzJiLWZlYzRiNWZlMTE4YiIsInR5cCI6IkJlYXJlciIsImF6cCI6IkRlZmF1bHRBcHBsaWNhdGlvbl9TQU5EQk9YX2MyNmE1ZjQ3LWU2YzQtNDFjNS04YThjLWNiNGZmN2Q0ZTAwNiIsIm5vbmNlIjoiOWIzNjNkMzgtNzUwMS00M2NhLTk5YjQtZDA4MWY2MTQ3MGQ3IiwiYXV0aF90aW1lIjoxNjA3OTQ0ODczLCJzZXNzaW9uX3N0YXRlIjoiMzQxNTYxZjItNmJjNi00NmZlLTg1ZDYtNmQwODVjOTYzMjgwIiwiYWNyIjoiMSIsInJlc291cmNlX2FjY2VzcyI6eyJicm9rZXIiOnsicm9sZXMiOlsicmVhZC10b2tlbiJdfX0sInNjb3BlIjoib2ZmbGluZV9hY2Nlc3MgcHJvZmlsZSBlbWFpbCBhaXNwIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJvcmdhbml6YXRpb24iOiJCRTA3MDE5NjE1ODEiLCJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsImFpc3AiXSwicHJlZmVycmVkX3VzZXJuYW1lIjoicHN1X3JldGFpbCJ9.M-bKwvJ6YVRh0-uYByPp1gH-eg7NVLhl8uvbDuvG9XNmzZjpPaREmO9ae3csr-oLkCFlWxbQxKxdt4HgCIj_eM8Of1pmm0Tt9SMshyCm-rNlIfs1oDISEE8USLbSC84oyQARZPxq64f-xnIIyd7v6rs2j1dt7cKtfrOby_WQ1Mod3NQjKQniwlR6kEpMq9P0tmMCNnic-yQHu8sgURHGazr3CBNJMC3P71RSZBmg7LGvBNAniLy3jH9Jrwenmz4j811h51XTuhhrNeRKP7cTfOWbqJQ-GV2L7rvlDo5GgnuyKIxKixvcjFwRNSOtGNXm7vAnkyMIO5eQ5tkfEEXI5Q\",\"Id\":\"7gg1f9d4d11255bb85x270377c2927b9\",\"Iban\":\"LU1600501964925789\",\"Currency\":\"EUR\",\"Description\":\"LU1600501964925789\"}]}"; //await bankConnector.RegisterUserAsync("1"); // What to test ? bool testConsent = false; bool testBalancesAndTransactions = false; bool testPayment = true; try { /* * GET CONSENT */ if (testConsent && (userContext == "")) { string userId = Guid.NewGuid().ToString(); userContext = (await bankConnector.RegisterUserAsync(userId)).GetData().ToJson(); bankConnector.UserContext = userContext; // Only way to reset the bankConnector.UserContextChanged AccountsAccessRequest accountsAccessRequest = new AccountsAccessRequest { FlowId = Guid.NewGuid().ToString(), // Id you manage to link the request to the finalize FrequencyPerDay = 4, RedirectUrl = callBackUrl, PsuIp = "127.0.0.1", SingleAccount = sourceIban, // see BankingSDK doc BalanceAccounts = new List <string>() { sourceIban }, // see BankingSDK doc TransactionAccounts = new List <string>() { sourceIban } // see BankingSDK doc }; BankingResult <string> bankingResult = await bankConnector.RequestAccountsAccessAsync(accountsAccessRequest); if (bankingResult.GetStatus() == ResultStatus.REDIRECT) { /* * We get the flow context. It should be saved and * restored later when the bank call back your app * contains necessary data to finalize the consent */ var flowContext = bankingResult.GetFlowContext(); string redirectUrlOnTheBank = bankingResult.GetData(); Console.WriteLine("Got redirected to the bank : " + redirectUrlOnTheBank); Console.Write("Open URL ? [Y/n] :"); string openUrl = Console.ReadLine(); if (openUrl.ToUpper() != "N") { OpenUrl(redirectUrlOnTheBank); } Console.Write("Received queryString: "); string queryString = Console.ReadLine(); /* * The flowContext you should have restored in a web app, not needed in a console app :) */ BankingResult <IUserContext> result = await bankConnector.RequestAccountsAccessFinalizeAsync(flowContext, queryString); if (result.GetStatus() == ResultStatus.DONE) { Console.WriteLine("Cool, succesfuly got consent."); Console.WriteLine("************ User context to be saved :"); Console.WriteLine(bankConnector.UserContext.Replace("\"", "\\\"")); userContext = bankConnector.UserContext; bankConnector.UserContext = userContext; // Only way to reset the bankConnector.UserContextChanged } } } /* * GET BALANCES AND TRANSACTIONS */ if (testBalancesAndTransactions && (userContext != "")) { bankConnector.UserContext = userContext; BankingResult <List <Account> > accounts = await bankConnector.GetAccountsAsync(); foreach (Account account in accounts.GetData()) { Console.WriteLine("Account " + account.Iban); BankingResult <List <Balance> > resultBalances = await bankConnector.GetBalancesAsync(account.Id); if (bankConnector.UserContextChanged) { Console.WriteLine("************ User context has changed :"); Console.WriteLine(bankConnector.UserContext.Replace("\"", "\\\"")); userContext = bankConnector.UserContext; bankConnector.UserContext = userContext; // Only way to reset the bankConnector.UserContextChanged } if (resultBalances.GetStatus() == ResultStatus.DONE) { List <Balance> accountBalances = resultBalances.GetData(); foreach (Balance balance in accountBalances) { Console.WriteLine(" Balance : " + balance.BalanceAmount.Amount + balance.BalanceAmount.Currency + " (" + balance.BalanceType + ") " + balance.ReferenceDate?.ToString("dd MMM yyyy")); } } var requestedAt = DateTime.Now; TransactionsPaginatedDto paginatedDto = new TransactionsPaginatedDto(); paginatedDto.Page = 0; paginatedDto.Size = 1000; paginatedDto.Total = 0; paginatedDto.Transactions = new List <TransactionDto>(); IPagerContext pagerContext = bankConnector.CreatePageContext(100); while (!pagerContext.IsLastPage()) { BankingResult <List <Transaction> > resultTransactions = await bankConnector.GetTransactionsAsync(account.Id, pagerContext); if (bankConnector.UserContextChanged) { Console.WriteLine("************ User context has changed :"); Console.WriteLine(bankConnector.UserContext.Replace("\"", "\\\"")); userContext = bankConnector.UserContext; bankConnector.UserContext = userContext; // Only way to reset the bankConnector.UserContextChanged } pagerContext = resultTransactions.GetPagerContext(); if (resultTransactions.GetStatus() == ResultStatus.DONE) { List <Transaction> accountTransactions = resultTransactions.GetData(); foreach (Transaction transaction in accountTransactions) { TransactionDto dto = new TransactionDto(); dto.Amount = transaction.Amount; dto.Currency = transaction.Currency; dto.Description = transaction.Description; dto.CounterpartReference = transaction.CounterpartReference; dto.CounterpartName = transaction.CounterpartName; dto.ExecutionDate = transaction.ExecutionDate; dto.ValueDate = transaction.ValueDate; dto.RequestedAt = transaction.ValueDate; dto.Id = Guid.NewGuid(); paginatedDto.Transactions.Add(dto); paginatedDto.Total += accountTransactions.Count; Console.WriteLine(" Transaction : " + transaction.Amount + transaction.Currency + " From " + transaction.CounterpartName + "/" + transaction.CounterpartReference + " (" + transaction.Description?.Replace("\n", "\\n") + ") Exec: " + transaction.ExecutionDate?.ToString("dd MMM yyyy") + ", Value: " + transaction.ValueDate?.ToString("dd MMM yyyy")); } } // break; pagerContext.NextPage(); } string json = JsonConvert.SerializeObject(paginatedDto, Formatting.Indented); // Console.WriteLine(json); } } /* * DO PAYMENT */ if (testPayment) { Console.WriteLine("+++++ Initiating payment"); if (string.IsNullOrEmpty(userContext)) { await bankConnector.RegisterUserAsync(Guid.NewGuid().ToString()); } else { bankConnector.UserContext = userContext; } var paymentInitResult = await bankConnector.CreatePaymentInitiationRequestAsync( new PaymentInitiationRequest { FlowId = Guid.NewGuid().ToString(), Amount = new decimal(paymentAmount), Currency = "EUR", Recipient = new RecipientInfo { Iban = counterpartIban, Name = counterpartName }, Debtor = new DebtorInfo { Iban = sourceIban, Name = "test", Currency = "EUR" }, RequestedExecutionDate = DateTime.Now, PsuIp = "80.80.0.0", RedirectUrl = callBackUrl, EndToEndId = Guid.NewGuid().ToString().Replace("-", ""), RemittanceInformationUnstructured = remittance }); if (bankConnector.UserContextChanged) { Console.WriteLine("***** User context has changed :"); Console.WriteLine(bankConnector.UserContext.Replace("\"", "\\\"")); userContext = bankConnector.UserContext; bankConnector.UserContext = userContext; // Only way to reset the bankConnector.UserContextChanged } if (paymentInitResult.GetStatus() == ResultStatus.REDIRECT) { Console.WriteLine($"----- Payment init done @{DateTime.UtcNow}, getting consent"); // We get the flow context. var flowContext = paymentInitResult.GetFlowContext(); string redirectUrlOnTheBank = paymentInitResult.GetData(); Console.WriteLine("Got redirected to the bank : " + redirectUrlOnTheBank); Console.Write("Open URL ? [Y/n] :"); string openUrl = Console.ReadLine(); if (openUrl.ToUpper() != "N") { OpenUrl(redirectUrlOnTheBank); } Console.Write("Received queryString: "); string queryString = Console.ReadLine(); Console.WriteLine("----- Got consent, finalizing"); BankingResult <PaymentStatus> paymentFinalizeResult = await bankConnector.CreatePaymentInitiationRequestFinalizeAsync(flowContext, queryString); if (bankConnector.UserContextChanged) { Console.WriteLine("***** User context has changed :"); Console.WriteLine(bankConnector.UserContext.Replace("\"", "\\\"")); userContext = bankConnector.UserContext; bankConnector.UserContext = userContext; // Only way to reset the bankConnector.UserContextChanged } if (paymentFinalizeResult.GetStatus() == ResultStatus.DONE) { Console.WriteLine("----- Payment finalized. current status :"); string json = JsonConvert.SerializeObject(paymentFinalizeResult.GetData(), Formatting.Indented); Console.WriteLine(json); Console.WriteLine(">>>>> Payment finished"); } } } } catch (Exception e) { Console.WriteLine(e.ToString()); } // Console.ReadLine(); }