Tutti i progetti
Su pub.dev · registrazioni nella sandbox di NexiCaso di studio

nexi_payment

Un plugin Flutter per i gateway di pagamento di Nexi: il checkout di Nexi su Android e iOS, e un esito di cui l’app si può fidare.

Ruolo
Autore e maintainer: l’API Dart, il codice Android (Java) e iOS (Swift), i test, la CI e i rilasci
Tipo
Plugin Flutter open source, licenza MIT, su pub.dev
Periodo
2020 – oggi (2.3.0, luglio 2026)
Piattaforme
Android e iOS
  • Flutter
  • Dart
  • Java
  • Swift
  • Platform channels
  • Nexi XPay SDK
  • Nexi NPG SDK
  • Patrol
  • GitHub Actions

Il prodotto

nexi_payment permette a un’app Flutter di ricevere pagamenti tramite Nexi. L’app passa l’ordine, il checkout di Nexi raccoglie i dati della carta (l’app non li vede mai) e l’app riceve indietro cosa è successo: pagato, annullato, oppure fallito, e perché.

L’ho scritto a giugno 2020, mentre integravo Nexi nell’app di Criluma Viaggi, e l’ho pubblicato su pub.dev. A luglio 2026 l’ho riscritto come 2.0: il nuovo gateway NPG di Nexi accanto al classico XPay, un unico contratto per gli errori su entrambe le piattaforme, test che pilotano gli SDK reali e correzioni per i momenti in cui gli SDK nativi di Nexi restano in silenzio o riportano la cosa sbagliata.

7
rilasci stabili su pub.dev, dalla 1.0.0 di giugno 2020 alla 2.3.0 di luglio 2026
53
dei 58 commit sono miei; gli altri sono arrivati come pull request di altri contributori
2
gateway Nexi dietro un’unica API Dart: il classico XPay e NPG
49
test automatici: 35 unit test e 14 test di integrazione che girano su un dispositivo

Tour guidato

L’app in azione

Scegli una registrazione, o salta direttamente a un capitolo.

Un pagamento con carta, primo fotogramma
0:00 / 1:43

Registrate su un emulatore Android da una build di release dell’app di esempio, con pagamenti nella sandbox pubblica di Nexi. I campi del checkout vengono individuati tramite DevTools e toccati come farebbe un dito; per funzionare, la pagina della sandbox ha bisogno di due piccole correzioni, applicate allo stesso modo.

Cosa fa

Da un pulsante nell’app a un esito di cui fidarsi

01

Una chiamata apre il checkout di Nexi

L’app passa l’ordine (id, importo, valuta, lingua) e il plugin apre la Hosted Payment Page di Nexi tramite l’SDK nativo: una carta, o uno degli altri metodi offerti da Nexi. La carta si digita sulla pagina di Nexi, mai nell’app.

02

Riepilogo e 3-D Secure

Nexi mostra il riepilogo con la carta mascherata, poi passa la mano alla banca del titolare per il 3-D Secure: nella sandbox è la DemoBank, a cui si può chiedere di far riuscire o fallire l’autenticazione.

03

Un esito di cui l’app si può fidare

Gli SDK nativi chiamano la loro callback “completed” per qualsiasi pagamento concluso, compresi quelli rifiutati. Il plugin segnala un successo solo per un’operazione finale EXECUTED o AUTHORIZED; un’autenticazione fallita torna come errore con il codice di Nexi. Prima della 2.0, su iOS un pagamento negato arrivava addirittura come semplice stringa; ora entrambe le piattaforme sollevano gli stessi errori con codice.

04

Ogni via d’uscita chiude la chiamata

Il tasto Indietro, il link di annullamento di Nexi, un pannello trascinato via su iOS: ognuno chiude il pagamento come annullato, e il pagamento successivo si apre normalmente. Due di queste uscite lasciavano l’app in attesa di una risposta che non arrivava mai.

Sotto il cofano

Come è stato realizzato

Colmare i silenzi degli SDK

XPaySDK chiude il suo checkout al tasto Indietro di Android senza richiamare l’app, e NPGSDK su iOS può lasciar chiudere il suo pannello senza dire una parola. Il plugin osserva il ciclo di vita del checkout e, se questo sparisce senza aver detto nulla, chiude con un annullamento (un esito reale ha sempre la precedenza), e una protezione rifiuta un secondo pagamento mentre ce n’è già uno aperto, invece di lasciare due chiamate in sospeso.

Quando l’SDK non sa leggere la propria risposta

NPGSDK 1.1.0 dichiara l’additionalData di un’operazione come una mappa di stringhe, ma il backend ci annida dentro un oggetto, così su Android l’SDK può non riuscire a interpretare l’esito di un pagamento andato a buon fine. Il plugin allora rilegge l’ordine dall’API degli ordini di NPG e riporta ciò che è successo davvero: non inventa mai un successo, e dice “esito sconosciuto” quando non può saperlo.

Pacchettizzazione, test e rilasci

Nexi non pubblica artefatti Maven e il suo pod iOS non ha una slice per il simulatore: gli SDK Android sono inclusi nel plugin, mentre i framework iOS vengono scaricati dai repository di release di Nexi al pod install e verificati con checksum SHA-256 fissati. Gli unit test blindano il contratto del canale, i test Patrol pilotano gli SDK reali sulla sandbox di Nexi, la CI esegue analisi, test e build a ogni push e pull request, e un tag di versione pubblica su pub.dev.

Registrare un plugin di pagamento

Un checkout vero, nella sandbox di Nexi.

Un plugin non ha schermate proprie, quindi le registrazioni mostrano la sua app di esempio (una build di release su un emulatore Android) che paga davvero nella sandbox pubblica di Nexi.

  1. 1

    Il codice pubblicato, compilato in release

    Il repository al tag 2.3.0, l’app di esempio compilata in modalità release con le credenziali della sandbox pubblicate da Nexi, installata su un emulatore. Nessuna chiave privata: i pulsanti del classico XPay richiedono un terminale di test dell’esercente e non sono mostrati.

  2. 2

    Dentro la pagina di Nexi con DevTools

    Il checkout è una pagina web dentro la WebView dell’SDK. Lo script di registrazione ne trova i campi tramite Chrome DevTools, che indica anche dove si trova la WebView sullo schermo, e li tocca sul touchscreen dell’emulatore come farebbe un dito, digitando la carta di test di Nexi.

  3. 3

    Due stranezze della sandbox

    La pagina della sandbox a volte lascia senza etichetta il pulsante della carta, e non abilita mai il pulsante di pagamento per una carta digitata a mano. Lo script corregge entrambe le cose da DevTools, la seconda esattamente come fa il runbook per i test su dispositivo del plugin stesso.

  4. 4

    Tre finali

    Un pagamento che va a buon fine, uno in cui il 3-D Secure fallisce e due modi di andarsene. Ogni ripresa parte da un’app azzerata e da un nuovo ordine.

Le pagine di pagamento, l’esercente della sandbox (WWW.CHARTA.IT) e la DemoBank fanno parte della sandbox pubblica di Nexi. La carta è la carta di test pubblicata da Nexi; il titolare è inventato.

Hosted Payment Page

Qui non c’è niente da provare: il plugin gira all’interno di app Android e iOS. Lo trovi su pub.dev e GitHub.

Ogni schermata

La raccolta completa degli screenshot

  • L’app di esempioEntrambi i gateway, il salvataggio della carta e un addebito ricorrente, un pulsante ciascuno.
  • Hosted Payment PageLa pagina di Nexi, aperta dall’SDK nativo: carta o un altro metodo.
  • La cartaLa carta di test pubblicata da Nexi; l’app non vede mai il numero.
  • RiepilogoEsercente, importo, ordine e la carta mascherata.
  • 3-D SecureLa DemoBank della sandbox chiede conferma al titolare della carta.
  • EseguitoIl plugin segnala un successo solo per un pagamento eseguito o autorizzato.
  • FallitoTHREEDS_FAILED, non un successo: il plugin controlla l’operazione finale.
  • AnnullatoTasto Indietro: il plugin trasforma il silenzio dell’SDK in un annullamento.
  • Uscire dalla paginaL’annullamento di Nexi chiede una conferma.

Prossimo caso di studio

Referi →