Ich erstelle einen Magento 2-Shop, der virtuelle Produkte verkauft. Diese Website hat ihre Kasse direkt auf der Produktseite. Die Kunden werden niemals mehr als ein Produkt gleichzeitig kaufen.
Diese Kaufabwicklung ajax calls
richtet sich an die REST-APIs für die Schritte beim Kauf.
Bisher kann ich einen neuen Warenkorb erstellen, ein Produkt hinzufügen, eine Rechnungsadresse festlegen, eine Zahlungsmethode festlegen, Summen sammeln und eine Bestellung aufgeben. ABER! Eine der von uns verwendeten Zahlungsmethoden ist ein externes Kreditkarten-Gateway . Ich habe hierfür ein benutzerdefiniertes Zahlungsmethodenmodul erstellt, das über die APIs eingestellt werden kann. Die Antwort, die ich vom "placeOrder()"
API-Aufruf erhalte, enthält jedoch nur die Bestellung entity_id.
Meine Intuition sagt mir, dass ein solcher API-Aufruf je nach Zahlungsmethode der Antwort etwas hinzufügen würde, um dem Frontend mitzuteilen, dass eine Umleitung stattfinden sollte.
Ich habe wahrscheinlich etwas verpasst, vielleicht einen API-Aufruf, der vorher getätigt werden sollte, um die placeorder
Zahlung zu verarbeiten, und dann im Falle einer Umleitung über placeorder
die Rückruf-URL?
Hat jemand eine Idee, wie das gemacht werden soll?
placeOrder
wird nur die Bestellnummer enthalten, nichts abhängig von der Zahlungsmethode.Antworten:
Die Tatsache, dass dieser Endpunkt das Ergebnis des Aufrufs als einzelnes int anstelle von mindestens einem Objekt mit Auftrags-ID und Erweiterungsattribut definiert, ist schrecklich und wird sich wahrscheinlich nicht ändern. Wir werden sehen, was das Magento-Team für 2.3 erwartet, wenn es seine eigene PWA einführt und hoffentlich einen neuen Endpunkt mit besserer Unterstützung für Erweiterungen von Drittanbietern erstellt. Im Moment gibt es jedoch zwei Möglichkeiten:
Angenommen, Sie stellen eine Anfrage an
/V1/guest-carts/:cartId/payment-information
oder/V1/carts/mine/payment-information
Sie können:Wenn für Ihr Zahlungsgateway eine
GET
Umleitung erforderlich ist, haken Sie einfach nachMagento\Checkout\Api\PaymentInformationManagementInterface::savePaymentInformationAndPlaceOrder()
und legen Sie die Umleitungs-URL entsprechend Ihren Anforderungen fest. Magento sollte den Weiterleitungsheader erkennen.Wenn Ihre Umleitung tatsächlich eine
POST
Anforderung sein muss, müssen Sie die Definition des Endpunkts überschreiben und eine eigene Schnittstelle bereitstellen, die ein vernünftigeres Ergebnis deklariert, das Sie im Browser verarbeiten können. Dies erfordert jedoch, dass auch native Magento-Klassen abgedeckt werden. Wenn Sie an dem Projekt für einen einzelnen Client arbeiten, funktioniert dies möglicherweise.Erstellen Sie Ihr eigenes Modul, dh.
Vendor_CheckoutExt
als separates Komponistenmodul oder inapp/code/Vendor/CheckoutExt
. Stellen Sie sicher, dass SieMagento_Checkout
demsequence
Tag hinzufügen ,module.xml
damit Ihre Definition nach Magento 1 gelesen wird.In
etc/webapi.xml
setzen Sie eine Definition wie:Erstellen Sie eine Schnittstelle
Vendor\CheckoutExt\Api\PaymentInformationManagementInterface
, die so aussiehtErstellen Sie nun eine Schnittstelle für die Antwort
Wir haben Schnittstellen bereit, damit das Rest-API-Modul es zur Vorbereitung der Ausgabe verwenden kann. Jetzt müssen wir sie irgendwie implementieren, damit die Anfrage tatsächlich funktioniert. Hier gibt es zwei Möglichkeiten: Sie können entweder einfach die ursprüngliche bevorzugen und die Ausgabe mit dem Plugin vorbereiten oder selbst implementieren. Lassen Sie uns mit der ersten Option fortfahren, in
etc/di.xml
oder besser inetc/webapi/di.xml
Präferenz definierenDies funktioniert, da unsere Schnittstelle das native Magento One erweitert und wir die Funktionsdefinition nicht geändert haben, sondern nur das, was von der Funktion zurückgegeben werden soll. Die Magento-Klasse gibt jedoch eine einfache Ganzzahl zurück, und nur weil wir andere Ausgaben definiert haben, wird Magento diese nicht generieren. Wir müssen dazu. Implementieren wir also zuerst eine Klasse, die wir in der Antwort verwenden werden
Und das letzte Puzzleteil ist das Plugin, das nach dem Aufruf der ursprünglichen Bestellmethode verknüpft wird, um die zurückgegebene Ganzzahl in das von uns benötigte Objekt umzuwandeln. Wieder in
di.xml
definierenUnd der Plugin-Code
Das Ergebnis ist nun das Objekt, das extension_attributes implementiert. In Ihrem benutzerdefinierten Zahlungs-API-Modul können Sie ein ähnliches Plugin definieren. Stellen Sie einfach sicher, dass sortOrder höher als das oben genannte ist, damit Sie bereits ein
Vendor\CheckoutExt\Api\Data\ResultInterface
Objekt als Argument erhalten.Im Zahlungsmodul Datei erstellen
etc/extension_attributes.xml
mitErstellen Sie eine Schnittstelle und deren Implementierung gemäß Ihren Anforderungen und im Plugin
Jetzt ist die Antwort richtig json mit extension_attributes, die Sie überprüfen und einbinden können. Möglicherweise müssen einige andere Elemente standardmäßig als Magento-Seite zur Erfolgsseite umgeleitet werden. Sie müssen daher sicherstellen, dass Sie sie deaktivieren, wenn Sie Ihre Weiterleitung vorbereiten. Ähnliche Überschreibungen müssen auch für Klassen vorgenommen werden, die das Auschecken von Gästen durchführen.
quelle
Ich habe hier eine ähnliche Frage beantwortet: https://magento.stackexchange.com/a/136782/29688
Zusammenfassend müssen Sie den externen Dienst manuell aufrufen.
quelle