ID TECH
Contatto
Tutti gli articoli tecnici

Post tecnico

Transazioni Contactless in Modo Semplice

Tutti sanno quanto possano essere scomodi i chip card. Inserisci la carta, batti il piede con impazienza, sperando che il chip faccia cilecca così puoi passare direttamente allo swipe… Okay, forse è un'esagerazione. Ma capite cosa intendo. Il classico "contact EMV" frustra i clienti (e ha portato più di uno sviluppatore di app di pagamento sull'orlo della disperazione) perché è lento, complesso e non perdona gli errori.

Con il contactless EMV, tutto cambia. Una transazione "tap and go" richiede in genere meno di 500 millisecondi e può essere effettuata con il proprio smartphone (molto più comodo che tirar fuori una carta di plastica). E indovinate un po'? È più semplice anche per gli sviluppatori. È possibile eseguire una transazione contactless con pochissime righe di codice. E si può fare tutto in JavaScript, se lo si desidera: niente Visual Studio o Xcode da aprire, nessun ciclo di compilazione, nessuna libreria collegata né dipendenze problematiche. Uno sviluppo davvero rapido!

Si considerino le seguenti 4 righe di JavaScript:

Che ci crediate o no, queste 4 righe vi permetteranno di eseguire una transazione contactless EMV utilizzando uno qualsiasi dei lettori di carte compatti e a basso costo della serie VP3300 disponibili presso ID TECH (come il VP3300 mostrato sopra). Una volta eseguite queste 4 righe, è sufficiente avvicinare il proprio smartphone (o una carta contactless) al lettore: il dispositivo emetterà un segnale acustico, avvierà una comunicazione NFC e trasmetterà i dati della transazione (via USB).

Naturalmente, affinché queste righe di codice possano effettivamente funzionare, è necessario prima installare lo script Node che comunica con il dispositivo USB (e Node JS stesso) come descritto nel mio precedente articolo. (Scaricate lo script eseguibile insieme a Node in un unico archivio qui.) E probabilmente vorrete eseguire le righe di codice precedenti da Firefox o Chrome, utilizzando l'app disponibile qui.

Cos'è ViVOpay Explorer? È semplicemente una pagina HTML molto essenziale contenente una console JS e alcuni comandi precaricati. La pagina web è composta da 50 righe di HTML e 400 righe di JavaScript (inclusa la routine del parser TLV di cui ho parlato in un post precedente). Quando si utilizza ViVOpay Explorer in Chrome o Firefox (non tentare di aprirlo in Internet Explorer), viene visualizzata una pagina del browser simile a questa:

L'area grigia, sotto "Console," è un REPL live (in questo caso, un jQuery Terminal) nel quale è possibile eseguire codice JavaScript arbitrario in tempo reale. In alto a destra si trovano dei campi di testo (che mostrano "http://localhost" e "9901") accanto a un pulsante Connect . Premendo il pulsante, ViVOpay Explorer cerca una connessione Websocket su 127.0.0.1, porta 9901. La metà inferiore della pagina è un'area di log dove vari tipi di informazioni di stato (ad es. letture del traffico USB) vengono visualizzati in tempo reale, in risposta ai comandi.

Facendo clic sul piccolo punto interrogativo accanto al menu a discesa viene visualizzato un piccolo pannello della Guida che illustra come utilizzare ViVOpay Explorer. In sintesi, ecco cosa è necessario fare:

1. Scaricare il Node driver (archivio Zip da 11 MB) e decomprimerlo sul proprio computer Windows locale. (Include una copia di node.exe, oltre a script e file di supporto; tutto il necessario è contenuto nell'archivio. Non tentare tuttavia di eseguirlo su Mac o Linux: si tratta di una versione di Node specifica per Windows.)

2. Nella cartella Zip decompressa, trovare start.bat e avviarlo. (Tenerlo in esecuzione senza chiudere la finestra.) Questo avvia il driver Node che comunica via USB e avvia anche un server Websockets.

3. Collegare alla porta USB un lettore di carte di credito della serie VP3300 (UniPay III, BTPay Mini, ecc.) di ID TECH. Il driver Node rileverà automaticamente il dispositivo e si connetterà ad esso.

4. Fare clic sul pulsante Connetti (in alto a destra). Verrà visualizzato il seguente messaggio: "Connesso al driver sulla porta 9901." Ciò indica che il browser sta comunicando con il driver tramite Websockets su http://localhost:9901.

5. Selezionare il comando Ping reader dal menu a discesa. Verrà eseguito uno script che invia un ping al dispositivo USB connesso.

Se il passaggio 5 va a buon fine, nella schermata principale, sotto la Console, verrà visualizzata una risposta nel registro simile alla seguente:

OUT:
{
"source":"client"
"data":"5669564f74656368320018010000b3cd"
"type":"raw command"
}

IN:
{
"source":"usb"
"data":"5669564f74656368320018000000fa83″
"type":"data"
}

Questi sono i messaggi JSON inviati (al dispositivo USB) e ricevuti (dal browser) tramite WebSocket durante il ping. Si noti che gli oggetti JSON personalizzati seguono uno schema molto semplice: sono presenti tre campi, denominati source, data e type. Per i messaggi in uscita (dal browser al driver), la proprietà source deve avere il valore "client"; il campo data conterrà una stringa esadecimale che rappresenta il comando inviato al dispositivo USB; il campo type conterrà "raw command", per indicare al driver che il comando contenuto in data deve essere trasmesso direttamente al dispositivo USB.

Inviare un oggetto JSON (o qualsiasi altro messaggio) dal browser al driver è semplice. Nel codice del browser, è sufficiente eseguire socket.emit( 'echo', myObject ). Per ricevere dati dal driver, è sufficiente impostare un listener: socket.on( 'message', myListener ), dove myListener può essere una funzione anonima, come function( m ) { log( m ); }. Ovviamente, è necessario impostare il listener prima di inviare qualsiasi cosa al driver. In caso contrario, il driver potrebbe rispondere prima che si sia pronti a ricevere la risposta.

Come avviare una transazione contactless: Strategia 1

Per mettere il lettore in modalità NFC e farlo leggere una carta o un wallet contactless, è sufficiente inviare il comando firmware appropriato (come stringa esadecimale):

La prima riga dichiara il comando come stringa. Per sapere come costruire tali comandi, è necessario consultare la documentazione tecnica del proprio lettore. (È possibile scaricare la documentazione di ID TECH dalla Pagina Download sulla Knowledge Base pubblica di ID TECH.) Questo particolare comando contiene un importo predefinito di $1,00 e una data ormai scaduta; pertanto, è evidente che questo codice (pur funzionando!) deve essere considerato di qualità dimostrativa e non adatto alla produzione. Se si trattasse di codice di produzione, sarebbe necessario elaborarlo in modo da includere un importo reale, la data effettiva della transazione e così via.

L'invio del comando al lettore è un processo in due fasi: prima occorre inviarlo al driver in un oggetto JSON tramite Websockets, quindi lasciare che il driver lo trasmetta al lettore USB. Includere il comando in un oggetto JSON che il driver possa elaborare è semplicissimo: si vedano la 2ª e la 3ª riga del codice precedente. La quarta riga emette l'oggetto dati sul socket.

Si tenga presente che, prima di eseguire qualsiasi operazione, è necessario associare un listener (o callback) al socket per poter elaborare la risposta del lettore. Questo può essere semplice come:

Come avviare una transazione contactless: Strategia 2

Esiste una seconda strategia per avviare la transazione. Come accennato in precedenza, l'avvio è un processo in due fasi:

1. Inviare un messaggio dal browser al driver.

2. Ricevere il messaggio dal driver al dispositivo USB.

Il "messaggio" è una lunga stringa esadecimale del firmware, poco leggibile.

Il "driver", in questo contesto, è semplicemente uno script Node (circa 350 righe di JavaScript) in esecuzione nel process space di Node. Il codice sorgente del driver si trova nella cartella driver. Cercare usb-websocket-shim.js.

È possibile modificare facilmente il codice del driver in modo che contenga già (memorizzato in una variabile String) il comando firmware speciale che avvia la transazione (oppure una funzione che costruisce tale stringa). In questo modo è possibile nascondere il comando firmware dietro un'API personalizzata, così che l'applicazione di pagamento (qui rappresentata da ViVOpay Explorer) debba inviare al driver soltanto un messaggio molto semplice, a scelta, per avviare la transazione.

Qual è il vantaggio di questo approccio? Perché nascondere il comando firmware all'interno del driver stesso?

Ci sono almeno un paio di buone ragioni per farlo.

In primo luogo, ha senso rimuovere le dipendenze dal dispositivo all'interno dell'applicazione di pagamento e collocarle nel driver, che è logicamente molto più vicino al dispositivo. Riflettiamoci: si vuole davvero che l'applicazione di pagamento conosca nel dettaglio i comandi firmware? Non sarebbe preferibile liberare l'app dalla conoscenza approfondita dell'hardware? L'app non dovrebbe occuparsi esclusivamente della logica di business?

In secondo luogo, spostare il comando speciale nel driver consente di definire una propria API per quel comando, con la possibilità di offrire all'applicazione di pagamento un'interfaccia molto più semplice da utilizzare. (Si veda un esempio più avanti.)

Occorre inoltre considerare la riduzione del perimetro. In pratica, la maggior parte delle applicazioni di pagamento e dei sistemi punto vendita è progettata in modo che il POS o l'applicazione di pagamento fornisca al sottosistema transazionale poco più dell'importo della transazione; il sottosistema transazionale, che comunica con il lettore di carte, restituisce quindi il codice di autorizzazione e le informazioni per la stampa della ricevuta. I dati sensibili della carta non raggiungono mai l'applicazione di pagamento.

Nel caso della "riduzione del perimetro", l'obiettivo è inserire nel driver del codice che risponda ai messaggi WebSocket in entrata nel seguente modo:

E questo è, di fatto, già implementato nel nostro driver Node. (Vedere il mio post precedente per un elenco del codice del driver.) Il che significa che tutto ciò che dobbiamo fare per avviare una transazione contactless dall'applicazione di pagamento (o da ViVOpay Explorer) è:

In ViVOpay Explorer, ho racchiuso tutto il codice necessario (incluso il codice per una callback che analizza i dati TLV dalla transazione e li visualizza sullo schermo) in una funzione chiamata startContactlessTransaction().

Ricorda che per ulteriori informazioni su come il driver basato su Node abilita la connettività USB, puoi consultare i miei post precedenti (scorri verso il basso per i collegamenti). Assicurati inoltre di consultare la pagina Download gratuita di ID TECH per ulteriore documentazione sui prodotti, white paper, documentazione SDK, ecc.

Per ricevere un kit di valutazione contenente uno dei lettori di schede di ID TECH, contattaci in qualsiasi momento al numero indicato di seguito:

Numero Verde
1-800-984-1010