Hi,
I am using phpFinTS with an Atruvia/VR bank and I can reproduce a problem when submitting a SEPA transfer that requires SecureGo plus direct approval.
Environment
- phpFinTS via PHP worker
- Bank: VerbundVolksbank OWL eG
- TAN mode reported by the bank: 946
- TAN procedure name: SecureGo plus (Direktfreigabe)
- technischeIdentifikationTanVerfahren = DECOUPLED
- bezeichnungDesTanMediumsErforderlich = 0
- manuelleBestaetigungMoeglich = 1
- automatisierteStatusabfragenErlaubt = 1
Expected behavior
After the transfer is executed and the user confirms the push request in the SecureGo plus app, phpFinTS should continue polling or otherwise reach a final success state so that the transfer can be marked as completed.
Actual behavior
The flow gets stuck after VOP confirmation:
- execute() returns needsPollingWait=true
- initial polling leads to needsVopConfirmation=true
- confirmVop() is called successfully
- after that:
- isDone=false
- needsTan=true
- needsPollingWait=false
- needsVopConfirmation=false
- successMessage=NULL
- pollingInfo=NULL
At that point, phpFinTS seems unable to continue the transfer.
If I try to call submitTan() I get:
Cannot submit TAN for a decoupled TAN mode
If I try to call pollAction() after confirmVop(), I get:
This action is not awaiting polling for a long-running operation
So the transfer remains in an unresolved state even though the app approval was already granted.
Reproduction log
[2026-06-29 11:43:18] ID 1 AFTER EXECUTE isDone=false
[2026-06-29 11:43:18] ID 1 AFTER EXECUTE needsTan=false
[2026-06-29 11:43:18] ID 1 AFTER EXECUTE needsPollingWait=true
[2026-06-29 11:43:20] ID 1 INITIAL AFTER POLL 1 needsVopConfirmation=true
[2026-06-29 11:43:20] ID 1 INITIAL AFTER POLL 1 vopConfirmationRequest=...
[2026-06-29 11:43:21] ID 1 AFTER CONFIRM_VOP isDone=false
[2026-06-29 11:43:21] ID 1 AFTER CONFIRM_VOP needsTan=true
[2026-06-29 11:43:21] ID 1 AFTER CONFIRM_VOP needsPollingWait=false
[2026-06-29 11:43:21] ID 1 AFTER CONFIRM_VOP needsVopConfirmation=false
[2026-06-29 11:43:21] ID 1 AFTER CONFIRM_VOP pollingInfo=NULL
[2026-06-29 11:43:21] ID 1 UNSUPPORTED_DECOUPLED_STATE isDone=false
[2026-06-29 11:43:21] ID 1 UNSUPPORTED_DECOUPLED_STATE needsTan=true
[2026-06-29 11:43:21] ID 1 UNSUPPORTED_DECOUPLED_STATE needsPollingWait=false
[2026-06-29 11:43:21] ID 1 UNSUPPORTED_DECOUPLED_STATE needsVopConfirmation=false
The bank only reports one TAN mode for this access:
[946] => SecureGo plus (Direktfreigabe)
technicalIdentification = DECOUPLED
bezeichnungDesTanMediumsErforderlich = 0
1.) Is this a known limitation or bug in phpFinTS for Atruvia banks / decoupled SecureGo plus flows after confirmVop()?
2.) If yes, is there a supported way to continue the flow after VOP approval, or should the library stay in polling mode instead of ending up in needsTan=true?
I also verified that this is not caused by a wrong TAN mode selection. The bank only reports mode 946, and getTanMedia() is not applicable because bezeichnungDesTanMediumsErforderlich = 0.
Hi,
I am using phpFinTS with an Atruvia/VR bank and I can reproduce a problem when submitting a SEPA transfer that requires SecureGo plus direct approval.
Environment
Expected behavior
After the transfer is executed and the user confirms the push request in the SecureGo plus app, phpFinTS should continue polling or otherwise reach a final success state so that the transfer can be marked as completed.
Actual behavior
The flow gets stuck after VOP confirmation:
At that point, phpFinTS seems unable to continue the transfer.
If I try to call submitTan() I get:
Cannot submit TAN for a decoupled TAN modeIf I try to call pollAction() after confirmVop(), I get:
This action is not awaiting polling for a long-running operationSo the transfer remains in an unresolved state even though the app approval was already granted.
Reproduction log
The bank only reports one TAN mode for this access:
1.) Is this a known limitation or bug in phpFinTS for Atruvia banks / decoupled SecureGo plus flows after c
onfirmVop()?2.) If yes, is there a supported way to continue the flow after VOP approval, or should the library stay in polling mode instead of ending up in
needsTan=true?I also verified that this is not caused by a wrong TAN mode selection. The bank only reports mode 946, and getTanMedia() is not applicable because bezeichnungDesTanMediumsErforderlich = 0.