Esempio n. 1
0
        public AdminController(IStorageService storageClient, IPagerContext ctx)
        {
            db = ctx;

            // TODO: Submit a bug report about the message on having this in the controller signature
            this.storageClient = storageClient;
        }
Esempio n. 2
0
        public async Task <BankingResult <List <Transaction> > > GetTransactionsAsync(string accountId, IPagerContext context = null)
        {
            try
            {
                var account = _userContextLocal.Accounts.FirstOrDefault(x => x.Id == accountId) ?? throw new ApiCallException("Invalide accountId");
                var consent = _userContextLocal.Consents.FirstOrDefault(x => x.ConsentId == account.BalancesConsentId && x.ValidUntil > DateTime.Now) ?? throw new ApiCallException("Consent invalide or expired");
                BerlinGroupPagerContext pagerContext = (context as BerlinGroupPagerContext) ?? new BerlinGroupPagerContext();

                var client = GetClient();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.DefaultRequestHeaders.Add("Consent-ID", consent.ConsentId);
                var url    = $"/sgbt/lu/bg/v1/accounts/{accountId}/transactions{pagerContext.GetRequestParams()}";
                var result = await client.GetAsync(url);

                string rawData = await result.Content.ReadAsStringAsync();

                var model = JsonConvert.DeserializeObject <Models.SocieteGeneraleTransactionsModel>(rawData);
                pagerContext.SetPage(pagerContext.GetNextPage());
                pagerContext.SetPageTotal(model.transactions.PageTotal);

                var data = model.transactions.all.Select(x => new Transaction
                {
                    Id     = x.transactionId,
                    Amount = x.transactionAmount.amount,
                    CounterpartReference = x.creditorAccount.iban,
                    Currency             = x.transactionAmount.currency,
                    Description          = x.remittanceInformationUnstructured,
                    ExecutionDate        = x.bookingDate,
                    ValueDate            = x.valueDate
                }).ToList();

                return(new BankingResult <List <Transaction> >(ResultStatus.DONE, url, data, rawData, pagerContext));
            }
            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;
            }
        }
Esempio n. 3
0
        public async Task <BankingResult <List <Transaction> > > GetTransactionsAsync(string accountId, IPagerContext context = null, string psuIp = null)
        {
            try
            {
                var             account      = _userContextLocal.Accounts.FirstOrDefault(x => x.Id == accountId) ?? throw new ApiCallException("Invalide accountId");
                var             consent      = _userContextLocal.Consents.FirstOrDefault(x => x.ConsentId == account.BalancesConsentId && x.ValidUntil > DateTime.Now) ?? throw new ApiCallException("Consent invalide or expired");
                KbcPagerContext pagerContext = (context as KbcPagerContext) ?? new KbcPagerContext();

                var client = GetClient();

                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.DefaultRequestHeaders.Add("Consent-ID", consent.ConsentId);
                if (consent.TokenValidUntil < DateTime.Now)
                {
                    await RefreshToken(consent);
                }
                client.DefaultRequestHeaders.Add("Authorization", consent.Token);
                var url    = pagerContext.GetRequestParams($"/psd2/v2/accounts/{accountId}/transactions");
                var result = await client.GetAsync(url);


                string rawData = await result.Content.ReadAsStringAsync();

                var model = JsonConvert.DeserializeObject <KbcTransactionsModelDto>(rawData);
                pagerContext.AddNextPageKey(model.transactions._links.next);

                var data = model.transactions.booked.Select(x => new Transaction
                {
                    Id     = x.transactionId,
                    Amount = x.transactionAmount.amount,
                    CounterpartReference = x.transactionAmount.amount >= Decimal.Zero ? x.debtorAccount?.iban : x.creditorAccount?.iban,
                    CounterpartName      = x.transactionAmount.amount >= Decimal.Zero ? x.debtorName : x.creditorName,
                    Currency             = x.transactionAmount.currency,
                    Description          = x.remittanceInformationUnstructured,
                    ExecutionDate        = x.bookingDate,
                    ValueDate            = x.valueDate
                }).ToList();

                return(new BankingResult <List <Transaction> >(ResultStatus.DONE, url, data, rawData, pagerContext));
            }
            catch (ApiCallException 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 <List <Transaction> > > GetTransactionsAsync(string accountId, IPagerContext context = null)
        {
            try
            {
                var             account      = _userContextLocal.Accounts.FirstOrDefault(x => x.Id == accountId) ?? throw new ApiCallException("Invalide accountId");
                var             accessToken  = _userContextLocal.Tokens.FirstOrDefault(x => x.AccessToken == account.AccessToken && x.TokenValidUntil > DateTime.Now) ?? throw new ApiCallException("Consent invalide or expired");
                BnpPagerContext pagerContext = (context as BnpPagerContext) ?? new BnpPagerContext();

                var client = GetClient();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.DefaultRequestHeaders.Add("Authorization", accessToken.FullToken);

                var url = $"/v1/accounts/{accountId}/transactions{pagerContext.GetRequestParams()}";

                client.SignRequest(_settings.SigningCertificate, HttpMethod.Get, url, _settings.PemFileUrl);
                var result = await client.GetAsync(url);

                List <Transaction> data    = new List <Transaction>();
                string             rawData = await result.Content.ReadAsStringAsync();

                if (result.StatusCode != System.Net.HttpStatusCode.NoContent)
                {
                    var model = JsonConvert.DeserializeObject <TransactionsDto>(rawData);
                    pagerContext.SetTotal((uint)model.pagination.rowCount);
                    pagerContext.SetPageTotal((uint)model.pagination.pageCount);

                    data = model.transactions?.Select(x => new Transaction
                    {
                        Id            = x.entryReference,
                        Amount        = x.transactionAmount.amount,
                        Currency      = x.transactionAmount.currency,
                        ExecutionDate = x.bookingDate,
                        ValueDate     = x.valueDate
                    }).ToList();
                }

                return(new BankingResult <List <Transaction> >(ResultStatus.DONE, url, data, rawData, pagerContext));
            }
            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;
            }
        }
Esempio n. 5
0
        public async Task <BankingResult <List <Transaction> > > GetTransactionsAsync(string accountId, IPagerContext context = null, string psuIp = null)
        {
            try
            {
                var account = _userContextLocal.Accounts.FirstOrDefault(x => x.Id == accountId) ?? throw new ApiCallException("Invalid accountId");
                BelfiusPagerContext pagerContext = (context as BelfiusPagerContext) ?? new BelfiusPagerContext();

                var client = GetClient();
                client.DefaultRequestHeaders.Add("Accept", "application/vnd.belfius.api+json; version=1.2");
                client.DefaultRequestHeaders.Add("Accept-Language", "en");
                client.DefaultRequestHeaders.Add("Redirect-URI", _userContextLocal.RedirectUri);
                if (account.Token.TokenValidUntil < DateTime.Now)
                {
                    await RefreshToken(account.Token);
                }
                client.DefaultRequestHeaders.Add("Authorization", account.Token.Token);
                var url    = basePath + $"/accounts/{accountId}/transactions{pagerContext.GetRequestParams()}";
                var result = await client.GetAsync(url);

                string rawData = await result.Content.ReadAsStringAsync();

                var model = JsonConvert.DeserializeObject <BelfiusTransactions>(rawData);
                pagerContext.AddNextPageKey(model._embedded.next_page_key);
                //TODO create pager context
                //pagerContext.SetPage(pagerContext.GetNextPage());
                //pagerContext.SetPageTotal(model._embedded.transactions..PageTotal);

                var data = model._embedded.transactions.Select(x => new Transaction
                {
                    Id     = x.transaction_ref,
                    Amount = x.amount,
                    CounterpartReference = x.counterparty_account,
                    Currency             = x.currency,
                    ExecutionDate        = x.execution_date,
                    Description          = x.communication,
                    CounterpartName      = x.counterparty_info
                }).ToList();

                // JGD Do we keep this trace?
                //await sdkApiConnector.Log((int)ConnectorType, _url, (int)watch.ElapsedMilliseconds, url, (int)result.StatusCode, Http.Get, requestedAt, _userContext.UserId, null/*model.account.iban*/);

                return(new BankingResult <List <Transaction> >(ResultStatus.DONE, url, data, rawData, pagerContext));
            }
            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 <List <Transaction> > > GetTransactionsAsync(string accountId, IPagerContext context = null, string psuIp = null)
        {
            try
            {
                var account     = _userContextLocal.Accounts.FirstOrDefault(x => x.Id == accountId) ?? throw new ApiCallException("Invalide accountId");
                var accessToken = _userContextLocal.Tokens.FirstOrDefault(x => x.AccessToken == account.AccessToken && x.TokenValidUntil > DateTime.Now) ?? throw new ApiCallException("Consent invalide or expired");
                StetPagerContext pagerContext = (context as StetPagerContext) ?? new StetPagerContext();

                var client = GetClient();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.DefaultRequestHeaders.Add("Authorization", accessToken.FullToken);

                var signingUrl = $"/psd2/v2/accounts/{accountId}/transactions"; // problem in BNP API
                var url        = pagerContext.GetRequestParams("/psd2/v2", $"/accounts/{accountId}/transactions");

                client.SignRequest(_settings.SigningCertificate, HttpMethod.Get, signingUrl, _settings.PemFileUrl);
                var result = await client.GetAsync(url);

                List <Transaction> data    = new List <Transaction>();
                string             rawData = await result.Content.ReadAsStringAsync();

                if (result.StatusCode != System.Net.HttpStatusCode.NoContent)
                {
                    var model = JsonConvert.DeserializeObject <TransactionsDto>(rawData);
                    pagerContext.AddNextPageKey(model._links?.next?.href);

                    // pagerContext.SetTotal((uint)model.pagination.rowCount);
                    // pagerContext.SetPageTotal((uint)model.pagination.pageCount);

                    data = model.transactions?.Where(x => x.status.ToLower() == "book").Select(x => new Transaction
                    {
                        Id            = x.entryReference,
                        Amount        = x.transactionAmount.amount,
                        Currency      = x.transactionAmount.currency,
                        ExecutionDate = x.bookingDate,
                        ValueDate     = x.valueDate,
                        Description   = x.additionalTransactionInformation?.Narrative?.Aggregate((i, j) => i + "\n" + j)
                    }).ToList();
                }

                return(new BankingResult <List <Transaction> >(ResultStatus.DONE, url, data, rawData, pagerContext));
            }
            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;
            }
        }
Esempio n. 7
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();
        }