Article technique
Les transactions sans contact en toute simplicité
Tout le monde sait à quel point les cartes à puce peuvent être une vraie source d'irritation. On insère sa carte, on trépigne d'impatience, on espère presque que la puce plante 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 exaspère 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 bonne nouvelle : c'est aussi plus simple pour les développeurs. Une transaction sans contact peut être réalisée en quelques lignes de code seulement. Et tout cela en JavaScript si vous le souhaitez — inutile d'ouvrir Visual Studio ou Xcode. Pas de cycle de compilation, pas de bibliothèques liées ni de dépendances fastidieuses. Voilà ce qu'on appelle du développement rapide !
Prenons l'exemple des 4 lignes de JavaScript suivantes :
Aussi surprenant que cela puisse paraître, ces 4 lignes suffisent pour exécuter une transaction EMV sans contact à l'aide de l'un des lecteurs de cartes compacts et économiques de la gamme VP3300, disponibles chez ID TECH (comme le VP3300 illustré ci-dessus). Une fois ces 4 lignes exécutées, il vous suffit d'approcher votre téléphone (ou une carte sans contact) du lecteur : celui-ci émet un bip, engage une communication NFC, puis transmet les données de la transaction (via USB).
Bien entendu, pour que ces lignes de code produisent un résultat concret, 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 précédent 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 sobre comprenant une console JS et quelques commandes préchargées. Cette 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 (en l'occurrence, 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 partie 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 la marche à suivre :
1. Téléchargez le Node driver (archive Zip de 11 Mo) et décompressez-le sur votre machine Windows locale. (Il contient une copie de node.exe, ainsi que des scripts et des fichiers de support ; tout le nécessaire se trouve dans l'archive. Attention : ne tentez pas de l'exécuter sur Mac ou Linux. Il s'agit d'une version de Node compilée spécifiquement pour Windows.)
2. Dans le dossier Zip décompressé, recherchez start.bat et exécutez-le. (Laissez-le tourner. Ne fermez pas sa fenêtre.) Cela démarre le pilote Node qui communique 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 apparaître ci-dessous : « Connecté au pilote sur le 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, vous devriez voir une réponse enregistrée (sur l'écran principal, sous la Console) qui ressemble à ceci :
OUT :
{
"source":"client"
"data":"5669564f74656368320018010000b3cd"
"type":"raw command"
}
ENTRANT :
{
"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'utiliser 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 ); }. Bien entendu, 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 permettre de 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 ces commandes, consultez la documentation technique de votre lecteur. (Vous pouvez télécharger la documentation ID TECH depuis la Page de 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. Il est donc évident que ce code (bien qu'il fonctionne !) doit être considéré comme une preuve de concept et non comme du code prêt pour la production. S'il s'agissait d'un code de production, vous voudriez y intégrer un montant réel, la date de transaction effective, etc.
L'acheminement de la commande vers le lecteur se fait 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 : reportez-vous aux 2e et 3e lignes du code ci-dessus. La quatrième ligne émet l'objet de données sur le socket.
Rappelons qu'avant toute chose, vous devez attacher un écouteur (ou un rappel) 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 initier la transaction. Rappelons que nous avions indiqué que le déclenchement est un processus en deux étapes :
1. Envoyer un message du navigateur au pilote.
2. Récupérer le message du pilote vers le périphérique USB.
Le « message » est une longue chaîne hexadécimale de firmware, peu lisible.
Le « pilote », dans ce cas, n'est qu'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 le fichier usb-websocket-shim.js.
Vous pouvez très facilement modifier le code du pilote afin qu'il contienne (déjà mis en cache dans une chaîne) la commande firmware magique qui déclenche la transaction (ou une fonction qui génère cette chaîne). Cette approche vous permet de masquer la commande firmware magique 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 approche ? Pourquoi masquer la commande firmware dans le pilote lui-même ?
Plusieurs bonnes raisons me viennent à l'esprit.
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 beaucoup plus proche du matériel. Réfléchissez-y : souhaitez-vous vraiment que votre application de paiement ait une connaissance approfondie des commandes firmware ? Ne serait-il pas préférable d'en affranchir l'application ? Celle-ci ne devrait-elle pas se concentrer uniquement sur la logique métier ?
Deuxièmement : intégrer la commande magique directement dans le pilote vous permet de définir votre propre API pour cette commande, et ainsi de proposer une interface considérablement simplifiée que l'application de paiement pourra utiliser. (Voir un exemple ci-dessous.)
Par ailleurs, il convient de prendre en compte la réduction du périmètre de conformité. 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 ou le terminal ne transmet guère plus que le montant de la transaction au sous-système de traitement ; ce dernier, qui communique avec le lecteur de carte, retourne en échange un code d'autorisation ainsi que 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 du code capable de répondre aux messages WebSocket entrants de ce type :
C'est d'ailleurs déjà implémenté dans notre pilote Node. (Voir mon article précédent pour la liste du code du pilote.) Ce qui signifie que tout ce dont nous avons besoin pour initier une transaction sans contact depuis l'application de paiement (ou ViVOpay Explorer) est d'effectuer :
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 permet 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 Téléchargements gratuite d'ID TECH pour accéder à la documentation produit complémentaire, aux livres blancs, à la documentation SDK, etc.
Pour obtenir un kit d'évaluation contenant l'un des lecteurs de cartes d'ID TECH, appelez-nous à tout moment au numéro indiqué ci-dessous :
