Tutti gli articoli
Playbook8 min di lettura

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.

Un iPhone e un telefono Android sotto una lente di ingrandimento su una scrivania scura, a rappresentare il test dei rimborsi degli acquisti in-app prima che siano reali

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.

AmbienteCosa può attivareCosa dimostraCosa non può fare
Test StoreKit di XcodeUn rimborso tramite il Transaction Manager o il foglio beginRefundRequestLa tua app reagisce a un rimborso localmente, in pochi secondiNon contatta mai Apple, quindi non viene inviata alcuna notifica al server
SandboxREFUND e CONSUMPTION_REQUEST reali al tuo server, più una notifica TEST su richiestaIl tuo backend riceve, verifica e agisce sul payload firmatoNon ritenta una notifica che il tuo endpoint non riesce a ricevere
ProduzioneOgni rimborso, con denaro realeNiente che tu voglia imparare qui per primoNon 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 TEST arriva 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 revocationDate viene impostato.
  • Accedi con un tester sandbox, acquista un consumabile, richiedi un rimborso e conferma che il tuo server riceve il CONSUMPTION_REQUEST e 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 REFUND raggiunge 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.
Uno smartphone tenuto in una piccola morsa da banco sotto una lampada da lavoro con delle pinzette accanto, un dispositivo sotto test a rappresentare la prova di un rimborso prima che sia reale

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 testCosa simulaPerché lo useresti
Test instrument, always approvesUn acquisto pulito e riuscitoPreparare un ordine che poi puoi rimborsare o revocare
Test instrument, always declinesUn pagamento fallitoConfermare che non concedi nulla in caso di rifiuto
Slow test card, approves after a few minutesUn acquisto in sospeso che poi riesceMettere alla prova la tua gestione di PENDING prima di concedere l'accesso
Slow test card, declines after a few minutesUn acquisto in sospeso che poi fallisceConfermare che un rifiuto in sospeso non lascia mai trapelare il diritto
Test card, approves then charges backUn chargeback avviato dall'utenteAttivare 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 PendingRefundReviewNotification arriva sul tuo topic Real-time Developer Notifications pochi istanti dopo. Rispondile con una singola chiamata orders.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 testatoCome fallisce in produzioneCosa ti costa
Gestore REFUNDUn utente rimborsato mantiene l'accessoIl calcolo, le chiamate API, l'archiviazione e i pagamenti che continui a spendere per lui
Risposta CONSUMPTION_REQUESTMalformata, o inviata dopo 12 oreApple concede il rimborso per impostazione predefinita, quindi perdi la vendita e la spesa
Risposta orders.reviewrefundMancata o errata entro 24 oreDal 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 TEST e la verifica contro i certificati di Apple.
  • Un REFUND sandbox revoca l'accesso o deduce il saldo, e una consegna ripetuta non conta due volte.
  • Un CONSUMPTION_REQUEST sandbox produce una risposta Send Consumption Information valida ben entro le 12 ore.
  • Una PendingRefundReviewNotification di Google dalla carta di test di chargeback produce esattamente una chiamata orders.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

RefundHalt

Il pilota automatico dei rimborsi per App Store e Google Play

Continua a leggere

La prossima richiesta di rimborso è già in arrivo.

Configura RefundHalt nel tempo che impiegheresti a leggere un'altra e-mail dell'assistenza su un rimborso che non sei riuscito a contestare.