io in un caso simile al tuo (gestione di abbonamenti con pagamento con carta di credito tramite server non mio e ricezione di valori stile pagato, errore, ...) ho fatto tutto con due tabelle:
- pagamenti
- transazioni

Ad ogni iscrizione che deve esser pagata inserisco una riga in "pagamenti", e poi per ogni tentativo inserisco una riga in "transazioni", così anche se qualcuno prova più volte a pagare (prima sbaglia numero di carta, poi non è valida ed infine paga, ho una traccia di tutto questo: ad ogni pagamento ci posson esser associate più transazioni.

È però vero che se perde la connessione dopo aver pagato e prima di esser rimandato al mio sito non c'è modo di vedere che ha pagato, in questo caso sarà una cosa regolata manualmente dopo che la persona si sarà lamentata della cosa, ma sinceramente penso che non esista metodo infallibile al 100% in questi casi. Attualmente con circa 300'000 pagamenti mai un problema.