🟡 Pre-produzione — deployato e verificato end-to-end con un client di collaudo

Migra da IGFS
senza toccare il codice

I client che oggi parlano direttamente con IGFS (N&TS/Nexi PGW REST) passano su PayGlobe senza modificare una riga del loro codice. Cambiano tre valori di configurazione. Nient'altro.

3
valori da cambiare
0
righe di codice client
5
operazioni native
# Solo configurazione. Il codice non si tocca.

- BASE_URL = "https://testapif.netsgroup.com/MONEYNET_CG_SERVICES"
+ BASE_URL = "https://api.payglobe.it/MONEYNET_CG_SERVICES"

- MER_ID = "<assegnato da N&TS>"
+ MER_ID = "<emesso da PayGlobe>"

- SECRET = "<assegnato da N&TS>"
+ SECRET = "<emesso da PayGlobe>"

# Firma, path, JSON, resultCode: identici. ✓

L'idea, in una tabella

L'adapter è l'equivalente IGFS di Mandala, il nostro adapter Stripe-compatibile: parla il protocollo di rete di IGFS sul lato in ingresso e instrada tutto verso PayGlobe. Per il client migrato, PayGlobe è IGFS.

ValorePrima (IGFS reale)Dopo (adapter)
Base URL https://…netsgroup.com/MONEYNET_CG_SERVICES https://api.payglobe.it/MONEYNET_CG_SERVICES
merId (= keyId) assegnato da N&TS emesso da PayGlobe
secret HMAC assegnato da N&TS emesso da PayGlobe
Perché il path resta /MONEYNET_CG_SERVICES

Non è un vezzo estetico: la firma HTTP-Signature copre (request-target), cioè metodo + path completo. Se cambiasse il path cambierebbe la stringa firmata e il client dovrebbe toccare il codice. L'adapter espone quindi lo stesso context-path (SERVER_CONTEXT_PATH), così il client cambia solo l'host.

A chi è rivolta questa pagina

IGFS è un marchio e un prodotto di N&TS Group. PayGlobe non è affiliata a N&TS Group e non è autorizzata a distribuire la documentazione di integrazione IGFS. Questa pagina non è, e non sostituisce, quella documentazione: non spiega come integrarsi con IGFS.

È rivolta esclusivamente a chi ha già un'integrazione IGFS attiva e la relativa documentazione ricevuta da N&TS, e descrive soltanto cosa cambia nella sua configurazione per far parlare quella stessa integrazione con PayGlobe. Le specifiche del protocollo restano da chiedere a N&TS Group.

Cosa ci guadagna il client

Non è solo una sostituzione alla pari: restando fermo, il client eredita tutto ciò che PayGlobe sa fare e che IGFS da solo non fa.

🔌
Zero righe di codice

Stessi path, stesso JSON txHead/txReq/txRes, stessa HTTP-Signature, stesso IGFS_000. Cambiano tre valori di configurazione.

💳
Metodi che IGFS non ha

Bizum, PayPal, Satispay, crypto, buoni pasto: il compratore sceglie sul checkout PayGlobe e il client riceve una normale transazione IGFS riuscita. Già successo in collaudo, non è una promessa.

↩️
Si torna indietro subito

Rimettendo i tre valori di prima il client riparla con IGFS. Nessuna migrazione di dati, nessuno stato da riportare indietro.

🔎
Errori veri, non generici

Un fallimento torna col suo codice — IGFS_20090 per l'annullamento del compratore — e la descrizione originale, così la logica di retry del client continua a funzionare.

Come funziona

Modalità full-routing: l'IGFS reale non viene mai chiamato. L'adapter verifica la firma, traduce e instrada al backend PayGlobe — esattamente come fa Mandala per i client Stripe.

Client IGFS
invariato
POST /pgw/payment/init
Authorization: Signature…
Adapter
:4001
verifica firma
merId → API key
PayGlobe
/api/payment/initiate
routing multi-PSP
1
Init. Il client firma e chiama /pgw/payment/init. L'adapter risponde con txHead + paymentId + redirectURL e resultCode = IGFS_000, la forma che il client già si aspetta.
2
Pagamento. Il compratore apre il redirectURL. È la pagina di checkout PayGlobe, che nasconde il gateway sottostante.
3
Ritorno asincrono. PayGlobe notifica l'adapter via webhook firmato; l'adapter inoltra al client un POST {merId, txId, paymentId}, come farebbe IGFS.
4
Verify. Il client — invariato — chiama GET /pgw/payment/verify firmato e ottiene l'esito autorevole OK | PENDING | KO. È il modello pull di IGFS: la notifica non trasporta dati sensibili, quindi non serve firmarla in uscita.

Cosa parla già nativo

Contratto di riferimento: lo swagger ufficiale N&TS "E-Commerce Payments Services API". Sotto, la copertura reale — senza arrotondamenti.

Operazione IGFS Instradata su Stato Note
POST /pgw/payment/initPOST /api/payment/initiatefattoaccetta sia la forma top-level sia poiInfo annidato
GET /pgw/payment/verifyGET /api/payment/status/{id}fattoalias /verification
POST /pgw/payment/capturePOST /api/payment/finalize/no-voucherfattovia origTranId
POST /pgw/payment/reversalPOST /api/payment/cancel/{id}fattovia origTranId
POST /pgw/payment/refundPOST /api/payment/refund/{id}fattosu IGFS il parziale non è disponibile
notify / callback server→clientwebhook PayGlobe → relayfattooutbox transazionale, retry con backoff
POST /pgw/paybymail/init
GET /pgw/paybymail/verify
/api/payment-links/*da fareil motore esiste già lato PayGlobe: è cablaggio
DELETE /pgw/paybymail/deletecancel payment linkda fare Ver. 20nuovo nella spec
POST /pgw/payment/selectorda fare
GET /pgw/tokenizer/check
DELETE /pgw/tokenizer/delete
coming soonPayGlobe ha già la tokenizzazione IGFS: manca solo l'esposizione in protocollo nativo
POST /pgw/checkout/complete
GET /pgw/checkout/info
da fare Ver. 19servizi checkout, mai analizzati

5 operazioni su 14, più il ritorno asincrono. Sono le cinque che compongono il flusso e-commerce completo (autorizza → incassa → storna → rimborsa), cioè quelle che servono a un merchant per operare dal primo giorno.

La firma resta identica

È il punto che rende la migrazione a costo zero: l'adapter verifica in ingresso la stessa HTTP-Signature (draft-cavage-10) che il client già calcola oggi. Nessuna libreria da cambiare, nessun algoritmo nuovo. Qui sotto non c'è la specifica della firma — quella è nella documentazione N&TS che il client già possiede — ma solo l'unica riga che cambia: l'host.

# stringa da firmare — una riga per header, nell'ordine di headers="…" host: api.payglobe.it date: Fri, 01 Aug 2026 10:12:44 GMT (request-target): post /MONEYNET_CG_SERVICES/pgw/payment/init digest: SHA-256=6iJfkOF3ra8+t09DtcpwjR6Kxt6lnv+aF5GtzZm6ue0= # header risultante Authorization: Signature keyId="{merId}", algorithm="hmac-sha256", headers="host date (request-target) digest", signature="{Base64(HmacSHA256(signingString, secret))}"
Dettagli che contano
  • digest = "SHA-256=" + Base64(SHA256(body)) — solo su POST
  • Le GET non hanno digest: va tolto sia dalla stringa firmata sia dalla lista headers
  • (request-target) include la query string — la verify porta merId, paymentId, txId come parametri
  • keyId deve valere quanto il merId nel corpo: l'adapter lo verifica e rifiuta il mismatch
  • Supportata anche la key derivation HKDF (header X-signature-salt), verificata contro il vettore ufficiale N&TS

La migrazione, passo per passo

Quello che serve fare, e da chi.

1Emissione credenziali

PayGlobe emette merId + secret e li mappa sull'API key del merchant. Una riga per client. Il merchant non deve aprire alcun rapporto nuovo con N&TS.

2Repoint del client

Il client cambia host, merId e secret nella propria configurazione. Prerequisito: che li legga da config e non li abbia cablati nel codice — l'hostname soprattutto.

3Round-trip di prova

Init + verify su un merchant di test. Se la firma torna, torna tutto: è la parte che rompe per prima quando un proxy altera Host o path.

4Ritorno asincrono

Verifica che notifyURL e callbackURL del client vengano raggiunti e che il suo verify di conseguenza risponda come prima.

5Operazioni successive

Capture, reversal e refund usano origTranId: vanno provate su una transazione reale, perché dipendono dalla mappa tranId ↔ transazione.

6Switch

Il rollback è simmetrico e immediato: si rimettono i tre valori originali e il client torna su IGFS. Nessuna migrazione di dati, nessuno stato da riportare indietro.

Requisito infrastrutturale da non sottovalutare

Qualsiasi proxy davanti all'adapter deve preservare l'header Host e il path della richiesta: entrambi entrano nella stringa firmata. Un proxy che riscrive l'uno o l'altro produce un 401 sistematico — e sembrerà un problema di credenziali quando invece è di rete.

Stato reale del lavoro

L'adapter è in pre-produzione: gira sull'infrastruttura di produzione e il flusso completo è stato percorso da un client reale che non ha modificato il proprio codice, ma su merchant di collaudo e non ancora aperto a traffico vivo. Sotto c'è la linea esatta fra ciò che è verificato sul campo e ciò che non c'è ancora — nessuna delle due colonne è una previsione.

✅ Verificato sul campo
  • init · verify · capture · reversal · refund esposti in nativo IGFS
  • Giro completo da internet con firma reale: init → pagamento → verify con status: OK
  • Un pagamento Bizum — metodo che in IGFS non esiste — concluso e riportato al client come una normale transazione IGFS riuscita
  • Annullamento del compratore restituito come IGFS_20090 con la descrizione originale, non come un KO muto
  • Verifica firma in ingresso, secret raw e HKDF (vettore ufficiale N&TS)
  • Stato su DB (mappa tranId, contesto pagamento, outbox) con pulizia a TTL
  • Guardie di sicurezza: anti-IDOR cross-merchant, SSRF sugli URL del client, verifica firma del webhook in ingresso
⏳ Non ancora fatto
  • Notifica asincrona spenta sul merchant di collaudo: un merchant PayGlobe ha un solo webhook e lì è già occupato. Il client usa la verify, che è il modello IGFS corretto, ma non riceve la chiamata
  • paymentId fuori formato: restituiamo l'identificativo PayGlobe (36 caratteri) mentre la specifica ne ammette 32 e IGFS ne manda 18 numerici
  • Del payload di init si usano importo, descrizione, email e lingua: il blocco order (indirizzi, prodotti, IVA, fattura) e i dati anagrafici del compratore non vengono inoltrati
  • Credenziali su file di configurazione: vanno spostate su DB
  • Operazioni mancanti: paybymail, selector e checkout. Il tokenizer in protocollo nativo è in arrivo: la tokenizzazione IGFS PayGlobe ce l'ha già
Tre cose da sapere prima di migrare un client reale
  1. Dati 3DS2 e antifrode. Indirizzi di fatturazione e spedizione, nome e telefono del compratore oggi non arrivano al circuito. Sono gli elementi con cui la banca decide l'esenzione dall'autenticazione: aspettarsi più challenge, e forse più rifiuti, rispetto a IGFS diretto. Non si vede in un collaudo funzionale, si vede nei tassi. Chi ha metriche di conversione su IGFS diretto le tenga come termine di paragone.
  2. Semantica di notifyURL vs callbackURL. Lo swagger descrive callbackURL come POST server-to-server {merId, txId, paymentId} e notifyURL come pagina di atterraggio del browser (in coppia con errorURL). Oggi l'adapter fa POST su entrambi e non passa la notifyURL a PayGlobe come URL di ritorno.
  3. Versione della specifica. L'adapter è allineato alla Ver. 17. La Ver. 20 aggiunge i servizi checkout, la delete dei paybymail e modifica i piType ammessi (rimossi UCPO/UCSC, SMSGSAMP, nuovi SAPP, CLCK, CCPT, PCIP).
Gli errori si diagnosticano in un colpo solo

Quasi tutti i 401 al primo collaudo sono configurazione vecchia sopravvissuta: keyId del vecchio merchant, oppure l'header Host del vecchio host IGFS mentre la firma ne contiene un altro. Regola che elimina la classe intera: l'host non va configurato a parte, va derivato dalla Base URL, e deve comparire identico nell'header Host e nella prima riga della stringa firmata.

Domande che arrivano sempre

Il client si accorge del cambio?

Sul filo, no: stessi path, stesse forme JSON, stesso IGFS_000, stessa firma. L'unica differenza osservabile è il redirectURL, che punta al checkout PayGlobe invece che all'host N&TS — per scelta, così il gateway sottostante resta nascosto.

Che succede al merchant che era su IGFS?

Entra in PayGlobe come qualsiasi altro merchant: dashboard, rimborsi, dispute, report, webhook, e l'accesso agli altri metodi di pagamento — che dal suo codice IGFS, da solo, non avrebbe mai potuto raggiungere.

Quanto è rischioso per chi è già in produzione?

Il raggio d'azione sul core PayGlobe è nullo: l'adapter è solo un altro client di /api/payment/*, come Mandala. Il rischio è tutto sul lato client, ed è mitigato dal fatto che il rollback sono tre valori di configurazione.

Perché non chiamare IGFS dietro le quinte?

Sarebbe un proxy, non una migrazione: il merchant resterebbe legato al contratto N&TS e non guadagnerebbe nulla. In full-routing invece il traffico entra nel nostro instradamento multi-PSP e il merchant diventa a tutti gli effetti nostro.