-
Notifications
You must be signed in to change notification settings - Fork 49
Support for Verification of Payee #499
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Philipp91
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice!
It seems like the HIVPP and HKVPA part is still missing. Is that because you simply made some progress so far and wanted to put it out there, or because the pieces that are in this PR so far already work end-to-end (i.e. we wouldn't need these other two segments to make banks accept transfers at least)?
|
|
||
| $hkvpp = HKVPPv1::createEmpty(); | ||
|
|
||
| # For now just pretend we support all formats |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What does it mean if we pretend that we support all formats? Does the bank somehow get to choose one of them and then we have to be able to do something with it? Or is it not the library but instead the application (caller of phpFinTS) that would need to understand this?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I haven't gotten that far, as I have no way to test this. My guess is that the bank will chose one format from that list.
|
Our banks don't have any support for VoP yet, so i started implementing this without being able to test it. Maybe someone with a VoP ready bank can use it to help development. Also I wanted to get feedback early on, as I am still in the process of understanding VoP and how phpFinTS should implement it. |
|
@Philipp91 Ich hab jetzt ein Problem mit deinem Parser phpFinTS/lib/Fhp/Segment/VPP/ParameterNamensabgleichPruefauftrag.php Lines 22 to 23 in eb781da
In der Spezifikation steht bei 'VOP-pflichtiger Zahlungsverkehrsauftrag' Anzahl 'n', wie lässt sich das abbilden? |
Das ging mir genauso. Ich habe den Code nach |
|
Es gibt ein neuen Zwischenstand, aber Ich hab jetzt folgendes Problem: Bei der Prüfung auf einen erwarteten Rückmeldungscode if ($response->findRueckmeldung(Rueckmeldungscode::FREIGABE_KANN_NICHT_ERTEILT_WERDEN) !== null) {wird der Code (3945) nicht gefunden obwohl er in der Antwort der Bank enthalten ist:
Edit: |
|
Laut FinTS_3.0_Formals_2017-10-06_final_version.pdf PDF-Seite 19 bedeutet Status=M Anzahl=n effektiv "einmal oder mehr". Es steht nicht explizit in der Spezifikation, aber es ergibt sich aus dem serialisierten Datenformat (das der Parser lesen können muss), dass es nach einem solchen "einmal oder mehr" Feld keine weiteren Felder geben darf. Weil sonst wüsste man nicht, welche Felder noch zu dem "einmal oder mehr" gehören und welches Feld dann das darauffolgende ist. Denn in der serialisierten Form sind die Felder nicht (wie bei JSON) benannt oder (wie bei Protocol Buffers) nummeriert. Sondern die Werte für die Felder tauchen einfach einer nach dem anderen auf und man muss (anhand der Spezifikation) wissen, welches welches ist. Die bisherige Implementierung des Parsers ist in der Hinsicht defensiv, d.h. solche "einmal oder mehr" Felder werden gar nicht erlaubt, weil sie bislang offenbar schlicht nicht vorkamen. Das kann aber geändert werden. Ich denke, wir sollten eine neue Annotation |
Es scheint nicht die Und es wird nicht explizit HKTAN weggefiltert, sondern es werden nur diejenigen Rückmeldungen an die Action weitergeleitet, die sich auf Segmente beziehen, die von der Action an den Server geschickt wurden. Das macht eigentlich schon Sinn, oder? Blöde Frage: Ist Wenn ich das richtig sehe, hast du im aktuellen PR mit SendSEPATransferVoP einen Fork von SendSEPATransfer erstellt, der auch VoP unterstützt. Damit ist die VoP-Implementierung spezifisch für SendSEPATransferVoP. Spiegelt das die Idee von VoP in der Spezifikation wider (also ist VoP nur für SEPA-Transfers gedacht) oder ist es eher eine übergreifende Funktion? Selbst SendSEPATransfer an sich ist ja nicht ein einzelner Geschäftsvorfall, sondern verwendet intern CME, CSE, CCM und CCS. Ich gehe davon aus, dass VoP mindestens alle davon betrifft. Die Frage ist, ob es in Zukunft auch noch Anwendungen von VoP geben könnte, die nicht unter SendSEPATransfer fallen würden. Die VoP-Spezifikation nennt die Namen CME, CSE, CCM und CCS fast gar nicht, nur an zwei Stellen jeweils einen davon als Beispiel. Also scheint die Spezifikation allgemeiner zu sein. Ein Alternatives Design wäre, VoP nicht als Subklasse zu implementieren, sondern SendSEPATransfer an sich weiter zu verwenden und stattdessen in der FinTs-Klasse an sich das ganze VoP-Handling zu integrieren. Das kann natürlich neue Helfer-Funktionen wie |
Danke für die Erläuterung. Klingt soweit gut. Ich habe jetzt vorläufig |
Ja diese Meldung ist kein "Fehler" sondern ein Hinweis, dass man die HKVPA Bestätigung senden soll.
HIVPPS sagt akuell, Das spricht eher für die Behandlung direkt von der Basisklasse. Ich würde es jetzt erstmal in die Richtung mit der Action weitermachen. Dann kann es die Grundlage für Weiteres sein. Ich will es zumindest einmal eine Überweisung mit VoP durchgeführt haben um den ganzen Prozess zu verstehen. |
|
Als temporären Workaround kannst du natürlich den |
|
Mit dem aktuellen Versionsstand funktioniert es. Für mich sind jetzt noch offene Fragen, inwieweit FinTs das Prüfergebnis parsen und betrachten soll. Insbesondere bei Sammelüberweisungen muss das eigentlich die Anwendung machen, also prüfen welche Überweisung welchen Prüfstatus hat und die Wahl dem Endnutzer lassen. Da man auf FinTs Ebene letztlich nur sagt, "(trotzdem) ausführen", kann ja die Anwendung entscheiden ob das getan werden soll oder nicht. Wer also dringende Überweisungen mit FinTs zu tätigen hat, kann diesen PR gerne testen und Feedback geben. Die Funktionalität in die FinTs Klasse zu überführen kann ich nächste Woche angehen. Alternativ kann das auch jemand anders machen 😏 |
Ah das ist ja interessant. Das heißt, mithilfe der BPD kann die zentrale FinTs-Klasse einfach anhand der Request-Segmente, die die Action produziert hat, erkennen, dass VoP nötig ist. Das muss die Action gar nicht selber wissen/deklarieren.
Ich kann es mir gerne mal anschauen. Dazu muss ich natürlich erst verstehen, wie die bisherige Implementierung hier funktioniert. Ich stelle dann mal ein paar Fragen. |
Philipp91
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ich habe den Code mal grob durchgelesen und versucht zu verstehen, wie die VoP-Sequenz funktioniert. Dabei habe ich ein paar Kommentare produziert, die nicht unbedingt alle beantwortet werden müssen (teilweise einfach kleine Details um den Code schöner zu machen, oder dieselben Fragen in verschiedenen Varianten).
Es wäre super, wenn du mir durch gezielte Beantwortung der aus deiner Sicht relevantesten Fragen helfen könntest, den Vorgang besser zu verstehen.
Und du hast ja geschrieben, dass es schon funktioniert. Das einzige was noch fehlt, wäre, dass man das Prüfergebnis irgendwie verarbeitet und Richtung Nutzer schickt, und dass der Code ein bisschen verschönert und idealerweise in die FinTs-Klasse gezogen wird. Das bedeutet aber auch, dass die exakten Daten, die über die Leitung gehen, sich nicht mehr ändern werden. Im Gegenteil: Wenn wir jetzt anhang von einer (anonymisierten) "Aufnahme" von Requests/Responses, die du von einer erfolgreichen Überweisung machst, einen Unit-Test bauen könnten, der das Ganze automatisiert wieder abspielen kann ohne echte Bank, dann könnte man viel mutiger Refactorings angehen, weil der Unit-Test ja deren Korrektheit beweisen würde.
| if (($needTanForSegment = $action->getNeedTanForSegment()) !== null) { | ||
| $message->add(HKTANFactory::createProzessvariante2Step1( | ||
| $this->requireTanMode(), $this->selectedTanMedium, $needTanForSegment)); | ||
| $hktan = HKTANFactory::createProzessvariante2Step1($this->requireTanMode(), $this->selectedTanMedium, $needTanForSegment); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Diese Code-Änderung hat keine Auswirkung, oder? Könnte man also auch rückgängig machen.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Doch, ich brauche die Variable um die Segmentnummer zu ermitteln, damit es nicht rausgefiltert wird. Da ist aber nur relevant wenn die Action selbst die VoP sachen macht.
| return; | ||
| } | ||
|
|
||
| if (($pagination = $response->findRueckmeldung(Rueckmeldungscode::PAGINATION)) !== null) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Das ist code 3040. In der VoP-Spezifikation kommt der nicht so explizit vor. Ergibt sich das daraus, dass dort von "Aufsetzpunktmechanismus" die Rede ist? Oder hast du die 3040 einfach in der freien Wildbahn beobachtet?
Der Begriff "Pagination" passt dann nicht mehr so richtig. Wenn das wirklich identisch ist mit dem Aufsetzpunkt der für Pagination verwendet wird, sollten wir es in "continuation (token)" oder so umbenennen.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ich habe lange nicht verstanden wo der Aufsetzpunkt herkommen soll, der in der Spezifikation erwähnt wird. Bis ich dann draufgekommen bin das es Aufsetzpunkte ja schon öfter gab. Und ja: ohne den Aufsetzpunkt funktioniert das Polling der Ergebnisse nicht.
| public ?HKVPPv1 $hkvpp = null; | ||
| public ?HIVPPv1 $hivpp = null; | ||
|
|
||
| protected function createRequest(BPD $bpd, ?UPD $upd) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Für mein besseres Verständnis: Diese Funktion wird ja nun vermutlich einige Male nacheinander aufgerufen. Anhand des Zustands der obigen Member-Variablen muss die Action dann entscheiden können, welche Requests jeweils gesendet werden sollen.
Könntest du mir bitte einen Überblick geben, was der Reihe nach passiert? Vielleicht in Form einer Chronologie, welche von den ifs unten nacheinander zutreffen? Oder in Form eines Logs von Requests und Responses? Oder als Beschreibung der Zustands-Änderungen (also wann geht vopNeedsConfirmation auf true, wann auf false, wann relativ dazu geht vopIsPending auf true und so weiter)? Ich weiß nicht, in welcher Form es sich am besten erklären lässt. (Im Idealfall kann man eine einfachst-mögliche Erklärung am Ende auch in einfachen Code gießen.)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Der Ablauf ist in der Spezifikation bereits als Diagram dargestellt. Grob gesagt:
- Prüfauftrag (HKVPP) + Geschäftsvorfall abschicken
- Bank antwortet mit, keine Prüfautrag nötig oder mit HIVPP (der dann entweder das Prüfergebnis + VoP-Id enthält oder eine Polling-Id und keine VoP-Id).
- Abhängig davon muss ggf. solange HKVPP (Polling-Id + Aufsetzpunkt) nochmal schicken abfragen bis man eine VoP-Id ()bekommen hat.
- Wenn man endlich eine VoP-Id hat, dann kann man den Ausführungsauftrag (HKVPA) + den ursprünglichen Geschäftsvorfall abschicken.
- Dann kommt die normale Tan-Behandlung
| $requestSegment = parent::createRequest($bpd, $upd); | ||
| $requestSegments = [$requestSegment]; | ||
|
|
||
| if ($this->vopNeedsConfirmation && $this->vopConfirmed) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hier fehlt mir ein erklärender Kommentar.
| return $this->vopIsPending; | ||
| } | ||
|
|
||
| public function needsConfirmation() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
needsConfirmation() ist, wenn der Endnutzer etwas tun muss (z.b. 2FA bestätigen auf dem Handy). Das scheint hier nicht der Fall zu sein, oder? (Sonst würde ich eine neue Methode FinTs::confirmVoP() erwarten analog zu submitTan().)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah jetzt sehe ich deinen Beispielcode. Also braucht es doch beides und statt FinTs::confirmVoP() haben wir im Moment Action::setConfirmed() (was für mich wie ein dummer Setter klang, aber was wohl eine Funktion mit mehr Tragweite ist).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
needsConfirmation ist wenn die Bank einen HKVPA verlangt. Das ist also außer in bestimmten Sonderfällen eigentlich immer der Fall.
Dann muss der Nutzer ja irgendwie mitteilen, dass er diese Bestätigung auch erteilt. Das hatte ich setConfirmed genannt. Beides muss True sein bevor man einen Ausführungsauftrag sendet. FinTs::confirmVoP() ist aber in der Tat viel klarer.
|
In deinem Beispielcode wird |
Ah, also bevor Welche Informationen stellt uns die Bank denn zur Verfügung, die man dem Nutzer hier anzeigen könnte? |
Gute Frage, da die Bank (theoretisch) den Auftrag auch gleich annehmen kann ohne HKVPA, kann an der Stelle schon die Tan Challenge kommen. Es wäre in dem Falle aber
Exakt.
Die Bank liefert einen pain.002.001.10 XML Customer Report, dort ist für jede einzelne Überweisung das Ergebnis der Prüfung drin und auch ein Gesamtwert. Dann gibt es noch
Ich kann dir entweder die Logs schicken oder es nächste Woche anvisieren den gewünschten Test zu schreiben. Ich kann auch anbieten nächste Woche einen neuen PR zu machen, der nur die neuen Segmente und Rückmeldungscodes enthält, aber keine weitere Logik. |
|
Für
Cool! Wie du möchtest.
Auch das wäre nützlich, dann könnte man mit Mergen anfangen. Aber den hier unbedingt bestehen lassen, denn die weitere Logik wird ja schon benötigt (nur in anderer Form) und hier kann man sie schon anschauen. Ich denke, so kommen wir gut vorwärts. Nur falls es irgendwo hakt, könnte ich auch von der anderen Seite anfangen (habe ich heute überlegt, bin dann aber nicht dazu gekommen): Wenn du möchtest, könnte ich in FinTs ein paar neue API-Funktionen mit Dokumentation schreiben, sowie dein Beispiel aus dem Post oben in |
|
Ich hab jetzt einen Test geschrieben, der zweimal VoP durchläuft. Einmal mit Prüfergebnis "No Match" und einmal mit "Match". @Philipp91 Kannnst/möchtest du mit diesem Test die Implementation machen? |
Ich habe gerade den aktuellen Stand getestet und stoße auf dieses Problem, ist das nach wie vor so oder kann ich irgendetwas tun? |
FinTs kann das nicht parsen, das Format ist aber relativ einfaches XML. Zwei Beispiele sind in dem SendTransferVoPTest enthalten.
Sag doch bescheid ob du morgen daran arbeitest.
Das heißt du hast vor den
Hier würde ich glaube ich explizit |
Fange gerade an.
Ja genau, weil als "Zustand" gehört es zur Action. Es gibt auch Zustand, der zu Das hält uns aber nicht davon ab, die APIs inbesondere für das Auslösen von Aktionen wie "VoP bestätigen" oder so in FinTs zu packen. |
Dann sollte man es ja eigentlich |
| $response->findRueckmeldung(Rueckmeldungscode::VOP_KEINE_NAMENSABWEICHUNG) !== null | ||
| // The bank has discarded the request, and wants us to resend it with a HKVPA | ||
| // This can happen even if the name matches. | ||
| || $response->findRueckmeldung(Rueckmeldungscode::FREIGABE_KANN_NICHT_ERTEILT_WERDEN) !== null |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Es gibt drei alternative Bedingungen in diesem if. Wenn wir hier in dieses if reingehen, wird vopNeedsConfirmation = true gesetzt. Das überrascht mich:
- Zur ersten Bedingung
VOP_KEINE_NAMENSABWEICHUNGfinde ich nicht viel in der Spezifikation, aber ich würde vermuten es bedeutet "ist auch ohne VOP okay", also wärevopNeedsConfirmation = falseangemessen. - Bei der zweiten Bedingung
FREIGABE_KANN_NICHT_ERTEILT_WERDENhabe ich das Gefühl, dass es ein Nebenschauplatz ist. Wenn die Bank VOP machen will, dann dauert das erst Mal und am Ende ist eventuell eine Bestätigung nötig. Darum verwirft sie den aktuellen TAN-Request (denn wenn eine TAN-Challenge enthalten wäre, hätte die eventuell ein Timeout z.B. aus kryptographischen Gründen, das während der VOP-Prüfung ablaufen könnte). Wenn VOP dann durch ist, sollen wir laut Spezifikation einen frischen Anlauf mit der TAN starten. Wir könnten zwar den Abbruch des TAN-Requests als Signal interpretieren, dass VOP stattfindet aber es kommt mir ziemlich implizit vor. Ich hoffe, dass die erste Antwort der Bank (SEND_TRANSFER_RESPONSEim Unit Test) noch hilfreichere Signale in die Richtung enthält.- Und selbst wenn wir erkennen, dass VOP stattfindet, sollten wir noch nicht
vopNeedsConfirmationsetzen, sondern nurvopIsPending. Denn bis jetzt arbeitet die Bank ja nur an der Prüfung und es kann durchaus sein, dass sie nach der Verarbeitung noch zu dem Schluss kommt, dass keine Bestätigung durch den Nutzer mehr nötig ist.
- Und selbst wenn wir erkennen, dass VOP stattfindet, sollten wir noch nicht
VOP_ERGEBNIS_NAMENSABGLEICH_PRUEFENDas ist genau die Nachricht, wo ichvopNeedsConfirmation = truesetzen würde. Es heißt ja schon wörtlich fast gleich.
Also ist jetzt die Frage, wie man der SEND_TRANSFER_RESPONSE ansieht, dass (1) VOP stattfindet und (2) man noch warten/pollen muss. Wir haben diese Segmente darin:
HIRMS:4:2:3+3040::Es liegen weitere Informationen vor.:staticscrollref'=>PAGINATIONaka Aufsetzpunkt.- Dieses Segment wird ein paar Zeilen weiter oben erkannt und
paginationTokendaraus befüllt (sonst nichts). - Ich habe den Eindruck, dass das das Signal ist, nach dem wir suchen. Klingt das plausibel? Die Idee ist, dass der Client immer gleich auf einen Aufsetzpunkt reagiert: Das betroffene Segment nochmal einreichen und die Antworten aneinanderhängen, so lange bis der Aufsetzpunkt verschwindet -- denn dann hat man das Ende ("die letzte Seite") erreicht.
- Dieses Segment wird ein paar Zeilen weiter oben erkannt und
HIVPP:6:1:3+++@36@c0f5c2a4-ebb7-4e72-be44-c68742177a2b+++++2'Hier ist daspollingId-Feld belegt. Wenn das so ist, müssen wir sie beim Polling zurückliefern. Aber wenn sie nicht belegt wäre, würde Polling trotzdem stattfinden, einfach nur mit dem Aufsetzpunkt allein.
Ich gehe mal davon aus, dass meine Vermutung richtig ist, und implementiere es in FinTs allein aufgrund vom Aufsetzpunkt. Hoffentlich funktioniert es dann trotzdem mit deinem Unit-Test zusammen, ohne dass dieser geändert werden muss.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
-
Habe auch wenig zu
VOP_KEINE_NAMENSABWEICHUNGgefunden, aber Bank (bzw. Atruvia) verlangt soweit ich es ausprobiert habe auch bei Namensgleichheit, dass man die Ausführungsauftrag sendet. Ich denke die haben versucht den Prozess einheitlich zu gestalten, sodass der Ablauf immer gleich ist, egal wie das Ergebnis der Prüfung ist. -
FREIGABE_KANN_NICHT_ERTEILT_WERDENwird zumindest von Atruvia auch bei Namensgleichheit geschickt, das hab ich gerade noch mal in den Logs nachgeguckt. Es ist also ein Ausführungsauftrag erforderlich.
In der Spezifikation steht explizit dass alleine die Rückmeldungscode ausschlaggebend sind, nicht die sonstigen Segmente. So hab ich das auch implementiert. Zitat:
Der Ablauf wird grundsätzlich nur durch die Rückmeldungscodes gesteuert und nicht durch das Prüfergebnis im HIVPP.
Es kann also vorkommen, dass der Rückmeldungscode 3945 "Freigabe kann nicht erteilt werden" auch bei einem VOP-Prüfergebnis RCVC (Match) gesendet wird. Dies gilt insbesondere für das Polling oder aber bei Opt-Out mit Decoupled-Verfahren. Das Kundenprodukt hat dann den Ablauf analog zum Close-/No-Match/Not Applicable-Ablauf (d.h. Neueinreichung des ZV-Auftrags und HKTAN in Verbindung mit HKVPA) fortzusetzen (s. Punkt 4. und Ablaufdiagramme_E.8.1.1.2 bzw._E.8.1.2.2 und_E.8.1.2.4..
Implementierungsbedingt kann es vorkommen, dass auch im Match-Fall einen Rückmeldungscode 3090 gesendet wird.
Implementierungsbedingt kann es vorkommen, dass ein Institut auch bei einem Match-Ergebnis immer mit einem Rückmeldungscode 3945 „Freigabe kann nicht erteilt werden" antwortet und grundsätzlich eine erneute Einreichung des ZV-Auftrags und HKTAN in Verbindung mit HKVPA erwartet.
|
Hast du mal ausprobiert / weißt du, ob man nach (Die Spezifikation erwähnt mehrere Dialoge nur im Rahmen der Mehrfachsignatur.) |
Nein hab ich noch nicht, kann ich mit deiner Implementierung dann gerne testen. |
|
@Philipp91 Da der ursprüngliche Auftrag zusammen mit dem Ausführungsauftrag HKVPA eingereicht werden muss, funktioniert |
Stimmt. Ändere ich entsprechend ab.
Das stimmt zwar, aber wir hatten schonmal irgendwo den Fall, dass man den Request nochmal schicken muss. Die Idee ist, dass die jeweiligen Action-Implementierungen die Methoden |
|
In deiner Implementierung kommt Verstehst du, wie man das handhaben sollte? Ich glaube, ich mache erst einmal eine Implementierung ohne diesen Rückmeldungscode. |
Wann
Ich könnte testen ob die Bank den Code
Ich habe den Code auch nur aus der Spezifikation übergenommen. Wegen mir lass erstmal weg bis jemand drüber stolpert. |
Alles klar. Und wenn es dazu kommt, hätten wir einen neuen Unit-Test-Case. |
This initial version only supports confirming VOP requests (not canceling them). And for now we only extract the top-level status code from the VOP response, ignoring all the per-transfer details and additional information (like actual payee name) that the bank delivers. This is based on the draft implementation of @ampaze in nemiah#499.
|
Falls euch das hilft, ich bin im fints thema nicht so tief drin wie ihr, bei hbci4java scheint es wohl einen funktionierenden Build zu geben und die scheinen auch Demo Daten in den Resourcen hinterlegt zu haben. |
This initial version only supports confirming VOP requests (not canceling them). And for now we only extract the top-level status code from the VOP response, ignoring all the per-transfer details and additional information (like actual payee name) that the bank delivers. This is based on the draft implementation of @ampaze in nemiah#499.
This initial version only supports confirming VOP requests (not canceling them). And for now we only extract the top-level status code from the VOP response, ignoring all the per-transfer details and additional information (like actual payee name) that the bank delivers. This is based on the draft implementation of @ampaze in nemiah#499.
This initial version only supports confirming VOP requests (not canceling them). And for now we only extract the top-level status code from the VOP response, ignoring all the per-transfer details and additional information (like actual payee name) that the bank delivers. This is based on the draft implementation of @ampaze in nemiah#499.
This initial version only supports confirming VOP requests (not canceling them). And for now we only extract the top-level status code from the VOP response, ignoring all the per-transfer details and additional information (like actual payee name) that the bank delivers. This is based on the draft implementation of @ampaze in nemiah#499.
This initial version only supports confirming VOP requests (not canceling them). And for now we only extract the top-level status code from the VOP response, ignoring all the per-transfer details and additional information (like actual payee name) that the bank delivers. This is based on the draft implementation of @ampaze in nemiah#499.
|
Dieser PR hat seinen Dienst getan, weiter geht es mit #513 |
This initial version only supports confirming VOP requests (not canceling them). And for now we only extract the top-level status code from the VOP response, ignoring all the per-transfer details and additional information (like actual payee name) that the bank delivers. This is based on the draft implementation of @ampaze in nemiah#499.
This initial version only supports confirming VOP requests (not canceling them). And for now we only extract the top-level status code from the VOP response, ignoring all the per-transfer details and additional information (like actual payee name) that the bank delivers. This is based on the draft implementation of @ampaze in nemiah#499.
This initial version only supports confirming VOP requests (not canceling them). And for now we only extract the top-level status code from the VOP response, ignoring all the per-transfer details and additional information (like actual payee name) that the bank delivers. This is based on the draft implementation of @ampaze in nemiah#499.
This initial version only supports confirming VOP requests (not canceling them). And for now we only extract the top-level status code from the VOP response, ignoring all the per-transfer details and additional information (like actual payee name) that the bank delivers. This is based on the draft implementation of @ampaze in nemiah#499.
This initial version only supports confirming VOP requests (not canceling them). And for now we only extract the top-level status code from the VOP response, ignoring all the per-transfer details and additional information (like actual payee name) that the bank delivers. This is based on the draft implementation of @ampaze in nemiah#499.
I hope this PR can spark a discussion on how to implement VoP.
Using this code I have successfully send SEPA Transfers with VoP, I tested Full Match, Partial Match and No match.
I would consider this code a Proof of Concept, the next step would be to integrate it in the FinTs class and not inside the action.
Usage with the current version is
refs #477