Neu PayPal Checkout / EPS – Zahlung erfolgreich, Bestellung bleibt trotzdem unbezahlt

Hematek-Solutions

Gut bekanntes Mitglied
26. März 2012
190
23
Paderborn
Firma
Hematek GmbH
Hallo zusammen,

ich habe einen Fall, der dem bereits bekannten Fehlerbild aus diesem Thread sehr ähnlich ist:

Webhook::handleCall - capture failed for method PayPal Checkout

Den Ablauf konnten wir inzwischen ziemlich genau nachvollziehen.

Umgebung​

KomponenteWert
JTL-Shop5.8.1
PayPal Checkout Plugin2.3.1
ZahlungsartPayPal Checkout
Funding Sourceeps
Bestellsumme66,90 €

Zahlung und Webhook​

Die Zahlung wurde bei PayPal erfolgreich abgeschlossen:

Code:
Capture-ID:       8NY36945FA930384W
PayPal Order-ID:  7V873957XX307563P
Status:           COMPLETED
Betrag:           66,90 €

Auch der Webhook kommt im Shop korrekt an:

Code:
Event:       PAYMENT.CAPTURE.COMPLETED
custom_id:   6ac13c44483292.70394816
order_id:    7V873957XX307563P

Trotzdem wurde im Shop kein Zahlungseingang angelegt, und die Bestellung blieb intern unbezahlt.

Auffälliger Ablauf​

Im Zahlungslog tauchen innerhalb desselben Zahlungsprozesses mehrere PayPal-Orders auf:

Code:
3KJ314719B213241C  →  recreatePPOrder()
7V873957XX307563P  →  recreatePPOrder()   ← tatsächlich bezahlte Order
4Y81660578823735K

Nach unserem Verständnis wurde nach der bezahlten Order 7V873957XX307563P bereits eine weitere PayPal-Order erzeugt und die in tzahlungsid hinterlegte txn_id entsprechend überschrieben.

Der Capture-Webhook sucht in WebhookHandler.php anschließend explizit nach der PayPal-Order-ID:

SQL:
LEFT JOIN tzahlungsid
    ON tbestellung.kBestellung = tzahlungsid.kBestellung
   AND tzahlungsid.txn_id = :txnId

Der Webhook kommt für 7V873957XX307563P, in tzahlungsid war zu diesem Zeitpunkt aber offenbar bereits eine andere PayPal-Order-ID hinterlegt. Der Join liefert dadurch keine passende txn_id mehr, und im Log folgt:

Code:
handleCaptureWebhook: shop order does not exists

Das passiert, obwohl die Shopbestellung selbst vorhanden ist.

Möglicher Zusammenhang mit PAYER_ACTION_REQUIRED​

In CheckoutPage::finishOrder() wird bei Status OrderStatus::STATUS_PAYER_ACTION_REQUIRED erneut $payment->recreatePPOrder(...) aufgerufen. EPS gehört im Plugin zu den automatisch gecaptureten APM-Zahlungsarten.

Unser aktueller Verdacht:
  1. EPS-Zahlung läuft
  2. PAYER_ACTION_REQUIRED → PayPal-Order wird neu erzeugt
  3. Kunde befindet sich noch im vorherigen Zahlungsflow
  4. Erneut PAYER_ACTION_REQUIRED → noch eine PayPal-Order wird erzeugt
  5. txn_id in tzahlungsid wird überschrieben
  6. Die vorherige PayPal-Order wird erfolgreich bezahlt
  7. Der Capture-Webhook kann nicht mehr zugeordnet werden

Das Fehlerbild ähnelt damit dem bekannten „capture failed“-Problem. Die Ursache scheint bei uns aber nicht ein zu früher Webhook zu sein, sondern eine mehrfach neu erzeugte PayPal-Order während eines EPS-/PAYER_ACTION_REQUIRED-Flows.

Fragen​

  • Ist dieser konkrete Ablauf bereits bekannt?
  • Gibt es dafür schon ein Issue, einen Fix oder einen empfohlenen Workaround?

Viele Grüße
Ayhan