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));
        }
Exemple #3
0
        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;
            }
        }
Exemple #4
0
        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;
            }
        }
Exemple #6
0
        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;
            }
        }
Exemple #8
0
        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;
        }
Exemple #9
0
        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();
        }