Paypal: mehrfache Falschbuchungen

Hallo zusammen,

wir haben leider recht häufig Probleme mit der Paypal Zahlungsabwicklung. Folgende Fehler treten immer wieder auf und sorgen bei uns, als auch bei unseren Endkunden für Verwirrung.

  1. Paypal Zahlung wird Abgebrochen - davon habe ich häufiger hier im Forum gelesen, aber noch keine Lösung dafür gefunden. Unsere Kunden berichten uns Unterschiedliches - entweder weiße Seite oder eine direkte Fehlermeldung von Paypal.

  2. Zahlungsstatus steht im Backend auf “Fehlgeschlagen”, wurde jedoch tatsächlich bezahlt. Bei jeder fehlgeschlagenen Bestellung muss ich bei Paypal.com recherchieren ob sie tatsächlich fehlgeschlagen ist (kein Eintrag in der Transaktionsliste), oder doch bezahlt wurde (Kunde steht in der Transaktionsliste). Dann muss ich den Status in SW6 manuell auf “Bezahlt” ändern.

  3. Zahlungsstatus steht im Backen auf “In Bearbeitung” - siehe Punkt 1.

  4. Zahlungsstatus steht auf Bezahlt, aber: Der Kunde bekommt beim Checkout mehrfach angezeigt, dass die Zahlung nicht erfolgt sei - nach mehreren Versuchen klappt es dann doch noch und die Zahlung wird bei ihm als “Bezahlt” markiert. In der Realität hat der Kunde jedoch bei jedem seiner Versuche eine Transaktion ausgelöst und somit auch mehrfach bezahlt.

Das ganze wird dann für mich noch unverständlicher, wenn ich dem Kunden das zuviel bezahlte Geld zurückerstatten möchte… Aktueller Fall: Kunde hat 3x versucht zu bezahlen, beim dritten Versuch klappt es. Im Backend sieht das so aus:

 

Bei PayPal.com werden in der Transaktionsübersicht drei Zahlungen angezeigt mit Status “Abgeschlossen”.

Mein Gedanke war: OK, damit der Zahlungsstatus in SW6 erhalten bleibt, schaue ich im Backend bei der Bestellung welche Tracking-ID im PayPal-Reiter eingetragen ist, lasse sie in Paypal.com stehen und erstatte die anderen beiden Zahlungen zurück:

Doch dann wird die Bestellung im SW6-Backend als “Erstattet” angezeigt und ich kann dank der Statemachine nichts anderes mehr auswählen:

In den PayPal-Logs habe ich allein zu diesem Kundennamen 79 Einträge über zwei Tage verteilt gefunden. Alle sehr ähnlich, nur mit unterschiedlichen “payload”:{“id”:“WH-xxxx” ID und alle mit dem “status”:“APPROVED”.

Wenn ich die unterschiedlichen “swag_paypal_order_id” in den Logs suche bekomme ich zumindest einen Error-Eintrag der vielleicht weiterhilft:

[2021-01-19 xx:xx:04] swag_paypal.ERROR: Client error: `POST https://api.paypal.com/v2/checkout/orders/3XHxxxxxxxxxx/capture` resulted in a `422 Unprocessable Entity` response:
{"name":"UNPROCESSABLE_ENTITY","details":[{"issue":"DUPLICATE_INVOICE_ID","description":"Duplicate Invoice ID detected. (truncated...)
 The requested action could not be performed, semantically incorrect, or failed business validation. Duplicate Invoice ID detected. To avoid a potential duplicate transaction your account setting requires that Invoice Id be unique for each transaction. DUPLICATE_INVOICE_ID [{"name":"UNPROCESSABLE_ENTITY","details":[{"issue":"DUPLICATE_INVOICE_ID","description":"Duplicate Invoice ID detected. To avoid a potential duplicate transaction your account setting requires that Invoice Id be unique for each transaction."}],"message":"The requested action could not be performed, semantically incorrect, or failed business validation.","debug_id":"9bdxxxxxx","links":[{"href":"https://developer.paypal.com/docs/api/orders/v2/#error-DUPLICATE_INVOICE_ID","rel":"information_link","method":"GET"}]},{"headers":{"content-type":"application/json"},"json":null}] []
[2021-01-19 xx:xx:04] swag_paypal.WARNING: The error "UNPROCESSABLE_ENTITY" occurred with the following message: The requested action could not be performed, semantically incorrect, or failed business validation. Duplicate Invoice ID detected. To avoid a potential duplicate transaction your account setting requires that Invoice Id be unique for each transaction. DUPLICATE_INVOICE_ID {"orderNumber":"11xxxxx"} []

Für mich sieht es so aus, also ob beim ersten Versuch die Bestelldaten übertragen werden und es kurz darauf gleich einen neuen Anlauf gibt die Zahlung über die PayPal-API abzuwickeln - daraufhin gibt PayPal diese Meldung aus. ((Könnte es mit den eher unerfahrenen “Ich mache überall Doppelklick” Usern zusammen hängen?))

Kurz zu den System-Daten: SW v6.3.4.1; PayPal-Plugin: v.2.1.1; PayPal-Plus ist aktiviert, Express-Checkout ist deaktiviert, Ratenzahlung ist deaktiviert.
Ausser PayPal setzen wir momentan nur Klarna ein. Sonst dürfte kein Plugin den Checkout betreffen.

Hat jemand ähnliche Erfahrungen? Wie könnte eine mögliche Lösung aussehen? Ich bin für jeden Hinweis oder Tipp Dankbar!

Herzliche Grüße
ozv

Hallo @ozv‍

danke für deine ausführlichen Fehlerbeschreibungen. Zu einigen Themen hatten wir bereits Tickets vorliegen, aber es war uns bisher nicht möglich diese Fehler zuverlässig nachzustellen. Dies macht eine Behebung natürlich nahezu unmöglich. 

Auf dem ersten Blick scheint dein System jetzt auch nicht sehr ungewöhnlich zu sein. Das Zusammenspiel mit Klarna haben wir allerdings noch nicht geprüfgt, so weit ich weiß. Hast du die Möglichkeit, dieses Plugin in einer Test-Umgebung testweise zu deaktivieren? 

Die Doppelklick Theorie finde ich gut, da hat es früher auch schon wohl mal Probleme gegeben, aber kann ich so auch nicht bestätigen. Wenn Plus aktiv ist, wird der Kaufen Button sofort disabled, sobald er geklickt wird. Auch beim Express Checkout erscheint bei mir sofort ein graues Overlay, sodass ein zweites Klicken unterbunden wird. 

Wenn du möchtest, kannst du mir ja mal per PM die URL von deinem Shop schicken, dann ich mir das mal “live” anschauen.

Viele Grüße aus Schöppingen

cool Michael Telgmann

[@Michael Telgmann](http://forum.shopware.com/profile/17553/Michael Telgmann “Michael Telgmann”)‍ Die “Duplicate invoice Id detected” kann ich ebenfalls bestätigen, genauso

  • Shop triggert Stornierungs- Mail obwohl Zahlung erfolgte
  • Zahlungen werden im Shop vermerht abgebrochen
  • und was besonders schlimm ist: Es gibt Zahlungen, die laut Shop abgeschlossen sind aber kein PayPal Abschluss für existiert

Der letzte Punkt ist besonders dramatisch, weil das definitiv mal funktionierte.
Wir parken PayPal Bestellungen zunächst für die Übernahme in unsere ERP, bis die Zahlung abgeschlossen ist.
Das machen wir, indem wir auf die state_machine.order_transaction.state_changed lauschen, checken, ob es “paid” ist und diese dann für den Import in die ERP freigeben:
 

    /**
     * Subscriber to handle transaction state changes (enter > pay)
     *
     * @param StateMachineStateChangeEvent $event
     */

    public function onOrderTransactionStateChange(StateMachineStateChangeEvent $event)
    {

        if ($event->getTransitionSide() == StateMachineStateChangeEvent::STATE_MACHINE_TRANSITION_SIDE_ENTER) {

            $transition = $event->getTransition();

            if (!empty($transition)) {

                $transitionName = $transition->getTransitionName();

                if ($transitionName == StateMachineTransitionActions::ACTION_PAID) {

                    $transactionId = $transition->getEntityId();

                    try {

                        /**
                         * This function handles everything required:
                         *
                         * - checks if order has pending state
                         * - checks if order is still pending
                         * - updates transaction id in order file
                         * - updates local order files
                         */

                        $this->pendingOrderService->finalizeOrder($transactionId);

                    } catch (\Exception $ex) {

                        $this->loggerService->error(
                            sprintf(
                                'Aktualisierung der ausstehenden Bestellung (Transaction ID #%s) nicht möglich. %s',
                                $transactionId,
                                $ex->getMessage()
                            )
                        );

                    }

                }

            }

        }

    }

Ich habe das mit dem aktuellen Stand des PayPal Plugins abgeglichen, und dieser Ablauf ist noch immer drin:

1. SwagPayPal/PaymentStatusUtilV2.php at c39b84efaebe2c70142622d0f9147783f69e8be2 · shopwareLabs/SwagPayPal · GitHub paid trigger im SwagPayPal (wenn es einen Capture gab!)
2. platform/OrderTransactionStateHandler.php at 2f0f1379273f6869d20e5e5032f720aae746d80c · shopware/platform · GitHub trigger in Shopware State Machine Registry

Wir lauschen also nach wie vor auf: “Wann ist die Zahlung wirklich da” - so scheint es aber nicht zu laufen.
Klar kann man jede Bestellung manuell prüfen, das sollte aber nicht so sein.
Problematisch jetzt, dass die Prüfung des Captures nicht läuft - und das tat es vorher.

Wir brauchen unebdingt Fixes/Ideen, damit das alles wieder klappt.
PayPal ist immer noch DIE Zahlungsmethode - und bis 6.4 lief das tendentiell ordentlich - seit dem Update von 6.2 auf 6.4 inkl. PayPal Plugin Update verhält sich das so defekt.
Liegt vielleicht am Refactor im Plugin bzgl. der PayPal API, da blieb wohl etwas auf der Strecke. Die Frage ist was …

Schöne Grüße,
Niklas

Hallo Niklas,

hast du denn eine Möglichkeit gefunden den Fehler nachzustellen? Dann gerne ein Ticket erstellen

Viele Grüße aus Schöppingen

cool Michael Telgmann

Hallo Michael,

nein, ich kann mich hier nur einreihen, dass das PayPal Plugin seit den letzten Updates nicht mehr verlässlich arbeitet.
Was aktuell in jedem Prozess nachstellbar ist, dass das Event wie oben beschrieben nicht mehr so funktionieren, wie vorher.

Neue Fehler: Im Log wird das jetzt komplett vollgeballert

[2021-02-22 13:15:19] request.ERROR: Uncaught PHP Exception Symfony\Component\HttpKernel\Exception\NotFoundHttpException: "No route found for "POST /paypal/webhook/execute"" at /www/htdocs/.../shop/vendor/symfony/http-kernel/EventListener/RouterListener.php line 136 {"exception":"[object] (Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException(code: 0): No route found for \"POST /paypal/webhook/execute\" at /www/htdocs/.../shop/vendor/symfony/http-kernel/EventListener/RouterListener.php:136, Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException(code: 0): No routes found for \"/paypal/webhook/execute\". at /www/htdocs/.../shop/vendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherTrait.php:70)"} []

Alle paar Minuten - immer das gleiche.
Wie verbleiben wir? Es scheint ja jetzt kein Einzelfall mehr zu sein.

Schöne Grüße,
Niklas

Selbes Problem mit einer frischen SW6 Instanz…

Hallo @captain-web‍

wenn du es in einer frischen Instanz nachstellen kannst, wäre es sehr hilfreich zu wissen, was du genau getan hast.

Viele Grüße aus Schöppingen

cool Michael Telgmann

Wir haben auch nichts besonders. Shop, PayPal Plugin, ein paar eigene Plugins die aber nichts an PayPal ändern - das wars.
Mehr als installiert und konfiguriert ist das nicht.

Schöne Grüße,
Niklas

Ich kann das Problem nicht nachstellen. Wir haben Testweise zwei aktuelle SW6 Shops am laufen - bei einem gehts, beim anderen nicht. Entwicklungsumgebung ist vollkommen identisch.