E-Commerce Core und API’s mit Laravel

E-Commerce Core und API’s mit Laravel

Die Anforderungen an E-Commerce-Lösungen sind nicht immer 0815. Startseite, Produkt-Listing, Detailseite, Warenkorb, Checkout – so funktionieren die allermeisten Online-Shops. Für diesen Anwendungsfall gibt es eine Vielzahl von Standardprodukten. Magento oder Shopware sind nur zwei davon.

Tailored Fits hat etwas andere Anforderungen. Der Verkauf ihres Produktes erfordert einen Besuch des Endkunden in einem Sportfachhandel. Nach einem berührungslosen 3-Scan des Fusses über eine iPad-App übermittelt der Händler die Scan-, Kunden- und Bestelldaten elektronisch an Tailored Fits. Erst jetzt beginnt der Entstehungsprozess des zu 100% individuell auf den Kunden hergestellte Produkt. Kunde wie Händler können den Fortschritt der Bestellungen in unterschiedlichen Portalen verfolgen. Der Kunde bezahlt die Bestellung direkt beim Händler, der Händler erledigt dies über das Händlerportal.
Über ein als Single-Page App in die Website integriertes Kundenkonto können die Endkunden ihre Bestellungen einsehen. Im Kundenkonto wird der Kunde zukünftig auch die Möglichkeit haben, individualisierte Produkte nachzubestellen, da die dazu notwendigen Scan-Daten bereits in der Lösung hinterlegt sind.

Komponenten anstatt Monolith

Nach Analyse der Anforderungen, zukünftigen Plänen und weiteren Dienstleistungen haben wir uns zusammen mit dem Kunden für eine komponenten-basierte Individual-Entwicklung entschieden. So können unterschiedliche Teilapplikationen der Gesamtlösung voneinander unabhängig weiterentwickelt werden. Wir sprechen hier nicht über eine Microservice-Architektur sondern über einzelne Applikationen welche nahtlos und komplett miteinander integriert wurden.

Wir verhindern damit die Erschaffung eines Monolithen, der nur aufwändig gewartet und immer in der Gesamtheit aktualisiert werden muss. Hätten wir eine der bekannten und eingangs erwähnten Shop-Lösungen eingesetzt, hätten wir relativ viel Aufwand in die Anpassung von Standard-Prozessen und Funktionalitäten auf die Spezifika von Tailored Fits stecken müssen. Mit jeder neuen Version der Software hätten wir dadurch das Risiko gehabt, dass gewisse Dinge nicht mehr oder anders funktionierten. Insgesamt wäre der Aufwand höher ausgefallen.

Die von uns entwickelte Gesamtlösung besteht aus drei Haupt-Komponenten:

  1. Die Business-Applikation (Core)
  2. Single-Page MyAccount
  3. Die Website

Solution-Overview-TF.png

 

In der Business-Applikation (Core) sind sämtliche Prozesse sowie die komplette Datenhaltung abgebildet. Bestellungen von Händlern werden hier erfasst, verwaltet und orchestriert. Über verschiedene Schnittstellen werden die weiteren Systeme angebunden:

  • REST-API zur automatischen Weiterleitung der Bestellungen an die Produktionsmaschine (die 3D-Drucker), inkl. Rückmeldungen zum Fortschritt des Produktionsprozesses
  • REST-API zur Interaktion mit dem MyAccount
  • Anbindung eines Payment Service Providers damit Bestellungen von Händlern elektronisch bezahlt werden können
  • Anbindung eines Transaction Mail Services (Mandrill) zum Versand von Transaktionsmails
  • XML-Schnittstelle zum Import der Scan-Daten aus der iPad-App, welche bei den Händlern im Einsatz ist

Der MyAccount wurde als Single Page-Applikation umgesetzt und kommuniziert über eine REST-API mit der Business-Applikation. Im MyAccount selbst erfolgt keine Datenhaltung. Damit steht einem Einsatz in weiteren Kanälen wie Self Service-Portalen oder POS-Lösungen nichts im Weg.

Die Website dient als Kommunikationskanal gegenüber interessierten Kunden und Besuchern. Auf einer Übersichtskarte kann der Besucher den nächstgelegenen Händler auffinden. Die Händlerdaten sind mit der Business-Applikation synchronisiert. Der MyAccount ist nahtlos in die Website integriert.

Laravel als Framework

Die Business-Applikation mit dem integrierten Händler- sowie Admin-Portal baut auf Laravel auf. Das PHP-basierte Open Source Framework erlaubt eine effiziente Entwicklung von individuellen Applikationen und bietet ein grosses Ökosystem an Komponenten zur Erweiterung, eine umfassende Dokumentation und eine grosse Community ( > 45k Stars auf Github). Der Fokus des Frameworks liegt auf einer schnellen, einfachen, aber doch stabilen Entwicklung von Web-Applikationen mit APIs und Anbindungen verschiedener Services.

Best Practices – oder das Rad nicht neu erfinden

Während etablierte Shopsysteme viele Funktionalitäten bereits integriert haben, müssen diese im Fall einer Eigenentwicklung entweder selbst entwickelt oder über bestehende Libraries integriert werden. Auf der anderen Seite erhält man so die Flexibilität, welche für solche individuellen Lösungen benötigt werden. Einige Beispiele:

  • Die Business-Applikation verwaltet drei vollständig getrennte User Directories. Kunden, Händler und Mitarbeiter sind komplett voneinander getrennt. Die Authentifizierung erfolgt dabei auf unterschiedlichen Wegen: Die Kunden melden sich im MyAccount über die REST-API an, die Händler loggen sich im dedizierten Händlerportal ein und für die Mitarbeiter steht ein separates Admin-Portal zur Verwaltung von Händlern, Kunden, Bestellungen, Produkten und Rechnungen zur Verfügung.
  • Bestellungen, welche einem Kunden im MyAccount angezeigt werden, können sowohl von ihm selbst, von einem Händler oder sogar von Tailored-Fits selbst getätigt worden sein. Je nach dem wurde die Bezahlung auf ganz unterschiedliche Arten oder von komplett unterschiedlichen Personen getätigt.
  • Händler bezahlen nicht jede platzierte Bestellung einzeln sondern können beliebige, von ihren Mitarbeitern getätigte Bestellungen zusammenfassen und über unterschiedliche Zahlungsmittel (Rechnungen, Kreditkarten, PayPal) bezahlen. Da der Endkunde seine Bestellung beim Händler jedoch bereits bezahlt hat, wird im MyAccount ein anderer Bezahlstatus angezeigt. Auch hat der Endkunde die Bestellung zu einem anderen Preis getätigt als der Händler dies bei Tailored-Fits tut.

Die Entwicklung einer solchen Lösung mit verschiedenen Komponenten erfordert die Einhaltung gewisser Grundlagen, um den langfristigen Erfolg und Betrieb sowie eine schmerzfreie Weiterentwicklung zu gewährleisten. Der Entscheid zu einer Eigenentwicklung braucht bei den heute zur Verfügung stehenden Frameworks und Libraries keinen Mut mehr sondern ist eher eine Frage, auf welcher Technologie und mit welchem Vorgehen ein gewünschtes Resultat am schnellsten und nachhaltigsten erreicht werden kann. Zwingend erforderlich ist jedoch eine Agentur, welche dies nicht zum ersten Mal macht und auf einen grossen Erfahrungsschatz und Expertise in der Umsetzung verfügt.

Wir haben dabei unter anderem folgende Dinge sichergestellt:

  • Wir nutzen umfangreiche Sets von Testdaten, welche vollautomatisiert dynamisch immer wieder neu erstellt werden können. Diese nutzen wir zum Testing der Lösung und können auch Konstellationen mit fehlerhaften oder fehlenden Daten einfach prüfen. Wir haben dazu spezifische Factories und Seeders implementiert.
  • Sämtlicher Input wird komplett und umfangreich validiert. Dazu setzen wir auf die zahlreichen Möglichkeiten von Form Request Validations, welche Laravel bietet.
    Damit wir z.B. sicherstellen können, dass ein Händler keine Bestellungen eines anderen Händlers einsehen kann, greifen wir auf die Möglichkeiten der Policies zurück, mittels derer jede Aktion authorisiert oder eben verweigert werden kann.
  • Damit Händler nur als Händler interagieren können, aber trotzdem auch als Kunde betrachtet werden können, haben wir zusätzliche Laravel-Middlewares umgesetzt, die den aktuellen User an das entsprechende Portal binden.
    Die von den Händlern hochgeladenen Scan-Daten speichern wir ausserhalb der Applikation. Über eigene API-Endpunkte, dedizierte Policies und Middlewares wird sichergestellt, dass die Daten nicht durch unberechtigte Zugriffe heruntergeladen werden können.

Ein umfangreiches Logging erlaubt das Nachvollziehen von Problemen. Jede Aktion auf einem Datensatz kann rückwirkend nachvollzogen werden.

Automatisierung von Deployments

Da die einzelnen Komponenten jederzeit unabhängig und durch verschiedenste Personen deployed werden können, haben wir den Prozess automatisiert.

Ein Continuos Integration Server prüft nach jedem Commit in das Source Code Repository, ob das Projekt noch erfolgreich gebuildet werden kann. Dabei nutzen wir das identische Setup, welches von den verschiedenen Entwicklern lokal benutzt wird: eine vollständige Docker-Umgebung mit allen notwendigen Komponenten sowie über spezielle Seeder erstellte Testdaten.

Ein Release-Build unterscheidet sich dabei nicht wesentlich von einem Continuous Build – Der einzige Unterschied ist, dass nach dem erfolgreichen Build ein Artefact Package erstellt und versioniert im Artefact Storage abgelegt wird. Von dort kann dieses automatisch auf die Zielumgebung (Test- oder Produktiv-System) deployed werden. Wir stellen damit sicher, dass die genau identische Version vom Test- auch auf dem produktiven System zur Verfügung steht.

Der Deployment-Prozess ist dabei so aufgesetzt, dass im unwahrscheinlichen Fall eines Fehlers ein Rollback auf die vorherige Version mit einem einzigen Befehl gemacht werden kann. Ausser in den Disaster Recovery-Tests mussten wir von dieser Möglichkeit zum Glück noch keinen Gebrauch machen.