Thrust подключается к 3,400+ европейским банкам через два Open Banking провайдера: EnableBanking (primary) и Tink by Visa (secondary).
Переключение между провайдерами — одна строка кода в BankProviderManager.activeProviderType. Это позволяет мгновенно выпустить hotfix при падении одного из провайдеров.
enum BankProviderType: String, Codable { case goCardless = "goCardless" // deprecated, нет доступа к API case enableBanking = "enableBanking" // primary case tink = "tink" // secondary}
Base URL: https://api.enablebanking.com/Endpoints:- GET /aspsps?country={code} # Список банков- POST /sessions # Создание сессии (авторизация)- GET /sessions/{id} # Статус сессии- GET /accounts/{id} # Информация о счёте- GET /accounts/{id}/balances # Балансы- GET /accounts/{id}/transactions # Транзакции
1. JWT подписывается PEM ключом (RS256)2. POST /sessions → redirect URL для банка3. Пользователь авторизуется в банке через SFSafariViewController4. Callback: thrust://oauth_callback?code=AUTH_CODE5. GET /sessions/{code} → список счетов6. GET /accounts/{id}/transactions → транзакции
Base URL: https://api.tink.com/OAuth:- POST /api/v1/oauth/token # Client & User tokens- POST /api/v1/user/create # Создание пользователя- POST /api/v1/oauth/authorization-grant # Authorization grantData:- GET /api/v1/providers?market={code} # Список банков- GET /data/v2/accounts # Счета- GET /data/v2/transactions # Транзакции (с пагинацией)
1. POST /api/v1/oauth/token (client_credentials) → client_access_token (30 мин)2. POST /api/v1/user/create → user_id3. POST /api/v1/oauth/authorization-grant → authorization_code4. Open Tink Link URL → SFSafariViewController https://link.tink.com/1.0/transactions/connect-accounts ?client_id=...&redirect_uri=thrust://oauth_callback &authorization_code=...&market=PL5. Callback: thrust://oauth_callback?code=USER_AUTH_CODE6. POST /api/v1/oauth/token (authorization_code) → user_access_token + refresh_token7. GET /data/v2/accounts → список счетов8. GET /data/v2/transactions → транзакции с bookedDateTime
// Security/CertificatePinningManager.swift// Все HTTP запросы проходят через pinned URLSessionlet session = CertificatePinningManager.shared.createPinnedSession()
// BankProviderManager.swift:13@Published var activeProviderType: BankProviderType = .enableBanking// Меняем на:@Published var activeProviderType: BankProviderType = .tink
Существующие подключения продолжат работать через свой провайдер (хранится в bankProviderRaw каждого счёта). Переключение влияет только на новые подключения.