2015-12-03 11 views
15

Abbiamo riscontrato problemi nel flusso di convalida della ricevuta in iOS.Informazioni sulla convalida della ricevuta e sull'aggiornamento della ricevuta in iOS

Ecco quello che attualmente facciamo (in fase di sviluppo):

In applicationDidFinishLaunching e in applicationWillEnterForeground convalidiamo la ricevuta sul lato server, se non v'è alcuna ricevuta o la ricevuta non è valido, cerchiamo di aggiornare la ricevuta e riconvalidarlo.

Qui sono alcuni problemi/domande:

  1. Quali sono i casi in cui v'è nessuna ricevuta disponibili sul dispositivo?

  2. Dovremmo sempre inviare una richiesta di aggiornamento ricevuta quando non c'è ricevuta?

  3. Perché all'avvio viene visualizzata questa finestra di avviso? Capisco che questo è mostrato su una richiesta di aggiornamento della ricevuta?

Sign in required?

  1. Quando dovrebbe accadere una verifica della ricevuta? Attualmente lo facciamo ogni volta che viene effettuato un acquisto per verificare l'acquisto, è questo l'uso corretto?

risposta

8
  1. Nella produzione di una ricevuta è sempre disponibile sul dispositivo. In prova dopo la prima installazione non c'è. Quindi, se si desidera eseguire un test corretto, è necessario ripristinare un acquisto anche se non esiste un acquisto su quell'utente nell'ambiente di prova . Perché? L'app scaricata dall'appstore viene sempre consegnata con una ricevuta anche se gratuita.
  2. Dipende dalla logica aziendale che si desidera applicare. Se stai convalidando la ricevuta contro un server ogni volta che usi l'app, ovviamente hai bisogno della ricevuta. Se non è presente (ma in produzione è sempre) o non è valido, puoi chiedere un aggiornamento o un ripristino, ma per quanto mi ricordo dovresti chiedere sempre all'utente se lo desidera (può essere un motivo di rifiuto). Restore and Refresh non sono la stessa cosa.
  3. Questo di solito appare in acquisto/ripristino/aggiornamento. Ma anche se l'account ha alcune richieste in sospeso perché l'app si è arrestata in modo anomalo o hai interrotto il debug prima che la richiesta finisse in qualche modo, ti annoieresti molto. Non c'è modo di svuotarli a livello di codice, basta accedere fino a quando non si fermano. Ovviamente non sarà un test valido.
  4. Spetta a te e al tipo di acquisto. Se si tratta di una sottoscrizione autorenewable, è possibile convalidare la ricevuta su un server, quindi archiviare la "data di fine" sul client e effettuare un altro controllo dopo che la data è scaduta. Presta attenzione che le ricevute possono essere abbastanza grandi, perché hanno anche tutti i valori storici.
+1

Penso che sia una risposta piuttosto solida, grazie. Quindi, se non siamo così severi da verificare la ricevuta all'avvio, dopo ogni acquisto sarebbe un buon punto per farlo? Inoltre, non vogliamo imbattersi nel punto 2) che hai menzionato. Quindi il flusso sarebbe: 1) L'abbonamento per l'acquisto degli utenti. 2) Verifica ricevuta 3) Verifica riuscita: pianificare una notifica locale per la data di scadenza (è un metodo sicuro?). 4) Notifica di scadenza ricevuta infornata -> Ripristina o blocca funzionalità premium. Sembra un buon modo per gestirlo? –

+1

Dipendo davvero dal tipo di acquisto. Se non è un abbonamento una convalida subito dopo l'acquisto sembra ok per me. Se si tratta di un abbonamento è necessario conoscere la fine di esso, quindi il flusso si è presentato la sua multa, tranne per la notifica locale. Supponiamo che tu stia acquistando un abbonamento mensile auto rinnovabile, ogni mese se l'utente non interrompe il meccanismo di rinnovo automatico, l'abbonamento si rinnova automaticamente. Ho cercato di capire quando questo accade senza successo, probabilmente pochi giorni prima della data di scadenza reale. – Andrea

+0

Automaticamente significa che non è necessario fare nulla. Salvo localmente (portachiavi) il giorno della scadenza, quando sono intorno a quella data invierei di nuovo la ricevuta per la convalida, fino a quando non è scaduta o aggiornata. Se la convalida vede un nuovo mese, aggiorno la data, se la ricevuta è scaduta, vorrei presentare un avviso come "il tuo abbonamento sembra essere scaduto $ fine data $ vorresti provare un aggiornamento"? È possibile inviare la ricevuta al server di convalida tutte le volte che si desidera senza chiedere all'utente, ma non è possibile aggiornare o ripristinare senza chiedere all'utente. – Andrea

0

1.Nessun acquisto/ripristino ha avuto luogo.
2.Nope.See 1
4. Sicuro. Per i materiali di consumo, ricordarsi di salvare l'hash sul server, al fine di sconfiggere l'attacco di riproduzione.

+0

Non capisco davvero qui. La ricevuta di validazione è per verificare che questa sia una transazione valida o no, giusto? Quindi, dopo che lo stato della transazione è '.Purchased', invito a convalidare la ricevuta per verificare l'ordine. E se la ricevuta non è valida, indica che la transazione è una frode, giusto? – TomSawyer

+0

@ TomSawyer Sì. –

2
  1. Come detto Zhang, se non v'è nessun acquisto o di ripristino ha avuto luogo, non ci sarà nessuna ricevuta nel negozio
  2. Individuare la ricevuta. Se non viene trovata una ricevuta, la convalida non riesce e non è necessario richiedere nuovamente l'aggiornamento della ricevuta. Solo quando ripristinerai il processo da solo, dovresti richiedere nuovamente la ricevuta.
  3. Questo verrà mostrato sempre quando tenterai di aggiornare la ricevuta (o sceglierai dalle impostazioni che non vuoi chiedere una password per 15 minuti).
  4. Sì.

Per ulteriori informazioni, guardate qui: https://www.objc.io/issues/17-security/receipt-validation/#about-validation

Problemi correlati