La gestione dei rimborsi si rompe in modi silenziosi, quindi testa i rimborsi degli acquisti in-app nel sandbox prima che lo faccia un cliente reale
La tua gestione dei rimborsi viene eseguita solo dopo che il cliente se n'è già andato, quindi un bug al suo interno resta invisibile finché non costa denaro reale. Entrambi gli store ti permettono di attivare prima un rimborso in un ambiente di test. Ecco come testare i rimborsi degli acquisti in-app sull'App Store e su Google Play prima che uno sia reale.

Punti chiave
- Il test StoreKit di Xcode ti permette di rimborsare un acquisto localmente cliccando sulla freccia di rimborso nel Transaction Manager, il che attiva il listener Transaction.updates della tua app, ma non contatta mai Apple, quindi non viene inviata alcuna App Store Server Notification.
- Per testare il lato server su Apple, punta un URL App Store Server Notifications V2 di sandbox verso il tuo backend: un rimborso nel sandbox consegna allora un REFUND reale, e una richiesta di rimborso consegna un CONSUMPTION_REQUEST, al tuo server.
- L'endpoint Request a Test Notification di Apple invia una notifica di tipo TEST all'URL che hai configurato e restituisce un testNotificationToken, così puoi confermare che il tuo webhook è raggiungibile prima che si attivi qualsiasi evento reale.
- Il sandbox di Apple non ritenta mai una notifica fallita, quindi un webhook che è fuori uso quando il sandbox si attiva perde l'evento senza un secondo tentativo, la stessa categoria di errore che più tardi ti costa una vera finestra di rimborso.
- Google Play offre ai license tester un metodo di pagamento chiamato Test card, approves then charges back, che attiva una PendingRefundReviewNotification pochi istanti dopo l'acquisto così da poter provare la tua risposta orders.reviewrefund di 24 ore.
- Per un license tester su Google Play, un acquisto non confermato viene rimborsato automaticamente dopo 3 minuti invece dei 3 giorni che attende la produzione, quindi un percorso di conferma rotto fallisce in fretta e in modo evidente durante i test.
- Un gestore di rimborsi che non hai mai testato è quello che mantiene attivo l'accesso a pagamento di un cliente rimborsato, e dal 3 agosto 2026 una risposta a un chargeback di Google Play non testata può costarti il prezzo dell'acquisto meno la commissione di servizio di Play più la commissione della banca.
La tua gestione dei rimborsi è l'unico percorso di codice che viene eseguito solo dopo che il cliente se n'è già andato. Niente nel tuo QA normale lo tocca, perché per raggiungerlo devi farti davvero rimborsare. Così va in produzione senza test, resta in silenzio per mesi e poi fallisce su un rimborso reale, dove il fallimento costa denaro invece di un test in rosso. La soluzione è smettere di trattare un rimborso come qualcosa che ti capita e iniziare ad attivarne uno di proposito. Sia Apple sia Google ti permettono di attivare un rimborso in un ambiente di test e osservare il tuo server reagire. Ecco come testare i rimborsi degli acquisti in-app sull'App Store e su Google Play prima che un cliente pagante dimostri che il tuo gestore era rotto.
I tre ambienti in cui un rimborso può attivarsi, e solo uno è la produzione
Ci sono tre luoghi distinti in cui un rimborso Apple o Google può essere attivato mentre sviluppi, e non sono intercambiabili. Due di essi sono tuoi, da attivare su richiesta. Il terzo è la produzione, dove non vuoi mai incontrare un bug di rimborso per la prima volta. La trappola è supporre che quello facile, il test locale in Xcode, dimostri tutta la tua pipeline. Dimostra la tua app. Non dice nulla sul tuo server.
Il test StoreKit di Xcode è locale, quindi mette alla prova la tua app e nient'altro
Il test StoreKit integrato di Xcode viene eseguito contro un file di configurazione sul tuo Mac, senza andata e ritorno verso Apple. Apri lo StoreKit Transaction Manager dalla barra di debug, seleziona una transazione acquistata e clicca sulla freccia curva di rimborso. La transazione passa a rimborsata e il listener Transaction.updates della tua app si attiva, esattamente come farebbe nella realtà. Puoi anche chiamare beginRefundRequest per presentare il vero foglio di rimborso, e nell'ambiente Xcode il problema che scegli corrisponde uno a uno a un RevocationReason, con il rimborso applicato immediatamente. Questo è il modo più veloce per dimostrare che il tuo client taglia l'accesso nel momento in cui revocationDate smette di essere nullo. È anche tutto ciò che il test locale può dirti, perché niente qui raggiunge mai i server di Apple, quindi non viene inviata alcuna App Store Server Notification. Il tuo backend non viene a sapere nulla.
Il sandbox è dove il tuo server finalmente sente parlare di un rimborso
Per testare la metà della tua integrazione che decide il denaro, il tuo server, ti serve il sandbox di Apple. Configura un URL App Store Server Notifications V2 di sandbox in App Store Connect, accedi con un tester sandbox su un dispositivo e acquista. Ora un rimborso nel sandbox consegna una vera notifica REFUND al tuo backend, e una richiesta di rimborso su un consumabile o su un rinnovabile automaticamente consegna un CONSUMPTION_REQUEST, lo stesso payload firmato che riceverà il tuo server di produzione. Prima di attivare qualsiasi cosa, chiama l'endpoint Request a Test Notification. Dice al server dell'App Store di inviare una notifica di tipo TEST all'URL che hai configurato e ti consegna un testNotificationToken, che passi a Get Test Notification Status per confermare la consegna. Se quell'andata e ritorno non funziona, non funzionerà nemmeno alcuna notifica reale.
| Ambiente | Cosa può attivare | Cosa dimostra | Cosa non può fare |
|---|---|---|---|
| Test StoreKit di Xcode | Un rimborso tramite il Transaction Manager o il foglio beginRefundRequest | La tua app reagisce a un rimborso localmente, in pochi secondi | Non contatta mai Apple, quindi non viene inviata alcuna notifica al server |
| Sandbox | REFUND e CONSUMPTION_REQUEST reali al tuo server, più una notifica TEST su richiesta | Il tuo backend riceve, verifica e agisce sul payload firmato | Non ritenta una notifica che il tuo endpoint non riesce a ricevere |
| Produzione | Ogni rimborso, con denaro reale | Niente che tu voglia imparare qui per primo | Non puoi annullare il costo di un bug |
Come testare i rimborsi degli acquisti in-app sull'App Store
Eseguilo in questo ordine, dal controllo economico del client all'andata e ritorno completa del server. Ogni passaggio mette alla prova un pezzo diverso, e quelli successivi sono quelli che la produzione ti addebita davvero.
- Crea una chiave In-App Purchase in Users and Access, Integrations, In-App Purchase in App Store Connect, e usala per firmare le tue chiamate all'App Store Server API.
- Punta il tuo URL App Store Server Notifications V2 di sandbox verso il tuo backend, poi chiama Request a Test Notification e conferma che il payload
TESTarriva e si verifica contro la catena di certificati di Apple. - Nel Transaction Manager di Xcode, rimborsa un acquisto e conferma che la tua app rimuove il diritto nell'istante in cui
revocationDateviene impostato. - Accedi con un tester sandbox, acquista un consumabile, richiedi un rimborso e conferma che il tuo server riceve il
CONSUMPTION_REQUESTe riesce ad assemblare e inviare una risposta Send Consumption Information ben entro la finestra di 12 ore. - Rimborsa un acquisto sandbox e conferma che la notifica
REFUNDraggiunge il tuo server, che revochi l'accesso o deduci il saldo del consumabile, e che una consegna ripetuta della stessa notifica non venga applicata due volte.

Come provare un rimborso e un chargeback su Google Play
Google Play non ha una modalità locale come quella di Xcode. Tutto viene eseguito contro i server di Google, ma i license tester lo mantengono gratuito e sicuro. Aggiungi i tuoi account Google di test come license tester in Play Console e ottengono un insieme di metodi di pagamento di test che non addebitano mai denaro reale. Google contrassegna ogni acquisto di test con un avviso al centro della finestra di dialogo di acquisto, e le tasse non vengono calcolate. Ciò che conta per testare i rimborsi è quale strumento di test scegli, perché ognuno porta a un risultato diverso.
| Metodo di pagamento di test | Cosa simula | Perché lo useresti |
|---|---|---|
| Test instrument, always approves | Un acquisto pulito e riuscito | Preparare un ordine che poi puoi rimborsare o revocare |
| Test instrument, always declines | Un pagamento fallito | Confermare che non concedi nulla in caso di rifiuto |
| Slow test card, approves after a few minutes | Un acquisto in sospeso che poi riesce | Mettere alla prova la tua gestione di PENDING prima di concedere l'accesso |
| Slow test card, declines after a few minutes | Un acquisto in sospeso che poi fallisce | Confermare che un rifiuto in sospeso non lascia mai trapelare il diritto |
| Test card, approves then charges back | Un chargeback avviato dall'utente | Attivare una PendingRefundReviewNotification e provare la tua risposta di 24 ore |
Attiva un rimborso, un chargeback e il rimborso automatico per mancata conferma
- Acquista con la carta di test approve-then-charge-back, e una
PendingRefundReviewNotificationarriva sul tuo topic Real-time Developer Notifications pochi istanti dopo. Rispondile con una singola chiamataorders.reviewrefund, perché Google conserva solo la tua prima risposta. - Rimborsa e revoca un ordine di test dalla scheda Orders in Play Console per attivare una
VoidedPurchaseNotification, e conferma che il tuo server rimuove il diritto. - Lascia di proposito non confermato l'acquisto di un license tester. Google lo rimborsa automaticamente dopo 3 minuti invece dei 3 giorni che la produzione consente, e ti invia via email la cancellazione, quindi un percorso di conferma rotto compare in pochi minuti, non al quarto giorno in produzione.
Quanto costa davvero un percorso di rimborso non testato
Un gestore di rimborsi non è decorazione. È il codice che ti evita di pagare per servire qualcuno che non ti paga più. Quando fallisce in silenzio, il rimborso avviene comunque, ma l'accesso, il saldo e la spesa dietro di essi non si fermano.
Segui il denaro. Quando Apple o Google rimborsa un acquisto, tu restituisci il prezzo di vendita e lo store restituisce la sua commissione, fin qui il conto è pari. Ciò che non torna è tutto quello che hai già speso per consegnare il prodotto: il calcolo dietro un risultato generato, le chiamate all'API del modello, l'archiviazione di ciò che l'utente ha salvato, il pagamento che hai già inviato a un creatore. Un gestore di rimborsi che non revoca mai l'accesso lascia che un utente rimborsato continui a spendere tutto ciò a carico del tuo budget, senza niente nel sistema che lo fermi.
Le due finestre di prova rendono la cosa più netta. Un CONSUMPTION_REQUEST che non hai mai messo alla prova nel sandbox è una risposta che invii malformata o in ritardo, e Apple spesso concede il rimborso per impostazione predefinita quando la tua risposta non arriva entro 12 ore. Una risposta a un chargeback di Google Play che non hai mai attivato con la carta di test è una finestra di 24 ore che sbagli dal vivo, e dal 3 agosto 2026 un chargeback perso su Play ti costa il prezzo dell'acquisto meno la commissione di servizio di Play più la commissione di chargeback della banca. Ognuno di questi fallimenti è riproducibile gratis in un ambiente di test per primo. Nessuno è economico in produzione.
| Percorso non testato | Come fallisce in produzione | Cosa ti costa |
|---|---|---|
| Gestore REFUND | Un utente rimborsato mantiene l'accesso | Il calcolo, le chiamate API, l'archiviazione e i pagamenti che continui a spendere per lui |
| Risposta CONSUMPTION_REQUEST | Malformata, o inviata dopo 12 ore | Apple concede il rimborso per impostazione predefinita, quindi perdi la vendita e la spesa |
| Risposta orders.reviewrefund | Mancata o errata entro 24 ore | Dal 3 agosto 2026, il prezzo dell'acquisto meno la commissione di servizio di Play, più la commissione di chargeback della banca |
Una breve checklist prima di rilasciare la gestione dei rimborsi
Non ti serve un laboratorio. Ti serve aver visto ogni evento raggiungere il tuo codice una volta.
- La tua app rimuove l'accesso nel momento in cui una transazione StoreKit mostra un
revocationDate, confermato nel Transaction Manager di Xcode. - L'URL del tuo server sandbox riceve una notifica
TESTe la verifica contro i certificati di Apple. - Un
REFUNDsandbox revoca l'accesso o deduce il saldo, e una consegna ripetuta non conta due volte. - Un
CONSUMPTION_REQUESTsandbox produce una risposta Send Consumption Information valida ben entro le 12 ore. - Una
PendingRefundReviewNotificationdi Google dalla carta di test di chargeback produce esattamente una chiamataorders.reviewrefund. - Un acquisto di test di Google Play non confermato viene rimborsato automaticamente in 3 minuti e la tua riconciliazione se ne accorge.
Esegui quella lista una volta e la gestione dei rimborsi smette di essere il codice che speri funzioni. Diventa il codice che hai visto funzionare.
Domande frequenti
- Posso testare un rimborso dell'App Store senza un acquisto reale?
- Sì. Il test StoreKit di Xcode ti permette di rimborsare un acquisto localmente tramite il Transaction Manager, senza denaro reale e senza un account App Store, il che attiva il listener Transaction.updates della tua app. Non invia una notifica al server, quindi testa solo la tua app, non il tuo backend.
- Il test StoreKit locale invia App Store Server Notifications?
- No. Il test StoreKit di Xcode viene eseguito interamente sul tuo Mac contro una configurazione locale e non contatta mai i server di Apple, quindi non viene mai inviata alcuna App Store Server Notification, inclusa REFUND o CONSUMPTION_REQUEST. Usa il sandbox per testare il tuo server.
- Come testo una risposta a un chargeback di Google Play?
- Usa il metodo di pagamento di license tester chiamato Test card, approves then charges back. Attiva una PendingRefundReviewNotification pochi istanti dopo l'acquisto, la stessa notifica che invia un vero chargeback bancario, così puoi provare la tua risposta orders.reviewrefund di 24 ore.
- Perché il mio acquisto di test di Google Play viene rimborsato dopo pochi minuti?
- Per i license tester, Google rimborsa automaticamente un acquisto dopo 3 minuti se la tua app non lo ha confermato, e ti invia via email la cancellazione. La produzione attende 3 giorni, ma i tester ottengono la versione accelerata così che un percorso di conferma rotto emerga in fretta.
- Il sandbox di Apple ritenta una notifica di rimborso fallita?
- No. Il sandbox non ritenta le App Store Server Notifications, quindi se il tuo endpoint è fuori uso quando si attiva un rimborso sandbox, la notifica viene persa senza un secondo tentativo. Conferma prima che il tuo URL sia raggiungibile con Request a Test Notification.
Fonti e approfondimenti
- Apple Developer: Testing refund requests
- Apple Developer: Testing App Store server notifications
- Apple Developer: Request a Test Notification (App Store Server API)
- Apple Developer: Testing In-App Purchases with the sandbox
- Android Developers: Test your Google Play Billing Library integration
- Android Developers: Help Google dispute chargebacks (orders.reviewrefund)
- Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
Il pilota automatico dei rimborsi per App Store e Google Play
Continua a leggere
Ciò che un rimborso costa alla tua app è più del prezzo che restituisci
Il prezzo rimborsato è la voce più piccola del conto. Un rimborso annulla anche la commissione dello store, quindi perdi la tua quota, e il calcolo, le chiamate API, lo storage e i pagamenti già spesi sono persi. Un chargeback su Google Play dopo il 3 agosto 2026 aggiunge sopra la commissione della banca. Ecco il conto completo.
I rimborsi degli abbonamenti non funzionano come i rimborsi una tantum, e lo store su cui ti trovi decide quanta voce in capitolo hai
Un rimborso di abbonamento annulla un intero periodo di fatturazione, non una singola vendita. Sull'App Store, Apple decide e il tuo server viene solo a sapere l'esito. Su Google Play scegli tu stesso un rimborso completo o proporzionale. Ecco come ogni store gestisce i rimborsi degli abbonamenti, e quanto te ne costa uno.