ID TECH
Contatto
Tutti gli articoli tecnici

Post tecnico

Transazioni contactless in modo semplice

Tutti sanno quanto possano essere noiose le carte con chip. Inserisci la carta, tamburelli con il piede, speri che il chip faccia cilecca così puoi finalmente strisciare… Okay, forse è un po' esagerato. Ma capite cosa intendo. L'EMV "contact" tradizionale frustra i clienti (e ha portato più di uno sviluppatore di app di pagamento sull'orlo della disperazione) perché è lento, complesso e non ammette errori.

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

Considerate le seguenti 4 righe di JavaScript:

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

Naturalmente, affinché queste righe di codice facciano effettivamente qualcosa, è prima necessario installare lo script Node che comunica con il dispositivo USB (e Node JS stesso) come descritto nel mio post precedente. (Scaricate lo script eseguibile insieme a Node in un unico archivio qui.) 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 di parsing TLV di cui ho parlato in un articolo precedente). Quando utilizzate ViVOpay Explorer in Chrome o Firefox (non provatelo in Internet Explorer), vedrete una pagina del browser simile a questa:

L'area grigia, sotto "Console," è un REPL live (in questo caso, un terminale jQuery) in cui è possibile eseguire codice JavaScript arbitrario in tempo reale. In alto a destra si trovano campi di testo (con i valori "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 in cui 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 si apre un piccolo pannello della guida che illustra come utilizzare ViVOpay Explorer. In sintesi, ecco cosa occorre 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 di eseguirlo su Mac o Linux: si tratta di una versione di Node specifica per Windows.)

2. Nella cartella Zip decompressa, individuare start.bat ed eseguirlo. (Tenerlo in esecuzione senza chiudere la finestra.) Questo avvia il driver basato su Node che comunica con la porta 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). Dovrebbe comparire il seguente messaggio: "Connected to the driver on port 9901." Ciò indica che il browser sta comunicando con il driver tramite Websockets sulla porta http://localhost:9901.

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

Se il passaggio 5 viene completato con successo, nella schermata principale, sotto la Console, dovrebbe apparire una risposta registrata 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 segnalare al driver che il comando contenuto nel campo 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 ); }. Naturalmente, è 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 consentirgli di 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 dei download sulla Knowledge Base pubblica di ID TECH.) Questo comando specifico contiene un importo predefinito di $1,00 e una data ormai superata; pertanto, questo codice (pur funzionando!) deve essere considerato di livello proof-of-concept, non adatto alla produzione. Se si trattasse di codice di produzione, sarebbe necessario personalizzarlo con un importo reale, la data di transazione effettiva e così via.

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

Tenere presente che, prima di eseguire qualsiasi operazione, è necessario collegare un listener (o callback) al socket, in modo da poter elaborare la risposta dal lettore. 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. Recuperare il messaggio dal driver al dispositivo USB.

Il "messaggio" è una lunga e complessa stringa esadecimale del firmware.

Il "driver", in questo contesto, è semplicemente uno script Node (di circa 350 righe in JavaScript) in esecuzione nel processo 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 stringa) il comando firmware speciale che avvia la transazione (oppure una funzione che genera tale stringa). In questo modo è possibile nascondere il comando firmware speciale dietro un'API di propria scelta, così che l'applicazione di pagamento (rappresentata in questo caso da ViVOpay Explorer) debba inviare al driver soltanto un messaggio molto semplice (a propria discrezione) per avviare la transazione.

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

Esistono almeno un paio di valide ragioni per farlo.

In primo luogo, ha senso rimuovere le dipendenze dal dispositivo nell'applicazione di pagamento e collocarle nel driver del dispositivo, che è logicamente molto più vicino all'hardware. Ci si chieda: è davvero necessario che l'applicazione di pagamento conosca nel dettaglio i comandi firmware? Non sarebbe preferibile liberare l'applicazione dalla conoscenza diretta dell'hardware, lasciandole gestire esclusivamente la logica di business?

In secondo luogo, spostare il comando speciale all'interno del driver consente di definire una propria API per quel comando, offrendo l'opportunità di esporre un'interfaccia molto più semplice che l'applicazione di pagamento possa utilizzare agevolmente. (Si veda l'esempio di seguito.)

A questo si aggiunge la questione della riduzione del perimetro applicativo. In pratica, la maggior parte delle applicazioni di pagamento e dei sistemi punto vendita è strutturata in modo tale che il POS o l'applicazione di pagamento fornisca al sottosistema di transazione poco più dell'importo da addebitare; il sottosistema di transazione (che comunica con il lettore di carte) restituisce quindi un codice di autorizzazione e le informazioni per la stampa dello scontrino. I dati sensibili della carta non raggiungono mai l'applicazione di pagamento.

Nel caso della "riduzione del perimetro", l'obiettivo è disporre, all'interno del driver, di codice in grado di rispondere ai messaggi WebSocket in entrata nel seguente modo:

Questa funzionalità è già implementata nel nostro driver Node. (Si veda 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'app di pagamento (o da ViVOpay Explorer) è:

In ViVOpay Explorer, ho racchiuso tutto il codice necessario (incluso il codice per un callback che analizza i dati TLV dalla transazione e li visualizza sullo schermo) in una funzione denominata 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 e altro ancora.

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

Numero verde
1-800-984-1010