Download the PHP package vs-point/kb-adaa without Composer
On this page you can find all versions of the php package vs-point/kb-adaa. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download vs-point/kb-adaa
More information about vs-point/kb-adaa
Files in vs-point/kb-adaa
Package kb-adaa
Short Description A PHP library for communication with the Komerční banka Account Direct Access (ADAA) API v2.
License MIT
Informations about the package kb-adaa
vs-point/kb-adaa
PHP knihovna pro komunikaci s Komerční banka Account Direct Access API v2. Typovaný interface pro účty, zůstatky, transakce, výpisy v PDF a notifikace o pohybech.
Pokrývá všech 5 vrstev integrace:
| Vrstva | Co dělá | Třída |
|---|---|---|
| Runtime ADAA | čte účty, zůstatky, transakce, výpisy, spravuje notifikační subscriptions | KbAdaaClient->accounts, ->balances, ->transactions, ->statements, ->eventSubscriptions |
| OAuth2 | vyměňuje authorization code za tokeny, refreshuje access token, sestavuje login URL | KbAdaaClient->oauth2 |
| Client Registration (mTLS) | žádá KB o software statement JWT pro tvou aplikaci | KbAdaaClient->clientRegistration |
| Application Registration | builduje redirect URL a dešifruje AES-256-GCM odpověď z callbacku | KbAdaaClient->applicationRegistration |
| Event API receiver | server-side helpery pro implementaci tvého webhook endpointu | KbAdaaClient->eventApi |
Instalace
Vyžaduje PHP ≥ 8.2 a rozšíření openssl, json, curl (curl ≥ 7.71 pro inline certifikát).
Architektura konfigurace
ADAA má tři různé apiKey (Client Registration, OAuth2, ADAA) a každý se získává zvlášť v developer portálu. Proto má knihovna tři oddělené config objekty:
Při inicializaci KbAdaaClient jsou OAuth2Config a ClientRegistrationConfig volitelné — předáš jen ty, které potřebuješ pro aktuální use-case.
Sandbox vs produkce
Token storage
Access token žije pouze 3 minuty, refresh token 12 měsíců. Knihovna vyžaduje TokenStorageInterface:
Pro lokální vývoj / CLI použij InMemoryTokenStorage. Pro produkci napiš vlastní implementaci nad svou DB / Redisem / secret managerem.
Auto-refresh: Pokud klientovi předáš OAuth2Config, automaticky před každým voláním zkontroluje expiraci tokenu, sám refreshne a uloží nový. Pokud OAuth2Config nepředáš, používá se uložený access token jak je (chování pro „manuální“ režim).
Quick start — runtime ADAA
Předpokládá, že už máš access token + refresh token získaný OAuth2 flow (viz dál).
Konfigurace mTLS (Client Registration)
Software statement endpoint vyžaduje kvalifikovaný certifikát od I.CA nebo PostSignum (KB ho sama nevydává). Certifikační autority ho typicky dávají jako .p12 (PKCS#12). Knihovna nabízí tři cesty, vyber si podle toho, kde certifikát žije:
| Třída | Vstup | Kdy použít |
|---|---|---|
ClientRegistrationP12Config |
.p12 soubor nebo bytes + heslo |
Máš .p12 přímo od I.CA / PostSignum, nechceš konvertovat |
ClientRegistrationConfig |
cesta k .pem souboru |
Po jednorázové konverzi P12→PEM, certifikát žije na disku |
ClientRegistrationInlineConfig |
PEM string | Certifikát ze secret manageru / env proměnné |
Z .p12 souboru (přímo od certifikační autority)
Nejjednodušší — knihovna provede openssl_pkcs12_read() interně:
Pokud máš .p12 už načtený v paměti (typicky ze secret manageru):
OpenSSL 3.x heads-up:
openssl_pkcs12_read()selže na.p12šifrovaných legacy algoritmy (RC2 / 3DES) — časté u starších Windows exportů z I.CA. Pokud konstruktor vyhodí výjimku, proveď jednorázovou konverziopenssl pkcs12 -legacy ...a použijClientRegistrationConfigneboClientRegistrationInlineConfig.
Z PEM souboru na disku
Konverze .p12 → .pem:
Inline (PEM string ze secret manageru)
Žádný dočasný soubor se nezapisuje — používá CURLOPT_SSLCERT_BLOB (curl 7.71+).
Kompletní onboarding flow
KB onboarding je jednorázový proces na začátku integrace. Pak už jen průběžně refreshuješ token a voláš ADAA.
1. Software statement (jednou za 12 měsíců na aplikaci)
2. Application registration (jednou za 12 měsíců na klienta — provede uživatel přes browser)
Po dokončení se uživatel vrátí na tvůj registrationBackUri s ?salt=…&encryptedData=…. Dešifruj:
3. OAuth2 — získání access tokenu (uživatel se přihlásí do KB)
redirect_urise vždy bere zOAuth2Config::$redirectUri— KB ho vyžaduje shodný napříč authorize / token-exchange / refresh.
Callback handler:
Od této chvíle můžeš volat ADAA endpointy. Pokud máš OAuth2Config připojený na klientovi, refresh probíhá automaticky.
Použití runtime API
Účty
Zůstatky
Transakce
Throughput limit KB: 1 stažení / hodinu. Pro vyšší frekvenci použij Event API subscriptions níže.
Výpisy v PDF
Notifikace (subscription management)
KB volá tvůj endpoint z IP
194.50.202.179a194.50.226.179— povolit ve firewallu.
Event API receiver (serverová strana webhooku)
KB vyžaduje, aby tvůj endpoint implementoval dvě cesty:
POST /subscriptions/{subscriptionId}/events— musí vrátit HTTP 204 do 5 sekundGET /version— musí vrátit{"version": "1.0"}
Knihovna ti dává helper, který je framework-agnostický:
KB při 401/403/404 odpovědi subscription trvale zastaví (status STOPPED). Při 500 nebo timeout circuit breaker (SUSPENDED), opakování → STOPPED. Nereaguj 5xx kvůli své interní chybě — vrať 204 a process asynchronně.
Symfony DI integrace
Knihovna sama není Symfony bundle (žádný DI extension). Stačí YAML wiring:
Výjimky
Všechny API výjimky dědí z KbAdaaApiException. getHttpStatus(), getResponseBody(), getErrorCode() (parsovaný kód z {"errors":[{"code":"…"}]}).
| HTTP / důvod | Třída | Typické error codes |
|---|---|---|
| 400 | InvalidRequestException |
DATE_IN_FUTURE, INVALID_DATE_INTERVAL, INVALID_ACCOUNT_ID, INVALID_CORRELATION_ID, INVALID_CURRENCY |
| 401 | UnauthorisedException |
INVALID_TOKEN, 900900 |
| 403 | ForbiddenException |
ACCOUNT_ACCESS_DENIED, ACCOUNT_NOT_CONFIGURED, 900908 |
| 404 | NotFoundException |
ACCOUNT_NOT_FOUND, STATEMENT_NOT_FOUND, SUBSCRIPTION_NOT_FOUND |
| 429 | RateLimitException |
REQUEST_IS_THROTTLED (1 stažení/hod limit), getRetryAfterSeconds() |
| (refresh) | TokenRefreshFailedException |
Refresh token expiroval → uživatel musí re-authorize |
| (callback) | ApplicationRegistrationDecryptionException |
Špatný klíč / poškozený ciphertext |
| (webhook) | InvalidEventApiKeyException |
x-api-key z KB neodpovídá uložené hodnotě |
Přehled endpointů
| Service | Metoda | HTTP | Path |
|---|---|---|---|
accounts |
list() |
GET | /adaa/v2/accounts |
balances |
list(accountId) |
GET | /adaa/v2/accounts/{accountId}/balances |
transactions |
list(accountId, ?TransactionQuery) |
GET | /adaa/v2/accounts/{accountId}/transactions |
statements |
list(accountId, StatementListQuery) |
GET | /adaa/v2/accounts/{accountId}/statements |
statements |
download(accountId, statementId) |
GET | /adaa/v2/accounts/{accountId}/statements/{statementId} |
eventSubscriptions |
create(accountId, CreateSubscriptionPayload) |
POST | /adaa/v2/accounts/{accountId}/transactions/event-subscriptions |
eventSubscriptions |
get(accountId, subscriptionId) |
GET | /adaa/v2/accounts/{accountId}/transactions/event-subscriptions/{id} |
eventSubscriptions |
delete(accountId, subscriptionId) |
DELETE | /adaa/v2/accounts/{accountId}/transactions/event-subscriptions/{id} |
oauth2 |
buildAuthorizationUrl(scopes, ?state) |
— (browser redirect) | login.kb.cz nebo sandbox UI |
oauth2 |
exchangeAuthorizationCode(code) |
POST | /oauth2/v3/access_token |
oauth2 |
refresh(refreshToken) |
POST | /oauth2/v3/access_token |
clientRegistration |
issue(SoftwareStatementPayload) |
POST | /client-registration/v3/software-statements |
applicationRegistration |
buildRedirectUrl(env, RegistrationRequest) |
— (browser redirect) | client-registration-ui |
applicationRegistration |
decryptResponse(salt, encrypted, key) |
— (lokální AES-GCM dešifrování) | — |
eventApi |
handleEvent(body, expected, provided) |
— (server-side helper) | — |
Headless bootstrap v sandboxu
Sandbox OAuth2 obrazovka autorizační kód generuje čistě v JavaScriptu — žádné přihlašování, žádný backend roundtrip. Algoritmus je base64(JSON({userId, scopes})) bez = paddingu. Knihovna ho reprodukuje v PHP, takže integrační testy nemusí klikat v prohlížeči.
Pro plný integrační test stačí jen dva apiKey z developer portálu (KB_ADAA_API_KEY + KB_ADAA_OAUTH2_API_KEY); client_id a client_secret jsou KB-dokumentované sandbox defaults (ExampleClient-6303 / bUfDQ1fMmfaSlZBZXlxBOQ). Viz tests/Integration/SandboxBootstrapTest.php jako referenční E2E příklad — udělá code → token → accounts->list() proti reálnému KB sandboxu bez jakékoliv ruční interakce.
Pouze sandbox. Produkční token endpoint tento kód odmítne. V produkci musí uživatel projít opravdovým KB loginem na
https://login.kb.cz/autfe/ssologin— vizOAuth2Service::buildAuthorizationUrl().
Canary test sandboxového JS
Sandbox algoritmus je závislý na tom, že ho KB nezmění. Unit test testSandboxJavascriptStillImplementsKnownAlgorithm stáhne živý JS a ověří přítomnost klíčových tokenů. Defaultně se skipuje; aktivuj přes:
Pokud canary spadne, znamená to, že KB algoritmus změnili a je třeba aktualizovat SandboxAuthorizationCodeFactory.
Vývoj
composer není na hostu — všechno přes Docker:
Integrační testy
Helper bin/test-integration.sh načte sandbox apiKeys z .secrets/, exportuje je jako env proměnné a spustí integration testy uvnitř Dockeru. Stačí mít dva JWT soubory:
Plný návod (kde získat klíče, jaký mít obsah) je v .secrets/README.md. Pozor — .secrets/ je gitignored, klíče tam neházej do commitů.
V GitLab CI je k dispozici stage integration, který se aktivuje automaticky, pokud jsou v project Settings → CI/CD → Variables nastavené (Masked + Protected) proměnné KB_ADAA_API_KEY a KB_ADAA_OAUTH2_API_KEY. Forky / unprotected branches stage tiše přeskočí.
Pokud chceš testovat s předem získaným access/refresh tokenem (bez sandbox bootstrap), nastav místo KB_ADAA_OAUTH2_API_KEY proměnné KB_ADAA_ACCESS_TOKEN + KB_ADAA_REFRESH_TOKEN (volitelně + KB_ADAA_ACCESS_TOKEN_EXPIRES_AT, KB_ADAA_SCOPE, KB_ADAA_ACCOUNT_ID).
Kompatibilita
- PHP ≥ 8.2
- Symfony Serializer / PropertyAccess / PropertyInfo 6.4, 7.x, 8.x
- Bez závislosti na Symfony FrameworkBundle / DI containeru
Licence
MIT
All versions of kb-adaa with dependencies
ext-openssl Version *
ext-json Version *
symfony/serializer Version ^6.4|^7.0|^8.0
symfony/property-access Version ^6.4|^7.0|^8.0
symfony/property-info Version ^6.4|^7.0|^8.0
phpdocumentor/reflection-docblock Version ^5.4
brick/math Version ^0.12.0
brick/date-time Version ^0.7.0
brick/money Version ^0.10.0
guzzlehttp/guzzle Version ^7.9
ramsey/uuid Version ^4.7
psr/http-message Version ^1.1|^2.0