Skip to content

Fix Consorsbank compatibility (3 issues found via hbci4j comparison) - #210

Open
ArlindNocaj wants to merge 2 commits into
raphaelm:masterfrom
ArlindNocaj:fix/consorsbank-compatibility
Open

Fix Consorsbank compatibility (3 issues found via hbci4j comparison)#210
ArlindNocaj wants to merge 2 commits into
raphaelm:masterfrom
ArlindNocaj:fix/consorsbank-compatibility

Conversation

@ArlindNocaj

Copy link
Copy Markdown

These three issues were discovered by comparing mitmdump traces of the
working hbci4j Java library against python-fints when connecting to
Consorsbank (BLZ 76030080). After applying all three fixes, transactions
are fetched successfully, matching the Java output exactly.

  1. security.py: Use security_method_version=2 for two-step TAN auth
    Per the ZKA FinTS spec (page 58), two-step TAN methods
    (security_function != '999') require version 2 in the
    SecurityProfile of the HNSHK signature header. The previous
    hardcoded value of 1 caused Consorsbank to reject the request.
    Ref: Consorsbank: Error during dialog initialization, could not fetch BPD. #99

  2. formals.py: Include full account details in KTI1.from_sepa_account
    KTI1.from_sepa_account only populated iban and bic, but Consorsbank
    requires the full account details (account_number, subaccount_number,
    bank_identifier). Other classes like KTZ1 already include these
    fields — KTI1 was the only one missing them.

  3. client.py: Add force_twostep_tan parameter for banks that require
    HKTAN despite HIPINS saying otherwise
    Some banks (Consorsbank) report HKKAZ:N in HIPINS yet reject
    requests without HKTAN (error 9075). The new opt-in
    force_twostep_tan parameter (set of segment types) allows users
    to override HIPINS for specific segments. Defaults to empty set,
    so existing behavior is unchanged.

All three fixes are backwards-compatible and all existing tests pass.

Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com

nocajarand others added 2 commits February 28, 2026 09:20
These three issues were discovered by comparing mitmdump traces of the
working hbci4j Java library against python-fints when connecting to
Consorsbank (BLZ 76030080). After applying all three fixes, transactions
are fetched successfully, matching the Java output exactly.
1. security.py: Use security_method_version=2 for two-step TAN auth
Per the ZKA FinTS spec (page 58), two-step TAN methods
(security_function != '999') require version 2 in the
SecurityProfile of the HNSHK signature header. The previous
hardcoded value of 1 caused Consorsbank to reject the request.
Ref: raphaelm#99
2. formals.py: Include full account details in KTI1.from_sepa_account
KTI1.from_sepa_account only populated iban and bic, but Consorsbank
requires the full account details (account_number, subaccount_number,
bank_identifier). Other classes like KTZ1 already include these
fields — KTI1 was the only one missing them.
3. client.py: Add force_twostep_tan parameter for banks that require
HKTAN despite HIPINS saying otherwise
Some banks (Consorsbank) report HKKAZ:N in HIPINS yet reject
requests without HKTAN (error 9075). The new opt-in
force_twostep_tan parameter (set of segment types) allows users
to override HIPINS for specific segments. Defaults to empty set,
so existing behavior is unchanged.
All three fixes are backwards-compatible and all existing tests pass.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Some banks (e.g. Consorsbank) attach the 0030/3955 response code to
the original command segment (HKCCS) rather than to the HKTAN segment.
This caused _send_pay_with_possible_retry() to miss the TAN challenge
and return a plain TransactionResponse instead of NeedTANResponse.
Added fallback: after checking tan_seg responses, also check
command_seg responses for 0030/3955 codes.
Also:
- Add photoTAN QR code handling to transfers.rst full example
- Fix typo (result.decoupled → res.decoupled) in transfers.rst
- Add Consorsbank to tested.rst (Transactions + Transfer)
- Add security function 900 (photoTAN / SecurePlus)
- Add sample_consorsbank.py showing photoTAN transfer flow
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
ArlindNocaj pushed a commit to ArlindNocaj/python-fints that referenced this pull request Mar 19, 2026
…sponse
1. Implement VoP polling (FinTS spec E.8.3.1): when the bank returns
HIVPP with a polling_id but no vop_id, re-send HKVPP with
polling_id + aufsetzpunkt (from HIRMS 3040) until the VoP check
resolves and a vop_id is returned.
2. Broaden 3945 response code detection in VoP flow: check all
HIRMG/HIRMS segments, not just tan_seg responses, since some banks
attach it to different segments.
3. Add TAN fallback in approve_vop_response: after VoP approval,
check command_seg and global HIRMG/HIRMS segments for 0030/3955
TAN-required codes (mirrors Fix 4 from PR raphaelm#210 but in the VoP
approval path).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
MaPaLo76 added a commit to MaPaLo76/python-fints that referenced this pull request Jun 3, 2026
Apply fixes for Consorsbank (BLZ 76030080) to resolve error 9010:
1. security.py: Use security_method_version=2 for two-step TAN
- Per ZKA FinTS spec, two-step TAN methods require version 2
- Fixes 'Ungültiger Signaturaufbau' (error 9010)
2. formals.py: Include full account details in KTI1.from_sepa_account
- Add account_number, subaccount_number, bank_identifier
- Consorsbank requires complete account information
3. client.py: Add force_twostep_tan parameter
- Allow override of HIPINS for banks with inconsistent requirements
- Check TAN response on command segment as fallback
Ref: raphaelm#210
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@ArlindNocaj