nemiah / phpFinTS

PHP library to communicate with FinTS/HBCI servers
MIT License
130 stars 39 forks source link

Probleme mit Terminüberweisungen #445

Open seem2810 opened 1 month ago

seem2810 commented 1 month ago

Hallo zusammen,

ich habe leider ein Problem, wenn ich mehrere Überweisungen terminiert schicken möchte. Bei mehreren Überweisungen meckert er, dass er den PARSER nicht verarbeiten kann. Bei einer einzelnen darf das Ausführungsdatum nicht belegt sein.

Hat hier jemand Erfahrung damit, mehrere Überweisungen terminiert an die Bank (ohne EBICS) zu senden?

Mein Code:

 $transfer = new SEPATransfer([
            'paymentInitiation' => 'pain.001.001.03',
            'messageID' => 'dce-' . $directCreditExport->id,
            'paymentID' => 'dce-' . $directCreditExport->id,
        ]);

        $transfer->setDebitor(new SEPADebitor([
            'name' => config('setting.site.company'),
            'iban' => $this->bank->getIBAN(),
            'bic' => $this->bank->bic,
        ]));

        foreach ($directCreditExport->direct_credits()->get() as $directCredit) {
            if (!$directCredit->due_date) $directCredit->due_date = new \DateTime();

            if (!$directCredit->bank_partner) continue;
            $name = $directCredit->bank_partner->name;
            if (empty($name) && $directCredit->incoming && $directCredit->incoming->supplier) $name = $directCredit->incoming->supplier->getName();
            if (empty($name)) $name = 'Zahlungsempf.';

            $transfer->addCreditor(new SEPACreditor([
                'info' => substr($directCredit->subject, 0, 140),
                'name' => $name,
                'iban' => $directCredit->bank_partner->getIBAN(),
                'bic' => $directCredit->bank_partner->bic,
                'amount' => $directCredit->amount,
                'currency' => 'EUR',
                'reqestedExecutionDate' => $directCredit->due_date,
            ]));
            $directCredit->save();
        }

        $sendSEPATransfer = \Fhp\Action\SendSEPATransfer::create($this->account, $transfer->toXML());

        if ($sendSEPATransfer->needsTan()) {
            return $this->handleStrongAuthentication($sendSEPATransfer);
        }

        $this->fints->execute($sendSEPATransfer);
        try {
        } catch (\Throwable $exception) {
            return $this->handleException($exception->getMessage());
        }

        if ($sendSEPATransfer->needsTan()) {
            return $this->handleStrongAuthentication($sendSEPATransfer);
        }
ampaze commented 1 month ago

Soweit ich weiß sind das alles verschiedene Geschäftsvorfälle

phpFinTs unterstützt bislang lediglich SEPA Einzelüberweisung (Segment HKCCS).

seem2810 commented 1 month ago

Danke! Das würde natürlich einiges erklären.

Also muss ich irgendwie HKCME implementieren? Da versuche ich mich mal dran sonst.

ampaze commented 1 month ago

Also muss ich irgendwie HKCME implementieren?

Ja. Das sollte hauptsächlich aus Copy & Paste bestehen. DEVELOPER-GUIDE.md ist eine gute erste Lektüre dafür.

SEPATransfer könnte/sollte auch je nach XML-Inhalt das jeweils richtige Segment auswählen.

seem2810 commented 1 month ago

SEPATransfer könnte/sollte auch je nach XML-Inhalt das jeweils richtige Segment auswählen.

Muss ich ggf. nur in meiner XML-Generierung oben etwas ändern? Ich nutze ja pain.001.001.03

Mein Request, versucht mit 001.001.03 sowie 001.001.09

hp\Protocol\ServerException {#3848 ▼ // packages/ds.bank/src/Connectors/HBCI.php:600
  #message: """
    FinTS errors:

    9050 (global): Die Nachricht enthält Fehler.

    9010 (wrt seg 3): Fehler beim Aufruf Parser.

    FinTS warnings:

    3905 (global): Es wurde keine Challenge erzeugt.

    Request segments:

HKCCS:3:1+DE43403510600074856311:WELADED1STF:74856311::280:40351060+urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.09+@2927@<?xml version="1.0" encoding="UT
 ▶

<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.09" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022
 ▶

      <CstmrCdtTrfInitn>

        <GrpHdr>

          <MsgId>dce-2</MsgId>

          <CreDtTm>2024-07-16T17:20:10Z</CreDtTm>

          <NbOfTxs>2</NbOfTxs>

          <CtrlSum>6.00</CtrlSum>

          <InitgPty>

            <Nm>test GmbH - Testinstanz</Nm>

          </InitgPty>

        </GrpHdr>

        <PmtInf>

          <PmtInfId>dce-2-3</PmtInfId>

          <PmtMtd>TRF</PmtMtd>

          <NbOfTxs>1</NbOfTxs>

          <CtrlSum>5.00</CtrlSum>

          <PmtTpInf>

            <SvcLvl>

              <Cd>SEPA</Cd>

            </SvcLvl>

          </PmtTpInf>

          <ReqdExctnDt>2024-07-17</ReqdExctnDt>

          <Dbtr>

            <Nm>test GmbH - Testinstanz</Nm>

          </Dbtr>

          <DbtrAcct>

            <Id>

              <IBAN>XXXX</IBAN>

            </Id>

            <Ccy>EUR</Ccy>

          </DbtrAcct>

          <DbtrAgt>

            <FinInstnId>

              <BIC>XXXX</BIC>

            </FinInstnId>

          </DbtrAgt>

          <ChrgBr>SLEV</ChrgBr>

          <CdtTrfTxInf>

            <PmtId>

              <EndToEndId>dce-2-30</EndToEndId>

            </PmtId>

            <Amt>

              <InstdAmt Ccy="EUR">5.00</InstdAmt>

            </Amt>

            <CdtrAgt>

              <FinInstnId>

                <BIC>XXXX</BIC>

              </FinInstnId>

            </CdtrAgt>

            <Cdtr>

              <Nm>XXX XXXXX</Nm>

            </Cdtr>

            <CdtrAcct>

              <Id>

                <IBAN>XXX</IBAN>

              </Id>

            </CdtrAcct>

            <RmtInf>

              <Ustrd>Test per KSK</Ustrd>

            </RmtInf>

          </CdtTrfTxInf>

        </PmtInf>

        <PmtInf>

          <PmtInfId>dce-2-5</PmtInfId>

          <PmtMtd>TRF</PmtMtd>

          <NbOfTxs>1</NbOfTxs>

          <CtrlSum>1.00</CtrlSum>

          <PmtTpInf>

            <SvcLvl>

              <Cd>SEPA</Cd>

            </SvcLvl>

          </PmtTpInf>

          <ReqdExctnDt>2024-07-15</ReqdExctnDt>

          <Dbtr>

            <Nm>test GmbH - Testinstanz</Nm>

          </Dbtr>

          <DbtrAcct>

            <Id>

              <IBAN>XXX</IBAN>

            </Id>

            <Ccy>EUR</Ccy>

          </DbtrAcct>

          <DbtrAgt>

            <FinInstnId>

              <BIC>XXX</BIC>

            </FinInstnId>

          </DbtrAgt>

          <ChrgBr>SLEV</ChrgBr>

          <CdtTrfTxInf>

            <PmtId>

              <EndToEndId>dce-2-50</EndToEndId>

            </PmtId>

            <Amt>

              <InstdAmt Ccy="EUR">1.00</InstdAmt>

            </Amt>

            <CdtrAgt>

              <FinInstnId>

                <BIC>XXX</BIC>

              </FinInstnId>

            </CdtrAgt>

            <Cdtr>

              <Nm>XXX XXX</Nm>

            </Cdtr>

            <CdtrAcct>

              <Id>

                <IBAN>XXX</IBAN>

              </Id>

            </CdtrAcct>

            <RmtInf>

              <Ustrd>Test 2 KSK</Ustrd>

            </RmtInf>

          </CdtTrfTxInf>

        </PmtInf>

      </CstmrCdtTrfInitn>

    </Document>

    '
    """
  #code: 0
  #file: "vendor
/nemiah/php-fints/
lib/Fhp/Protocol/ServerException.php"
  #line: 170
  -errors: array:2 [▶]
  -warnings: array:1 [▶]
  -requestSegments: array:1 [▶]
  -request: 
ampaze commented 1 month ago

Muss ich ggf. nur in meiner XML-Generierung oben etwas ändern?

Nein, das XML ist ja nur der Payload für einen bestimmten Geschäftsvorfall. Aber man kann in das XML gucken ob ein Termin angegeben ist oder mehrere Überweisungen enthalten sind. Abhängig davon würde dann der richtige Geschäftsvorfall an die Bank geschickt. Alternativ bräuchte man ja sonst für jeden Geschäftsvorfall eine eigene SendSEPATransfer-Action.

seem2810 commented 1 month ago

Ok, so ganz habe ich es noch nicht verstanden und es funktioniert noch nicht... Da muss ich noch mal viel testen.

seem2810 commented 1 month ago

Habe das ganze mal gepusht. Bin weiter vorgedrungen :-) https://github.com/nemiah/phpFinTS/pull/447

Nun jemand eine Idee?

    FinTS errors:

    9050 (global): Die Nachricht enthält Fehler.

    9110 (wrt seg 3): Ungültige Auftragsnachricht: Unbekannter Aufbau. (wrt DE 3,2)

    9160 (wrt seg 3): Pflichtfeld nicht gefunden (wrt DE 3,2)

    9010 (wrt seg 4): Segment wegen anderer Fehler wirkungslos

    Request segments:

HKCME:3:1+DE43403510600074856311:WELADED1STF:74856311::280:40351060+urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.09+@2927@<?xml version="1.0" encoding="UT
 ▶

<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.09" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022
ampaze commented 1 month ago

Habe im Pull Request geantwortet.

seem2810 commented 3 weeks ago

Ok, ich muss es doch wieder öffnen... Bei der Bank kommt die Anfrage zwar richtig an, doch erhalte ich nach Freigabe:

9050 (global): Die Nachricht enthält Fehler.
9010 (wrt seg 3): Der Auftrag wurde nicht ausgeführt.
9010 (wrt seg 3): Systemfehler - bitte wenden Sie sich an Ihren Kundenberater. (MDC17700200002)
Request segments:
HKTAN:3:7+S++++6153-08-07-19.12.56.700284+N'
HKTAN:3:7+S++++6153-08-07-19.12.56.700284+N' at bank/src/Connectors/HBCI.php:315)

Update: https://github.com/nemiah/phpSepaXml/issues/6#issuecomment-2274977111 Durch die Änderung (Rückwerts) wird das Payment Date nicht gesetzt und er springt, statt in Termin. Sammepl in Sammel. Und hier war mir ein Fehler beim Segment aufgefallen: Statt "HICCMS" stand dort "HICSES"

Fix hier: https://github.com/nemiah/phpFinTS/pull/450

Dennoch erhalte ich den gleichen Fehler.

ampaze commented 2 weeks ago

Was sagt denn der Kundenberater? Ohne konkrete Fehlermeldung schwierig was zu sagen. Systemfehler klingt ja nach Fehler bei der Bank und nicht beim Client.

seem2810 commented 2 weeks ago

Was sagt denn der Kundenberater? Ohne konkrete Fehlermeldung schwierig was zu sagen. Systemfehler klingt ja nach Fehler bei der Bank und nicht beim Client.

Manchmal sieht man den Baum vor lauter Bäumen nicht... Abgelehnt, da 2 x die gleiche Überweisung in der Datei..

Dennoch gehen die Terminüberweisungen (noch) nicht, da die XML nicht geht: https://github.com/nemiah/phpSepaXml/issues/6#issuecomment-2274977111

seem2810 commented 1 week ago

Ok, ich sehe wieder mal das Problem nicht..

9210 (wrt seg 3): Summe der Beträge der Einzelzahlung und Kontrollsumme stimmen nicht überein. [694.73]

Ich dachte erst, dass es daran liegt, dass ich das $summenfeld nicht gesetzt habe. Aber damit geht es auch nicht... https://github.com/seem2810/phpFinTS/blob/master/lib/Fhp/Action/SendSEPATransfer.php#L67

Jemand noch eine Idee?

ampaze commented 6 days ago

Würde auch denken, dass es am $summenfeld liegt. Kann mir an der Stelle auch Rundungsfehler vorstellen. Die Summe sollte doch eigentlich via $xmlAsObject->CstmrCdtTrfInitn->GrpHdr->CtrlSum schon vorhanden sein.

seem2810 commented 3 days ago

Würde auch denken, dass es am $summenfeld liegt. Kann mir an der Stelle auch Rundungsfehler vorstellen. Die Summe sollte doch eigentlich via $xmlAsObject->CstmrCdtTrfInitn->GrpHdr->CtrlSum schon vorhanden sein.

Das hatte ich auch schon ausprobiert. Ohne Erfolg...

Edit: Rundungsfehler habe ich auch schon ausschließen können