Piattaforma multi-tenant che decide, per ogni pagamento, quale provider e quale conto incassa — e lo scrive, per sempre, sull'ordine. Redsys, Stripe e PayPal dietro la stessa interfaccia.
Un'agenzia che tiene i checkout di più negozi si ritrova con conti bancari diversi, soglie contrattuali diverse, e nessun posto dove vedere chi ha incassato cosa. Tre cose vanno storte sempre, e sono sempre le stesse.
Si cambia il conto attivo e i rimborsi degli ordini vecchi vanno alla banca sbagliata, perché nessuno si era segnato chi aveva incassato davvero.
Il limite di volume del contratto si supera in silenzio. Ci si accorge quando l'acquirer scrive, non quando succede.
Un errore di rete sposta l'incasso su un altro provider, con altre commissioni e un altro contratto. Nessuno l'aveva deciso.
Il core non sa cosa sia Redsys. Riceve cliente, importo e metodo; chiede al motore di routing chi serve quel metodo; prova i provider nell'ordine consentito. La rotazione fra conti è una particolarità di Redsys e vive dentro il suo adapter — mai nel checkout.
Soglia 1.000 €. Un ordine da 600 e uno da 300 restano sul primo conto. Quello da 200 la supera — e lo completa comunque il conto corrente. Il prossimo ordine va al conto successivo. La soglia decide chi incassa dopo, mai chi ha già cominciato a pagare.
Solo i conti attivi entrano in catena: in pausa, disabilitati o in errore non vengono nemmeno tentati. L'ordine è deterministico — niente sorteggi, due esecuzioni uguali danno la stessa catena.
Fra conti dello stesso provider è la rotazione normale. Per passare a un provider diverso serve un permesso scritto del cliente: cambiare da Redsys a Stripe vuol dire un altro contratto, non un ripiego tecnico.
Una rotazione successiva non cambia il provider storico. Anche la firma della notifica si verifica con la chiave di quel conto, non di quello attivo adesso.
Stesso cliente, stesso ordine, stessa chiave: la seconda richiesta restituisce la prima. Un doppio invio non diventa un doppio pagamento.
Il tenant si risolve sul server, mai sulla parola del browser. Un conto forzato che appartiene a un altro cliente viene rifiutato, non solo nascosto.
Nel record c'è un riferimento (env:NOME), mai una chiave. Le API restituiscono il riferimento; il valore non esce mai.
Gateway unico per provider. Un evento che non si può verificare viene rifiutato con 401. Non esiste una scorciatoia «salta il controllo in sviluppo».
Chi, cosa, prima, dopo, IP. Compresi i tentativi di accesso falliti. Non si cancella.
Queste immagini sono catturate dall'applicazione in funzione, con i tre clienti dimostrativi e i loro conti di prova.
Aggiungerne un quarto vuol dire scrivere un adapter e registrarlo: router, checkout e console non cambiano di una riga.
Fino a dieci conti per cliente, con rotazione a volume. Redirect e InSite, firma HMAC verificata.
Interfaccia completa e modello Connect. Senza chiavi si dichiara non disponibile, e Redsys incassa lo stesso.
Stessa scelta: struttura al suo posto, sandbox, nessun account. Chi chiede PayPal riceve un no chiaro.
Non è una raccomandazione nei commenti: è un cancello che solleva, e non ha ripieghi.
LIVE PAYMENT PROVIDER BLOCKED. This installation is TEST ONLY.
Il quadro esatto, perché una piattaforma di pagamenti si valuta da quello che dichiara di non avere ancora.
| Pezzo | Stato | Nota |
|---|---|---|
| Multi-tenant e isolamento | pronto | Tre clienti dimostrativi, verifica server-side su ogni rotta, prove automatiche. |
| Rotazione a volume Redsys | pronto | Soglia per cliente o per conto, cycle/stop, salto dei conti fermi, storico completo. |
| Routing e fallback | pronto | Regole per metodo e priorità; fallback fra provider solo su whitelist del cliente. |
| Console e simulatore | pronto | Nove schermate; il simulatore passa dallo stesso router del checkout. |
| Stripe e PayPal | adapter, non collegati | Interfaccia completa in sandbox. Restano tre chiamate reali per ciascuno. |
| Archivio | file JSON | Repository già astratti e campi in snake_case: il passaggio a PostgreSQL non tocca le firme. |
| Fatturazione SaaS | non iniziata | Il modulo è separato di proposito: gli incassi dei clienti e l'abbonamento non condividono codice. |
Console su localhost:3001/admin, tre clienti pronti, simulatore incluso. Nessuna carta, nessun addebito.