Article technique
Les transactions sans contact en toute simplicité
Tout le monde sait à quel point les cartes à puce peuvent être un véritable casse-tête. Insérez votre carte, piétinez d'impatience, espérez que la puce dysfonctionne pour pouvoir passer directement au glissement… Bon, c'est peut-être un peu exagéré. Mais vous voyez ce que je veux dire. L'EMV « contact » classique frustre les clients (et a poussé plus d'un développeur d'applications de paiement à bout de nerfs) parce qu'il est lent, complexe et peu tolérant aux erreurs.
Tout cela change avec l'EMV sans contact. Une transaction « tap and go » prend généralement moins de 500 millisecondes et peut s'effectuer avec votre téléphone (bien plus pratique que de sortir une carte en plastique). Et la bonne nouvelle, c'est que c'est aussi plus simple pour les développeurs. Vous pouvez exécuter une transaction sans contact en quelques lignes de code seulement. Et vous pouvez le faire entièrement en JavaScript si vous le souhaitez ; inutile de lancer Visual Studio ou Xcode. Pas de cycle de compilation, pas de bibliothèques liées ni de dépendances complexes. Voilà ce qu'on appelle du développement rapide !
Prenons les 4 lignes de JavaScript suivantes :
Croyez-le ou non, ces 4 lignes vous permettront d'exécuter une transaction EMV sans contact à l'aide de n'importe quel lecteur de carte compact et économique de la gamme VP3300, disponible chez ID TECH (comme le VP3300 illustré ci-dessus). Une fois ces 4 lignes exécutées, il vous suffira d'approcher votre téléphone (ou une carte sans contact) du lecteur : celui-ci émettra un bip, engagera une communication NFC, puis transmettra les données de transaction (via USB).
Bien entendu, pour que ces lignes de code fonctionnent réellement, vous devez d'abord installer le script Node qui communique avec le périphérique USB (ainsi que Node JS lui-même) comme décrit dans mon dernier article. (Téléchargez le script exécutable ainsi que Node dans une seule archive ici.) Vous souhaiterez probablement exécuter les lignes de code ci-dessus depuis Firefox ou Chrome, en utilisant l'application disponible ici.
Qu'est-ce que ViVOpay Explorer ? Il s'agit simplement d'une page HTML très épurée comprenant une console JS et quelques commandes préchargées. La page web se compose de 50 lignes de HTML et de 400 lignes de JavaScript (dont la routine d'analyse TLV dont j'ai parlé dans un article précédent). Lorsque vous utilisez ViVOpay Explorer dans Chrome ou Firefox (évitez Internet Explorer), vous verrez une page de navigateur qui ressemble à ceci :
La zone grise, sous « Console », est un REPL en direct (dans ce cas, un terminal jQuery) dans lequel vous pouvez exécuter du code JavaScript arbitraire en temps réel. En haut à droite, vous trouverez des champs de texte (affichant « http://localhost » et « 9901 ») à côté d'un bouton Connect . En cliquant sur ce bouton, ViVOpay Explorer recherche une connexion Websocket sur 127.0.0.1, port 9901. La moitié inférieure de la page est une zone de journal où différents types d'informations d'état (par exemple, les relevés de trafic USB) s'affichent en temps réel, en réponse aux commandes.
Un clic sur le petit point d'interrogation situé à côté du menu déroulant fait apparaître un petit panneau d'aide expliquant comment utiliser ViVOpay Explorer. En résumé, voici ce que vous devez faire :
1. Téléchargez le pilote Node (archive Zip de 11 Mo) et décompressez-le sur votre machine Windows locale. (Il est fourni avec une copie de node.exe, ainsi que des scripts et des fichiers de support ; tout ce dont vous avez besoin se trouve dans l'archive. Notez cependant qu'il n'est pas compatible avec Mac ou Linux : il s'agit d'une version de Node spécifique à Windows.)
2. Dans le dossier Zip décompressé, recherchez start.bat et exécutez-le. (Laissez-le tourner en arrière-plan sans fermer sa fenêtre.) Cette opération démarre le pilote Node chargé de communiquer avec l'USB et lance également un serveur Websockets.
3. Branchez un lecteur de carte de crédit de la série VP3300 (UniPay III, BTPay Mini, etc.) de ID TECH sur votre port USB. Le pilote Node détectera automatiquement l'appareil et s'y connectera.
4. Cliquez sur le bouton Connecter (en haut à droite). Un message devrait s'afficher : « Connected to the driver on port 9901. » Cela signifie que votre navigateur communique désormais avec le pilote via Websockets sur http://localhost:9901.
5. Sélectionnez la commande Ping reader dans le menu déroulant. Cela exécutera un script qui envoie un ping à l'appareil USB connecté.
Si l'étape 5 réussit, une réponse journalisée devrait apparaître sur l'écran principal, sous la Console, et ressembler à ceci :
OUT :
{
"source":"client"
"data":"5669564f74656368320018010000b3cd"
"type":"raw command"
}
IN :
{
"source":"usb"
"data":"5669564f74656368320018000000fa83″
"type":"data"
}
Voici les messages JSON émis (vers le périphérique USB) et reçus (par le navigateur) via WebSockets lors du ping. Notez que les objets JSON personnalisés suivent un schéma très simple : trois champs, nommés source, data et type. Pour les messages sortants (du navigateur vers le pilote), la propriété source doit avoir la valeur "client" ; le champ data contiendra une chaîne hexadécimale représentant la commande envoyée au périphérique USB ; et le champ type contiendra "raw command", afin d'indiquer au pilote que la commande data doit être transmise directement au périphérique USB.
Envoyer un objet JSON (ou tout autre message) du navigateur vers le pilote est simple. Dans le code de votre navigateur, il suffit d'exécuter socket.emit( 'echo', myObject ). Pour recevoir des données en provenance du pilote, il suffit de définir un écouteur : socket.on( 'message', myListener ), où myListener peut être une fonction anonyme, comme function( m ) { log( m ); }. Il est évident que vous devez d'abord définir l'écouteur avant d'envoyer quoi que ce soit au pilote. Sinon, le pilote pourrait répondre avant que vous ne soyez prêt à récupérer la réponse.
Comment démarrer une transaction sans contact : Stratégie 1
Pour mettre le lecteur en mode NFC et lui faire lire une carte ou un portefeuille sans contact, il vous suffit d'émettre la commande firmware appropriée (sous forme de chaîne hexadécimale) :
La première ligne déclare la commande sous forme de chaîne de caractères. Pour savoir comment construire de telles commandes, consultez la documentation technique de votre lecteur. (Vous pouvez télécharger la documentation ID TECH depuis la page Téléchargements de la base de connaissances publique ID TECH.) Cette commande particulière contient un montant par défaut de 1,00 $ et une date désormais dépassée ; ce code, bien qu'il soit fonctionnel, doit donc être considéré comme un prototype et non comme du code prêt pour la production. S'il s'agissait de code de production, vous devriez le concevoir pour qu'il contienne un montant réel, la date de transaction effective, etc.
L'acheminement de la commande vers le lecteur est un processus en deux étapes : vous devez d'abord l'envoyer au pilote dans un objet JSON via WebSockets, puis laisser le pilote la transmettre au lecteur USB. Encapsuler la commande dans un objet JSON exploitable par le pilote est très simple : consultez les 2e et 3e lignes de code ci-dessus. La quatrième ligne émet l'objet de données sur le socket.
Rappelons que, avant d'effectuer toutes ces opérations, vous devez attacher un écouteur (ou un callback) au socket afin de pouvoir traiter la réponse du lecteur. Cela peut être aussi simple que :
Comment démarrer une transaction sans contact : Stratégie 2
Il existe une deuxième stratégie pour déclencher la transaction. Rappelons que nous avons indiqué précédemment que le déclenchement est un processus en deux étapes :
1. Envoyer un message du navigateur vers le pilote.
2. Transmettre le message du pilote vers le périphérique USB.
Le « message » est une longue et complexe chaîne hexadécimale de firmware.
Le « pilote », dans ce cas, est simplement un script Node (environ 350 lignes de JavaScript) s'exécutant dans l'espace de processus de Node. Le code source du pilote se trouve dans le dossier driver. Recherchez usb-websocket-shim.js.
Vous pouvez modifier très facilement le code du pilote pour y intégrer (déjà mis en cache dans une chaîne de caractères) la commande firmware spéciale qui déclenche la transaction (ou une fonction qui génère cette chaîne). Cette approche vous permet de masquer la commande firmware spéciale derrière une API de votre choix, de sorte que votre application de paiement (représentée ici par ViVOpay Explorer) n'ait qu'à envoyer un message très simple (de votre choix) au pilote pour lancer la transaction.
Quel est l'intérêt de cette démarche ? Pourquoi masquer la commande firmware dans le pilote lui-même ?
Je vois au moins deux bonnes raisons à cela.
Premièrement, il est logique de supprimer les dépendances matérielles de l'application de paiement et de les placer dans le pilote de périphérique, qui est fonctionnellement bien plus proche du matériel. Réfléchissez-y : voulez-vous vraiment que votre application de paiement ait une connaissance approfondie des commandes firmware ? Ne serait-il pas préférable de libérer l'application de toute connaissance intime du matériel ? L'application ne devrait-elle pas se concentrer uniquement sur la logique métier ?
Deuxièmement : intégrer la commande spéciale directement dans le pilote vous permet de définir votre propre API pour cette commande, offrant ainsi l'opportunité de proposer une API nettement simplifiée que l'application de paiement pourra exploiter. (Voir un exemple ci-dessous.)
Au-delà de cela, il convient de prendre en compte la réduction du périmètre. En pratique, la plupart des applications de paiement et des systèmes de point de vente sont conçus de telle sorte que l'application PDV ou de paiement ne fournit guère plus qu'un montant de transaction au sous-système de traitement ; ce sous-système (qui communique avec le lecteur de carte) retourne en échange un code d'autorisation et les informations nécessaires à l'impression du reçu. Les données de carte sensibles n'atteignent jamais l'application de paiement.
Ainsi, dans le cas d'une « réduction du périmètre », l'idéal serait d'intégrer dans le pilote un code capable de répondre aux messages Websockets entrants de la manière suivante :
Et cela est, en fait, déjà implémenté dans notre pilote Node. (Voir mon article précédent pour un listing du code du pilote.) Ce qui signifie que tout ce dont nous avons besoin pour lancer une transaction sans contact depuis l'application de paiement (ou ViVOpay Explorer) est de faire :
Dans ViVOpay Explorer, j'ai regroupé tout le code nécessaire (y compris le code d'un callback qui analyse les données TLV de la transaction et les affiche à l'écran) dans une fonction appelée startContactlessTransaction().
N'oubliez pas que pour plus d'informations sur la façon dont le pilote basé sur Node active la connectivité USB, vous pouvez consulter mes articles précédents (faites défiler vers le bas pour accéder aux liens). Pensez également à consulter la page de téléchargements gratuits d'ID TECH Page de téléchargements pour accéder à la documentation produit complémentaire, aux livres blancs, à la documentation SDK, etc.
Pour obtenir un kit d'évaluation comprenant l'un des lecteurs de cartes d'ID TECH, appelez-nous à tout moment au numéro indiqué ci-dessous :
