# PayPal-Zahlung über REST API abschließen

**URL:** <https://forum.shopware.com/t/paypal-zahlung-uber-rest-api-abschliessen/71443>\
**Category:** Programmierung\
**Created:** [9. Dezember 2020 um 01:41 UTC](https://forum.shopware.com/t/paypal-zahlung-uber-rest-api-abschliessen/71443 "2020-12-09T01:41:28Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![xlarry](https://avatars.discourse-cdn.com/v4/letter/x/51bf81/32.png) [@xlarry](https://forum.shopware.com/u/xlarry)\
**Post date:** [9. Dezember 2020 um 01:41 UTC](https://forum.shopware.com/t/paypal-zahlung-uber-rest-api-abschliessen/71443/1 "2020-12-09T01:41:28Z")

</div>

Hallo zusammen,

ich arbeite gerade an einer Shopware-Instanz mit Headless-Funktion, d.h. alle Aktionen gehen über die REST API.

Bei der Integration des PayPal-Plugins&nbsp;im Backend mit den [Smart Payment-Buttons](https://developer.paypal.com/docs/checkout/)&nbsp;von PayPal im Frontend komme ich leider nicht mehr weiter. Es ist mir zwar gelungen, die Bestellung im Backend anzulegen, die Zahlung über PayPal durchzuführen (mithilfe eines vorhergehenden Aufrufs von `/store-api/v3/paypal/spb/create-order` um eine ID zu erzeugen) und den Webhook des Plugins zu nutzen, sodass die Bestellung als “bezahlt” markiert wird.

Was jedoch nicht funktioniert, ist, dass die beiden Custom Fields ` **swag\_paypal\_token** `&nbsp;und ` **swag\_paypal\_transaction\_id** ` in der ` **order-transaction** ` gesetzt werden. Das führt leider dazu, dass in der Admin-Oberfläche keine Details zur PayPal-Zahlung abgerufen werden können.

![](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/2X/8/8ec41a4becde7b93af205afa2744f8fc9e256afc.png)

Wer hat einen Tipp, welche Route&nbsp;des PayPal-Plugins ich nutzen kann, um die Custom Fields nach der Zahlung zu setzen?

Bin für jeden Hinweis sehr dankbar 🙂

Lg Mike

PS: das hier scheint die Stelle zu sein, an der die Custom&nbsp;Fields gesetzt werden:&nbsp;[SwagPayPal/EcsSpbHandler.php at 9329ccffff8e0824c6b094ad8fafbe30ffc7f180 · shopwareLabs/SwagPayPal · GitHub](https://github.com/shopwareLabs/SwagPayPal/blob/9329ccffff8e0824c6b094ad8fafbe30ffc7f180/src/Checkout/Payment/Handler/EcsSpbHandler.php#L153)

Ich finde leider die dazugehörige Route nicht ☹

---

<div class="post-metadata">

**Author:** ![Michael\_Telgmann](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/michael_telgmann/32/20289_2.png) [@Michael\_Telgmann](https://forum.shopware.com/u/Michael_Telgmann)\
**Post date:** [9. Dezember 2020 um 06:59 UTC](https://forum.shopware.com/t/paypal-zahlung-uber-rest-api-abschliessen/71443/2 "2020-12-09T06:59:07Z")

</div>

Hallo Mike,

um die Bezahlung komplett abzuschließen, solltest du noch die [HandlePaymentMethodRoute](https://github.com/shopware/platform/blob/master/src/Core/Checkout/Payment/SalesChannel/HandlePaymentMethodRoute.php) aufrufen. Diese Route sorgt wiederum dafür dass&nbsp;[PayPalPaymentHandler::pay](https://github.com/shopwareLabs/SwagPayPal/blob/master/src/Checkout/Payment/PayPalPaymentHandler.php#L73) aufgerufen wird. Hierbei ist wichtig, dass du den Parameter „isPayPalSpbCheckout“ mitsendest, Dieser wird [hier](https://github.com/shopwareLabs/SwagPayPal/blob/master/src/Checkout/Payment/PayPalPaymentHandler.php#L96) gebraucht, um eine Smart Payment Button Zahlung zu erkennen. Anschließend wird der schon von dir genannte EcsSpbHandler aufgerufen. Dieser benötigt noch „paypalOrderId“ als Parameter, wo du die ID der aktuellen PayPal-Order mitsenden musst. Danach sollte das auch korrekt in der DB abgespeichert sein.

Meine Aussagen beziehen sich jetzt auf die aktuellste Version des PayPal Plugins (2.0.2).

Viele Grüße aus Schöppingen

![cool](http://forum.shopware.com/plugins/CKEditor/plugins/smiley/images/shopware.png "cool")&nbsp;Michael Telgmann

---

<div class="post-metadata">

**Author:** ![xlarry](https://avatars.discourse-cdn.com/v4/letter/x/51bf81/32.png) [@xlarry](https://forum.shopware.com/u/xlarry)\
**Post date:** [9. Dezember 2020 um 18:22 UTC](https://forum.shopware.com/t/paypal-zahlung-uber-rest-api-abschliessen/71443/3 "2020-12-09T18:22:29Z")

</div>

Hallo Michael,

besten Dank für deine ausführliche Antwort! Das&nbsp;hat mich der Lösung ein großes Stück näher gebracht 🙂

Nachdem ich ` **/handle-payment** ` mit den erforderlichen Parametern aufrufe, werden die beiden Custom Fields gesetzt und ich erhalte eine `redirectUrl` zurück. Diese Redirect URL ist jedoch nicht immer gleich. Sie führt manchmal zu **https://** \*\* [sandbox.paypal.com/checkoutnow](http://sandbox.paypal.com/checkoutnow) **und manchmal zu** http:// \*\ ***localhost/payment/finalize-transaction**

- [PayPal](https://www.sandbox.paypal.com/checkoutnow?token=)…
- [http://localhost/payment/finalize-transaction?\_sw\_payment\_token=](http://localhost/payment/finalize-transaction?_sw_payment_token=)…&token=…&isPayPalSpbCheckout=1

Ich konnte bisher nicht herausfinden, wann welche URL zurückgegeben wird.

Jenachdem, welche URL zurückgegeben wird, passiert folgendes:

- wenn ich der URL zu **[paypal.com](http://paypal.com)** &nbsp;folge, werde ich erneut aufgefordert auf “Jetzt bezahlen” zu klicken (obowhl das vorher schon passiert ist). Anschließend wird man über&nbsp; **[http://localhost/payment/finalize-transaction](http://localhost/payment/finalize-transaction)** &nbsp;(_302 FOUND_) zur&nbsp; **finishUrl** &nbsp;weitergeleitet, die beim Aufruf von&nbsp; **/handle-payment** &nbsp;mitgegeben wurde.
- wenn ich (direkt) der URL zu&nbsp; **/finalize-transaction** &nbsp;(inkl. Parameter) folge, wird ein 404 NOT FOUND geschmissen:

 ![](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/2X/3/3c4f6ee638a158cf7e86a153b40ea06e67d4aa5b.png)

Der zusätzliche Schritt über **[paypal.com/checkoutnow](http://paypal.com/checkoutnow)** erscheint mir nicht richtig, da der Kunde zuvor schon auf “_Jetzt bezahlen_” geklickt hat und man das Payment theoretisch auch im Frontend (ohne&nbsp; **[paypal.com/checkoutnow](http://paypal.com/checkoutnow)** &nbsp;aufzurufen) über `actions.order.capture()` einziehen könnte.

Wenn ich mich nicht täusche, erfolgt im Demoshop auch kein zweiter Redirect zu [paypal.com](http://paypal.com) nach dem Aufruf von **/handle-payment**. Hast du eine Idee, was bei meinem Prozess noch fehlt/falsch ist?

**//UPDATE #1:&nbsp;** okay, das Rätsel um die verschiedenen Redirect URLs scheint gelöst: der Request zu&nbsp; **/handle-payment** &nbsp;sollte ein POST sein, wobei einige der Parameter (z.B. der **isPayPalSpbCheckout** ) im Body und andere (z.B. die **orderId** ) im Query String erwartet werden. Um diese “Falle” zu vermeiden führe ich nun einen POST mit allen Parametern als Query String und gleichzeitig im Body durch. Dann wird stets die Redirect URL zu&nbsp; **/finalize-transaction** &nbsp;zurückgeliefert.

Fraglich ist noch, weshalb diese zu dem o.g. _404 Not Found_&nbsp;führt

**//UPDATE #2** : ich bin fälschlicherweise davon ausgegangen, dass der “Payment Capture”-Prozess serverseitig bei&nbsp; **/finalize-transaction** &nbsp;ausgeführt wird. Das scheint aber nicht der Fall zu sein. Wenn ich das Capture im Frontend über&nbsp;\*\*actions.order.capture()&nbsp;\*\*durchführe, ist der Request zu&nbsp; **/finalize-transaction** vermutlich **&nbsp;** nicht mehr notwendig. Die Bestellung befindet sich (durch den Webhook) im Status&nbsp;_paid_&nbsp;und die Details zur Transaktion werden (durch den Request zu **/handle-payment** ) im PayPal-Tab angezeigt. Also alles wie es sein sollte 🙂

---

<div class="post-metadata">

**Author:** ![Michael\_Telgmann](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/michael_telgmann/32/20289_2.png) [@Michael\_Telgmann](https://forum.shopware.com/u/Michael_Telgmann)\
**Post date:** [10. Dezember 2020 um 07:11 UTC](https://forum.shopware.com/t/paypal-zahlung-uber-rest-api-abschliessen/71443/4 "2020-12-10T07:11:13Z")

</div>

Hallo Mike,

genau, im Prinzip machen wir das genauso, nur über die Storefront. Nachdem die „handle-payment“ Route aufgerufen ist, kannst du einfach zur Finish Seite weiterleiten&nbsp; ![Thumb-Up](https://forum.shopware.com/plugins/CKEditor/plugins/smiley/images/thumb-up.png "Thumb-Up")

Viele Grüße aus Schöppingen

![cool](http://forum.shopware.com/plugins/CKEditor/plugins/smiley/images/shopware.png "cool")&nbsp;Michael Telgmann

PS: übrigens schön zu sehen, dass das PayPal Plugin auch in einem Headless Shop funktioniert&nbsp; ![Smile](https://forum.shopware.com/plugins/CKEditor/plugins/smiley/images/smile.png "Smile")&nbsp;

---

<div class="post-metadata">

**Author:** ![LukasRoding](https://avatars.discourse-cdn.com/v4/letter/l/5daacb/32.png) [@LukasRoding](https://forum.shopware.com/u/LukasRoding)\
**Post date:** [6. Januar 2021 um 16:38 UTC](https://forum.shopware.com/t/paypal-zahlung-uber-rest-api-abschliessen/71443/5 "2021-01-06T16:38:29Z")

</div>

Hallo Michael und Mike,

ich stehe aktuell vor dem gleichen Problem wie Mike. Also das PayPal Plugin bei einem Headless Shop zum funktionieren zu bringen 🙂 Ich fand diesen thread schon sehr hilfreich, danke an dieser Stelle schonmal. Bei mir ist es aktuell so, dass ich eine Bestellung durchgeführt bekomme, aber dann im Backend der Zahlungsstatus als “in Bearbeitung” steht. Die Reihenfolge in der ich meine Aufrufe durchführe ist die folgende —\> /paypal/spb/create-order —\> bezahlen —\> /checkout/order ----\> handle-payment. Ich befürchte das an der Reihenfolge etwas nicht stimmt. Das zweite Problem das ich habe ist, dass ich nicht weiß, was für einen Wert ich dem Parameter **isPayPalSpbCheckout** geben soll. Wär super wenn ihr (oder irgendjemand anderes) mir da irgendwie weiterhelfen könntet 🙂

Grüße

Lukas

---

<div class="post-metadata">

**Author:** ![Michael\_Telgmann](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/michael_telgmann/32/20289_2.png) [@Michael\_Telgmann](https://forum.shopware.com/u/Michael_Telgmann)\
**Post date:** [7. Januar 2021 um 07:41 UTC](https://forum.shopware.com/t/paypal-zahlung-uber-rest-api-abschliessen/71443/6 "2021-01-07T07:41:02Z")

</div>

Hallo Lukas,

den Parameter „isPayPalSpbCheckout“ einfach den Wert „true“ übergeben. Dadurch wird im PayPal Payment Handler der Workflow für die Smart Payment Buttons ausgelöst.

Viele Grüße aus Schöppingen

![cool](http://forum.shopware.com/plugins/CKEditor/plugins/smiley/images/shopware.png "cool")&nbsp;Michael Telgmann

---

<div class="post-metadata">

**Author:** ![LukasRoding](https://avatars.discourse-cdn.com/v4/letter/l/5daacb/32.png) [@LukasRoding](https://forum.shopware.com/u/LukasRoding)\
**Post date:** [7. Januar 2021 um 11:13 UTC](https://forum.shopware.com/t/paypal-zahlung-uber-rest-api-abschliessen/71443/7 "2021-01-07T11:13:54Z")

</div>

Hallo Michael,

danke für deine schnelle Antwort. Ich versteh leider immernoch nicht so ganz wie ich eine Bestellung auf bezahlt setzen kann, muss eine Bestellung vor der Bezahlung erstellt werden? Bzw. muss ich die handle-payment route vor der Bezahlung aufrufen, oder wie versteht shopware dass die Bezahlung vernünftig durchgeführt wurde? Wenn ich das richtig verstanden habe muss ich irgendwas mit der Webhook machen? ![Foot-in-Mouth](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/1X/bedbc37f276faa6d086ddea9cd70cb0550bbd56e.png "Foot-in-Mouth")

Mit freundlichen Grüßen

Lukas

---

<div class="post-metadata">

**Author:** ![Michael\_Telgmann](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/michael_telgmann/32/20289_2.png) [@Michael\_Telgmann](https://forum.shopware.com/u/Michael_Telgmann)\
**Post date:** [7. Januar 2021 um 13:50 UTC](https://forum.shopware.com/t/paypal-zahlung-uber-rest-api-abschliessen/71443/8 "2021-01-07T13:50:49Z")

</div>

Halo Lukas,

du möchtest aber schon die Smart Payment Buttons einbinden oder?&nbsp;  
Hier siehst du wie wir das gemacht haben:&nbsp;[SwagPayPal/swag-paypal.smart-payment-buttons.js at master · shopwareLabs/SwagPayPal · GitHub](https://github.com/shopwareLabs/SwagPayPal/blob/master/src/Resources/app/storefront/src/smart-payment-buttons/swag-paypal.smart-payment-buttons.js)  
Hier kommen die Daten her:&nbsp;[SwagPayPal/SPBCheckoutDataService.php at master · shopwareLabs/SwagPayPal · GitHub](https://github.com/shopwareLabs/SwagPayPal/blob/master/src/Checkout/SPBCheckout/Service/SPBCheckoutDataService.php)  
Mit&nbsp;Webhooks musst du nichts machen.

Viele Grüße aus Schöppingen

![cool](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/1X/86c57fbace799dd4eb1f1b8a2d3bdc1733f0aea1.png "cool")&nbsp;Michael Telgmann

---

<div class="post-metadata">

**Author:** ![maxmuetze](https://avatars.discourse-cdn.com/v4/letter/m/3ab097/32.png) [@maxmuetze](https://forum.shopware.com/u/maxmuetze)\
**Post date:** [7. Februar 2022 um 17:04 UTC](https://forum.shopware.com/t/paypal-zahlung-uber-rest-api-abschliessen/71443/9 "2022-02-07T17:04:42Z")

</div>

Hallo in die Runde!

Ich hänge leider auch bei dem Paypal/Headless-Prozess. Vielleicht hat jemand einen Tipp/Anschub! 😉

Ich habe SW6 als Headless-Variante umgesetzt. Im Falle einer Paypal-Zahlungsmethode starte ich den Paypal-Prozess indem ich über die Paypal-eigene API die Zahlung erstelle, im Erfolgsfall erstelle ich die Bestellung über die SW6-Api (checkout/order) und führe dann die Zahlung via Paypal-API aus. Als Rückgabe erhalte ich die Zahlungs-ID sowie das Token zur Paypal-Zahlung. Wie bekomme ich nun diese Informationen in die entsprechende Bestellung?

Ich befürchte, dass die Implementierung der Zahlung über das Paypal-Plugin erfolgen muss (nicht über eine eigene Implementierung über die Paypal-API). Hat jemand Informationen oder Ressourcen, wie das Paypal-Plugin über die Rest-API von SW6 genutzt werden soll/muss? Gibt es eine Dolumentation dazu?

1000000 Dank im Voraus!  
Max

---

<div class="post-metadata">

**Author:** ![xlarry](https://avatars.discourse-cdn.com/v4/letter/x/51bf81/32.png) [@xlarry](https://forum.shopware.com/u/xlarry)\
**Post date:** [17. Februar 2022 um 12:14 UTC](https://forum.shopware.com/t/paypal-zahlung-uber-rest-api-abschliessen/71443/10 "2022-02-17T12:14:00Z")

</div>

Hi @maxmuetze

du hast es zwischenzeitlich vielleicht schon selbst gelöst, ich lass mein Kommentar trotzdem mal hier:

ich nehme an du hast im Frontend die Smart Payment Buttons (SPB) von PayPal, richtig? Bei den Buttons sieht man häufig die client-seitige Zahlungsabwicklung:

```auto
paypal.Buttons({
    // Set up the transaction (client-side)
    createOrder: function(data, actions) {
        return actions.order.create({
            purchase_units: [{
                amount: {
                    value: '88.44'
                }
            }]
         });
     },
     // etc...
}).render('#paypal-button-container');

```

Wir wollen die PayPal-Zahlung aber über Shopware abwickeln lassen, d.h. du musst in der `createOrder()`-Methode die entsprechende Route des PayPal-Plugins (`/store-api/paypal/spb/create-order`) aufrufen:

```auto
paypal.Buttons({
    // Set up the transaction (server-side)
    createOrder: function(data, actions) {
        return fetch('/store-api/paypal/spb/create-order', {
            method: 'post',
            headers: {
                sw-access-key: accessKey,
                sw-context-token: contextToken
            }
        }).then(function(res) {
            return res.json()
        }).then(function(orderData) {
            return orderData.token
        })
     },
     // etc...
}).render('#paypal-button-container');

```

Soweit ich weiß, wird anhand des `sw-context-token` der Warenkorb des Kunden abgerufen und eine Order im Backend erstellt, die mit dieser PayPal-Zahlung dann direkt verknüpft ist (siehe [**SPBCreateOrderRoute.php**](https://github.com/shopwareLabs/SwagPayPal/blob/937d47f605ff59812bc6d13fbcddd548c5fed717/src/Checkout/SPBCheckout/SalesChannel/SPBCreateOrderRoute.php#L96)).
