Technischer Beitrag
Kontaktlose Transaktionen – ganz einfach
Jeder weiß, wie lästig Chipkarten sein können. Karte einstecken, ungeduldig mit dem Fuß wippen, insgeheim hoffen, dass der Chip versagt, damit man endlich durchswischen darf … Okay, das ist vielleicht etwas übertrieben. Aber Sie wissen, was gemeint ist. Herkömmliche Kontakt-EMV-Transaktionen frustrieren Kunden (und haben so manchen Payment-App-Entwickler an den Rand der Verzweiflung gebracht), weil sie langsam, komplex und fehleranfällig sind.
Mit kontaktlosem EMV ändert sich das grundlegend. Eine „Tap-and-Go"-Transaktion dauert in der Regel weniger als 500 Millisekunden und lässt sich bequem mit dem Smartphone durchführen – praktischer als das Heraussuchen einer Plastikkarte. Und das Beste daran: Auch für Entwickler ist es einfacher. Eine kontaktlose Transaktion lässt sich mit nur wenigen Codezeilen umsetzen – bei Bedarf sogar vollständig in JavaScript, ganz ohne Visual Studio oder Xcode. Kein Kompilierungszyklus, keine einzubindenden Bibliotheken oder unübersichtlichen Abhängigkeiten. Schnellere Entwicklung war selten so einfach!
Betrachten Sie die folgenden 4 JavaScript-Zeilen:
Kaum zu glauben, aber diese 4 Zeilen ermöglichen es Ihnen, eine kontaktlose EMV-Transaktion mit einem der kompakten und kostengünstigen VP3300-Kartenlesegeräte von ID TECH durchzuführen (wie dem oben abgebildeten VP3300). Sobald diese 4 Zeilen ausgeführt werden, halten Sie einfach Ihr Smartphone (oder eine kontaktlose Karte) an das Gerät – der Leser gibt einen Signalton aus, startet einen NFC-Dialog und überträgt die Transaktionsdaten anschließend (per USB).
Damit diese Codezeilen tatsächlich funktionieren, müssen Sie zunächst das Node-Skript installieren, das mit dem USB-Gerät kommuniziert (sowie Node JS selbst) – wie in meinem letzten Beitrag beschrieben. (Das ausführbare Skript zusammen mit Node können Sie als ein einzelnes Archiv herunterladen hier.) Die obigen Codezeilen führen Sie am besten in Firefox oder Chrome aus, mithilfe der App, die hier verfügbar ist.
Was ist ViVOpay Explorer? Es handelt sich schlicht um eine einfache HTML-Seite mit einer JS-Konsole und einigen vorgeladenen Befehlen. Die Webseite besteht aus 50 Zeilen HTML und 400 Zeilen JavaScript – einschließlich der TLV-Parser-Routine, auf die ich in einem früheren Beitrag). Wenn Sie ViVOpay Explorer in Chrome oder Firefox verwenden (nicht in Internet Explorer), sehen Sie eine Browserseite, die in etwa so aussieht:
Der graue Bereich unter „Console" ist ein Live- REPL (in diesem Fall ein jQuery Terminal), in dem Sie beliebigen JavaScript-Code in Echtzeit ausführen können. Oben rechts finden Sie Textfelder (mit den Einträgen „http://localhost" und „9901") neben einem Connect -Button. Durch Klicken auf diesen Button versucht ViVOpay Explorer, eine WebSocket-Verbindung auf 127.0.0.1, Port 9901, herzustellen. Die untere Hälfte der Seite ist ein Protokollbereich, in dem verschiedene Statusinformationen (z. B. USB-Datenverkehrsanzeigen) in Echtzeit als Reaktion auf Befehle erscheinen.
Ein Klick auf das kleine Fragezeichen neben dem Dropdown-Menü öffnet ein kleines Hilfefenster, das erklärt, wie Sie ViVOpay Explorer nutzen können. Kurz zusammengefasst, müssen Sie Folgendes tun:
1. Laden Sie den Node-Treiber (11 MB großes ZIP-Archiv) herunter und entpacken Sie ihn auf Ihrem lokalen Windows-Rechner. (Das Archiv enthält eine Kopie von node.exe sowie Skripte und unterstützende Dateien – alles Notwendige ist im Archiv enthalten. Versuchen Sie jedoch nicht, es unter Mac oder Linux auszuführen. Es handelt sich um einen Windows-spezifischen Build von Node.)
2. Suchen Sie im entpackten ZIP-Ordner nach start.bat und führen Sie sie aus. (Lassen Sie sie geöffnet. Schließen Sie das Fenster nicht.) Damit wird der Node-basierte Treiber gestartet, der mit USB kommuniziert, und gleichzeitig ein Websockets-Server hochgefahren.
3. Schließen Sie ein Kreditkartenlesegerät der VP3300-Serie (UniPay III, BTPay Mini usw.) von ID TECH an Ihren USB-Anschluss an. Der Node-Treiber erkennt das Gerät automatisch und stellt eine Verbindung her.
4. Klicken Sie auf die Schaltfläche „Verbinden" (oben rechts). Darunter sollte folgende Meldung erscheinen: „Verbunden mit dem Treiber auf Port 9901." Das bedeutet, dass Ihr Browser nun über Websockets auf http://localhost:9901.
5. Wählen Sie den Befehl Ping reader aus dem Dropdown-Menü aus. Dadurch wird ein Skript ausgeführt, das das angeschlossene USB-Gerät anpingt.
Wenn Schritt 5 erfolgreich war, sollten Sie im Hauptbildschirm unter der Konsole eine protokollierte Antwort sehen, die in etwa so aussieht:
OUT:
{
"source":"client"
"data":"5669564f74656368320018010000b3cd"
"type":"raw command"
}
IN:
{
"source":"usb"
"data":"5669564f74656368320018000000fa83″
"type":"data"
}
Dies sind die JSON-Nachrichten, die während des Pings über WebSockets gesendet (an das USB-Gerät) und empfangen (vom Browser) wurden. Die maßgeschneiderten JSON-Objekte folgen einem sehr einfachen Schema: Es gibt drei Felder mit den Bezeichnungen source, data und type. Bei ausgehenden Nachrichten (vom Browser zum Treiber) sollte die Eigenschaft source den Wert „client" haben; das Feld data enthält einen Hex-String, der den an das USB-Gerät gesendeten Befehl repräsentiert; und das Feld type enthält „raw command", um den Treiber darauf hinzuweisen, dass der Datenbefehl direkt an das USB-Gerät weitergeleitet werden soll.
Ein JSON-Objekt (oder eine beliebige andere Nachricht) vom Browser an den Treiber zu senden ist einfach. Verwenden Sie dazu in Ihrem Browser-Code einfach socket.emit( 'echo', myObject ). Um Daten vom Treiber zu empfangen, legen Sie einfach einen Listener fest: socket.on( 'message', myListener ), wobei myListener kann eine anonyme Funktion sein, wie z. B. function( m ) { log( m ); }. Sie sollten den Listener natürlich zuerst einrichten, bevor Sie etwas an den Treiber senden. Andernfalls könnte der Treiber antworten, bevor Sie bereit sind, die Antwort entgegenzunehmen.
So starten Sie eine kontaktlose Transaktion: Strategie 1
Um das Lesegerät in den NFC-Modus zu versetzen und eine kontaktlose Karte oder ein digitales Wallet auszulesen, können Sie einfach den entsprechenden Firmware-Befehl (als Hex-String) senden:
Die erste Zeile deklariert den Befehl als String. Informationen zur Konstruktion solcher Befehle finden Sie in der technischen Dokumentation Ihres Lesegeräts. (Die ID TECH Dokumentation können Sie auf der Download-Seite der ID TECH Public Knowledge Baseherunterladen.) Dieser Befehl enthält einen Standard-Betrag von 1,00 $ sowie ein inzwischen veraltetes Datum – der Code ist daher zwar funktionsfähig, sollte aber als Proof-of-Concept und nicht als produktionsreifer Code betrachtet werden. In einem produktionsreifen Code würden Sie einen tatsächlichen Betrag, das aktuelle Transaktionsdatum usw. eintragen.
Die Übermittlung des Befehls an das Lesegerät erfolgt in zwei Schritten: Zunächst senden Sie ihn über Websockets in einem JSON-Objekt an den Treiber, der ihn dann an das USB-Lesegerät weiterleitet. Das Verpacken des Befehls in ein vom Treiber lesbares JSON-Objekt ist denkbar einfach: Siehe die zweite und dritte Codezeile oben. Die vierte Zeile sendet das Datenobjekt über den Socket.
Beachten Sie auch hier: Bevor Sie diese Schritte ausführen, sollten Sie dem Socket einen Listener (oder Callback) hinzufügen, um die Antwort des Lesegeräts verarbeiten zu können. Das kann so einfach sein wie:
So starten Sie eine kontaktlose Transaktion: Strategie 2
Es gibt eine zweite Strategie, um die Transaktion anzustoßen. Zur Erinnerung: Wir haben zuvor erwähnt, dass der Start ein zweistufiger Prozess ist:
1. Eine Nachricht vom Browser an den Treiber senden.
2. Die Nachricht vom Treiber an das USB-Gerät übermitteln.
Die „Nachricht" ist ein langer, unhandlicher Firmware-Hex-String.
Der „Treiber" ist in diesem Fall lediglich ein Node-Skript (ca. 350 Zeilen JavaScript), das im Prozessbereich von Node ausgeführt wird. Den Quellcode des Treibers finden Sie im Ordner „driver". Suchen Sie nach usb-websocket-shim.js.
Sie können den Treibercode problemlos so anpassen, dass er den speziellen Firmware-Befehl, der eine Transaktion auslöst, bereits als String enthält (oder als Funktion, die diesen String erzeugt). Dadurch lässt sich der Firmware-Befehl hinter einer selbst gewählten API verbergen, sodass Ihre Zahlungsanwendung (hier durch den ViVOpay Explorer repräsentiert) lediglich eine einfache Nachricht Ihrer Wahl an den Treiber senden muss, um die Transaktion zu starten.
Wozu dient das? Welchen Zweck hat es, den Firmware-Befehl im Treiber selbst zu verbergen?
Dafür gibt es meiner Ansicht nach ein paar überzeugende Gründe.
Erstens ist es sinnvoll, gerätespezifische Abhängigkeiten aus der Zahlungsanwendung herauszulösen und in den Gerätetreiber zu verlagern, der logisch deutlich näher am Gerät liegt. Überlegen Sie: Sollte Ihre Zahlungsanwendung wirklich genaue Kenntnis von Firmware-Befehlen haben? Wäre es nicht besser, die Anwendung von hardwarespezifischem Wissen zu befreien? Sollte sich die Anwendung nicht ausschließlich auf die Geschäftslogik konzentrieren?
Zweitens ermöglicht die Verlagerung des speziellen Befehls in den Treiber die Definition einer eigenen API für diesen Befehl. So entsteht die Möglichkeit, eine deutlich vereinfachte API bereitzustellen, die von der Zahlungsanwendung genutzt werden kann. (Ein Beispiel hierzu finden Sie weiter unten.)
Darüber hinaus ist die Reduzierung des Geltungsbereichs (Scope Reduction) zu berücksichtigen. In der Praxis sind die meisten Zahlungsanwendungen und Point-of-Sale-Systeme so konzipiert, dass die POS- oder Zahlungsanwendung dem Transaktionssystem kaum mehr als einen Transaktionsbetrag übermittelt, während das Transaktionssystem (das mit dem Kartenlesegerät kommuniziert) einen Autorisierungscode sowie druckfähige Beleginformationen zurückliefert. Sensible Kartendaten gelangen dabei niemals in die Zahlungsanwendung.
Im Szenario der „Scope Reduction" wäre es daher wünschenswert, im Treiber Code zu implementieren, der auf eingehende WebSockets-Nachrichten wie folgt reagiert:
Dies ist tatsächlich bereits in unserem Node-Treiber implementiert. (Siehe meinen vorherigen Beitrag für eine Auflistung des Treibercodes.) Das bedeutet, dass wir lediglich Folgendes ausführen müssen, um eine kontaktlose Transaktion aus der Zahlungsanwendung (oder dem ViVOpay Explorer) heraus zu starten:
Im ViVOpay Explorer habe ich den gesamten erforderlichen Code (einschließlich des Codes für einen Callback, der die TLV-Daten der Transaktion analysiert und auf dem Bildschirm anzeigt) in einer Funktion namens startContactlessTransaction().
zusammengefasst. Weitere Informationen dazu, wie der Node-basierte Treiber die USB-Konnektivität ermöglicht, finden Sie in meinen früheren Beiträgen (Links siehe unten). Besuchen Sie außerdem die kostenlose Downloads-Seite von ID TECH für weitere Produktdokumentationen, Whitepaper, SDK-Dokumentation und vieles mehr.
Um ein Evaluierungskit mit einem der Kartenlesegeräte von ID TECH zu erhalten, erreichen Sie uns jederzeit unter der unten angegebenen Nummer:
