Guide e report

Come avviamo le transazioni dei punti vendita a livello globale

Di Mark Arts (sviluppatore Java) e Otto Moerbeek (C Developer) di Adyen

11 aprile, 2018
 ·  6 minuti
Mark Arts & Otto Moerbeek, at Adyen

Attualmente, i pagamenti presso i punti vendita rappresentano ancora la maggior parte del volume globale. Eppure la quasi totalità dei sistemi per punti vendita sono obsoleti e ingombranti, richiedono notevoli costi di installazione e non consentono di implementare rapidamente nuove funzionalità. Come sviluppatori POS di Adyen, di recente abbiamo adottato una nuova API per semplificare la configurazione deipagamenti POS.

Il problema

La maggior parte delle configurazioni POS comprende un registratore di cassa (gestito dal personale del negozio) unterminale di pagamento(in cui il cliente inserisce la carta) e una connessione seriale tra i due. Nel registratore di cassa è incorporata una libreria che facilita la comunicazione tra il registratore stesso e il terminale di pagamento. In genere, queste librerie sono create e gestite dall'azienda che fornisce i terminali, come Adyen.

L'utilizzo delle librerie implica una serie di problemi:

Un'integrazione profonda tra il registratore di cassa e la libreria richiede una notevole quantità di lavoro di configurazione e sviluppo, perché la libreria sarà inclusa nel software del registratore di cassa.

  • Spesso il software del registratore di cassa (che è di terze parti) viene aggiornato solo una volta all'anno, il che significa che i rivenditori non hanno subito a disposizione gli aggiornamenti più recenti della libreria.
  • I registratori di cassa dei vari fornitori e piattaforme presentano differenze notevoli e questo rende molto onerosa la gestione dello sviluppo della libreria per Adyen.

Data center

Inoltre, molti grandi rivenditori al dettaglio preferiscono adottare soluzioni centralizzate per il software di cassa. Ciò significa che il software deve essere configurato in modo da avviare una transazione su un terminale di pagamento nel negozio instradando le richieste dal centro dati alla rete del negozio. Per fare questo, i commercianti devono utilizzare il port forwarding per gestire i pagamenti in più sedi, un IP fisso per ciascun terminale o eventualmente una configurazione VPN per la sicurezza. Tutte queste possibilità comportano una complessa configurazione di rete che prosciuga le risorse operative.

Risolvere il problema delle librerie con il protocollo Nexo

Idealmente, avevamo bisogno di una soluzione che fosse indipendente da qualsiasi piattaforma specifica, in grado di essere utilizzata per le connessioni seriali, la rete locale e i trasferimenti via internet, e che supportasse un formato di messaggio con funzionalità avanzate come le notifiche asincrone.

Per rispondere a questi requisiti, abbiamo eliminato la necessità di librerie e creato Terminal API adottando il protocollo Nexo: uno standard di pagamento con carta che facilita la comunicazione tra il registratore di cassa e il terminale.

Il modello di interazione di base di Nexo si fonda sui messaggi di richiesta/​risposta JSON. Ciò significa che un pagamento con Terminal API comporta l'invio di messaggi di richiesta-risposta e tutti gli eventi informativi, come la notifica della fase del processo di pagamento in cui si trova il terminale, vengono comunicati tramite i webhook JSON eventualmente implementati.

L'utilizzo di questo approccio è vantaggioso per i seguenti motivi:

  • Semplifica il supporto di nuovi linguaggi di programmazione, poiché la libreria richiede che tutti i potenziali eventi vengano implementati come callback e passati come parte della richiesta di pagamento iniziale.
  • Gestire un formato di messaggistica JSON, piuttosto che librerie, callback e SDK personalizzati, facilita notevolmente l'implementazione e l'aggiornamento del software da parte dei commercianti.
  • Internamente, ci ha permesso anche di non dover supportare più linguaggi di programmazione per l'API.

Risolvere il problema della complessità della configurazione di rete con il routing attraverso il cloud

L'utilizzo di Terminal API nella rete dei negozi è stato un ottimo primo passo. Tuttavia, non ha risolto il problema posto dal disporre i pagamenti da un luogo centralizzato come un centro dati.

Per semplificare l'investimento nella configurazione ed eliminare i costi di tutta questa complessità, abbiamo anche adattato il nostro Terminal API per il cloud. L'architettura dei punti vendita faceva affidamento sul registratore di cassa e sul backend del commerciante per comunicare con il terminale, come indicato di seguito:

Local network for Point of sale

Nella versione cloud dell'API, abbiamo aggiunto la possibilità per il commerciante di avviare un pagamento sul terminale direttamente con il backend di Adyen.

Point of sale via the cloud

L'adozione dei WebSocket

Uno dei vantaggi delle connessioni seriali è che offrono una comunicazione bidirezionale, per cui sia il registratore di cassa che i terminali di pagamento possono avviare la comunicazione e lo scambio di dati relativi allo stato della transazione. Con il nostro Terminal API in rete, le transazioni diventano messaggi di richiesta e risposta https. Il registratore di cassa avvia una richiesta di pagamento inviando una richiesta https al terminale.

Tuttavia, su internet, disporre di un canale in cui entrambe le parti possono avviare la comunicazione è complicato, in quanto i terminali "NATed" non possono essere raggiunti senza aprire il firewall e configurare il port forwarding. Ci serviva una soluzione in grado di abilitare facilmente la comunicazione bidirezionale e l'abbiamo trovata nel protocollo WebSocket. Questa tecnologia viene utilizzata da diverse piattaforme per le notifiche push, come ad esempio nei feed delle notizie, e l'abbiamo sfruttata per la comunicazione tra i terminali e il backend di Adyen.

Per consentire la comunicazione bidirezionale, abbiamo creato una singola richiesta https dal terminale di pagamento e abbiamo aggiunto intestazioni per richiedere un aggiornamento della connessione a un WebSocket, come mostrato di seguito. A questo punto, abbiamo stabilito un canale di comunicazione bidirezionale tra il nostro backend e il terminale di pagamento.

Code snippet for WebSocket connection
Code snippet for WebSocket connection upgrade

Un flusso standard avviene come segue:

  1. Quando il registratore di cassa avvia una transazione, invia una richiesta https al backend di Adyen.
  2. Il backend di Adyen trova il WebSocket utilizzato dal terminale e lo sfrutta per instradare la richiesta al terminale stesso (per maggiori informazioni al riguardo leggi la sezione sul bilanciamento del carico).
  3. Il terminale invia la propria risposta al backend di Adyen tramite il WebSocket, che a sua volta la invia come risposta https al registratore di cassa.
Animated steps for terminal api connection

Bilanciamento del carico e ridondanza

​La ridondanza è un fattore chiave nella nostra architettura di sistema. È importante che le transazioni non vengano influenzate dagli aggiornamenti delle applicazioni o dalle operazioni di manutenzione. Il nostro layer per l'accettazione dei pagamenti è costituito da più server in più centri dati in tutto il mondo. Questo aiuta a ridurre la latenza e a garantire la ridondanza. (Nota: per maggiori informazioni sul nostro approccio alla ridondanza e alla configurazione dei database consulta: ​Updating a 50 terabyte PostgreSQL database)

Questa infrastruttura garantisce la ridondanza e la possibilità di bilanciare i carichi in caso di necessità di manutenzione. Tuttavia, solleva un'altra questione: cosa succede se un terminale avvia una connessione con il server A e un registratore di cassa la apre con il server B? La nostra configurazione prevede che se un terminale si connette al server A, viene attivato un messaggio da quel server ad altri server che dice “Ora sono connesso con questo terminale”. Se un registratore di cassa si connette al server B, questo può cercare quale server dispone della connessione WebSocket e instradare il messaggio attraverso quel server.

Se dobbiamo effettuare aggiornamenti dell'applicazione oppure operazioni di manutenzione su un server, questo invia un messaggio al terminale in modo che si riconnetta ad un altro server. Una volta interrotte tutte le connessioni, possiamo iniziare.

Conclusione

Il nostro Terminal API semplifica l'implementazione e fa in modo che i commercianti siano in grado di stare al passo con gli ultimi aggiornamenti del software. Tuttavia, ci sono modi più innovativi in cui può essere utilizzato. Ad esempio, poiché i pagamenti in negozio possono essere avviati da remoto, i commercianti potrebbero creare un'esperienza in cui un cliente avvia un ordine in-app, entra in un negozio, scansiona un codice QR con il proprio telefono per disporre il pagamento sul terminale e ritira l'articolo acquistato. Queste possibilità ci incuriosiscono molto e non vediamo l'ora di scoprire in che modo i commercianti utilizzeranno questa tecnologia.

Per maggiori informazioni sul nostro Terminal API, consulta la documentazione sulla sua integrazione e l'articolo nel blog sui vantaggi commerciali che offre: “Presentazione di Terminal API”.



Iscriviti alla nostra newsletter!

Compila il form e rimani aggiornato

Confermo di aver letto l'informativa sulla privacy di Adyen e acconsento all'utilizzo dei miei dati in conformità con essa.