Alle artikelen
Deep dive7 min leestijd

Er is één endpoint dat de volledige App Store refund history van een klant teruggeeft, en dit is wat het oplevert

Het Get Refund History endpoint van Apple geeft de volledige App Store refund history van een klant terug als ondertekende transacties. Hier vindt u elk veld, hoe het revision-token pagineert, waarom het per klant is en niet per app, en wat een gemiste refund u kost.

Een bureauscène van bovenaf met een smartphone, een papieren grootboek met transacties en een vergrootglas, die het ophalen van de App Store refund history van een klant via Apples Get Refund History endpoint verbeeldt

Belangrijkste inzichten

  • Get Refund History is een App Store Server API endpoint dat de terugbetaalde in-app-aankopen van een klant voor uw app teruggeeft als een lijst met ondertekende transacties, zodat u refunds kunt afstemmen en toegang kunt intrekken, zelfs als een melding u nooit bereikte.
  • U roept GET /inApps/v2/refund/lookup/{transactionId} aan met een willekeurige transactie-id voor die klant, en Apple geeft diens refunds terug over elk aankooptype in uw app, niet alleen degene waar u naar vroeg.
  • Het antwoord heeft drie velden: signedTransactions, tot 20 JWS-transacties per pagina, gesorteerd op oudste refund eerst, plus een revision-token en een hasMore-boolean voor paginering.
  • Bewaar het laatste revision-token. Geef het de volgende keer terug en Apple levert alleen refunds die nieuwer zijn dan dat punt, waardoor een volledige history-dump bij elke run verandert in een korte lijst met nieuwe regels.
  • Elke gedecodeerde transactie draagt revocationDate en revocationReason. Een revocationReason van 1 betekent dat de klant terugbetaald kreeg wegens een werkelijk of ervaren probleem in uw app, en 0 betekent een andere reden zoals een onbedoelde aankoop.
  • Het endpoint is per klant, niet per app. Er is geen enkele aanroep die elke refund over uw hele app opsomt, dus u stemt per account af vanaf een transactie-id, of u leest uw REFUND-meldingenstroom voor het app-brede overzicht.
  • De reden om het aan te sluiten is geld. Een refund die u nooit opmerkt houdt een account actief, en u blijft betalen voor rekenkracht, model-API-aanroepen, opslag en uitbetalingen voor een klant die de App Store al schadeloos heeft gesteld.

Apple houdt voor elk account van een klant bij uw app een opvraagbaar overzicht bij van elke refund die het heeft verleend, en één aanroep geeft dat terug. Het endpoint heet Get Refund History, onderdeel van de App Store Server API, en het levert u de volledige App Store refund history van die klant als een lijst met ondertekende transacties. U geeft een transactie-id door, u krijgt terug wat Apple heeft terugbetaald, en u stemt het af tegen wat u nog aan hebt staan.

Dit is waarom het de moeite waard is. Een refund die u nooit ziet, is een refund waar u voor blijft betalen. Het geld is al weg, maar het account blijft actief, en elk uur dat dit zo is blijft u uitgeven aan rekenkracht, model-API-aanroepen, opslag en elke uitbetaling die aan die klant is gekoppeld. Uw refund-meldingen zijn bedoeld om dit te vangen op het moment dat het gebeurt. Get Refund History is het vangnet voor wanneer ze dat niet doen, na een storing, een deploy die een webhook liet vallen, of een supportzaak waarbij u het hele beeld in één aanroep nodig hebt.

Wat het App Store refund history endpoint teruggeeft

U roept GET /inApps/v2/refund/lookup/{transactionId} aan tegen de App Store Server API, ondertekend met dezelfde JWT die u voor elke andere aanroep gebruikt. De transactie-id in het pad kan elke transactie van de klant zijn. Apple leest het als een identiteit, niet als een filter, en geeft de terugbetaalde aankopen van die klant over uw hele app terug: verbruiksartikelen, niet-verbruiksartikelen, automatisch verlengende en niet-verlengende abonnementen gelijk. De oudere V1 van dit endpoint gaf tot 50 refunds in één antwoord terug en is verouderd. De huidige versie pagineert, zodat u klanten met een lange geschiedenis afhandelt zonder een reusachtige payload.

Het antwoord bestaat uit drie velden

VeldWat het bevat
signedTransactionsTot 20 terugbetaalde transacties voor deze klant, elk een ondertekende JWS die u verifieert en decodeert. Gesorteerd op oudste refund eerst, op revocationDate. Een lege array betekent dat de klant geen refunds in uw app heeft
revisionEen paginerings-token. Geef het terug om de volgende pagina te krijgen, en bewaar het laatste om de volgende keer alleen nieuwe refunds op te halen
hasMoreTrue wanneer Apple meer terugbetaalde transacties heeft dan deze pagina teruggaf, zodat u opnieuw aanroept met het revision

Wat één terugbetaalde transactie u vertelt

Elke vermelding in signedTransactions is een JWS. Verifieer het tegen Apples certificaatketen, decodeer het, en u hebt een gewone transactie-payload met de refund-velden ingevuld. Dit zijn degene die hier tellen.

VeldWat het u vertelt
transactionIdDe id van de terugbetaalde transactie, uw koppelsleutel terug naar de aankoop die u vastlegde
originalTransactionIdDe id van de eerste aankoop in de keten, hoe u de verlengingen van een abonnement aan elkaar knoopt
productIdHet product dat werd terugbetaald, zodat u de juiste rechten intrekt en niets anders
revocationDateDe UNIX-tijd, in milliseconden, waarop Apple de transactie terugbetaalde
revocationReasonWaarom Apple het terugbetaalde. 1 betekent een werkelijk of ervaren probleem met uw app, 0 betekent een andere reden zoals een onbedoelde aankoop
price, currencyHet bedrag, in milliunits, en de bijbehorende ISO 4217 valutacode, zodat u het teruggegeven geld kunt optellen
appAccountTokenDe UUID die u bij de aankoop hebt meegegeven, de schoonste manier om een refund terug te koppelen aan uw eigen gebruiker

Het revision-token is hoe u stopt met de hele lijst opnieuw te lezen

De naïeve manier om dit endpoint te gebruiken is een klant opzoeken en elke keer elke pagina doorlopen. Dat werkt, en bij een klant met vijftig refunds zijn dat vijftig regels die u al kende plus die ene nieuwe. Het revision-token bestaat om die verspilling te doden. Elk antwoord draagt een revision. Wanneer hasMore true is, geeft u het terug om de volgende pagina te krijgen. Wanneer u het einde bereikt, bewaart u het laatste revision dat u zag.

Wat dit endpoint niet zal doen

Er is één verwachting die u moet laten varen voordat u erop bouwt. Get Refund History is per klant, niet per app. U kunt er niet elke refund aan vragen die uw app afgelopen week opliep. Het beantwoordt één vraag, namelijk welke refunds dit account heeft, en u moet met een transactie-id voor dat account aankomen om die te stellen. Ontwikkelaars lopen voortdurend tegen deze muur op en gaan op zoek naar een app-breed refund-endpoint dat niet bestaat.

Het app-brede overzicht ligt ergens anders. Uw App Store Server Notifications stroom stuurt een REFUND-melding op het moment dat Apple elke refund verleent, en met Get Notification History kunt u die stroom, gefilterd op refund-typen, over een datumbereik opnieuw afspelen. De verdeling is dus helder. Meldingen en hun geschiedenis geven u de app-brede stroom. Get Refund History geeft u de gezaghebbende lijst van één account, op aanvraag, wat is wat u wilt aan een supportbalie of na een storing.

Een vergrootglas dat boven één gemarkeerde regel van een papieren transactiegrootboek zweeft naast een smartphone, die het opzoeken van de refunds van één klant in de App Store refund history verbeeldt

Wat een gemiste refund u in geld kost

Het endpoint is leidingwerk. De rekening is de reden dat u de pijp legt. Elke refund in die lijst is geld dat al is teruggegeven, en de enige variabele die nog in uw controle ligt is hoe lang u blijft uitgeven aan een account dat niet meer betaalt.

U blijft betalen om een terugbetaald account te bedienen

De aankoopprijs is weg op het moment dat Apple de refund verleent. Wat blijft draaien zijn de kosten van levering. Voor een app die per gebruiker echt werk doet, is dat rekenkracht, model-API-aanroepen, opslag en elke creator- of partneruitbetaling die aan hun gebruik is gekoppeld. Een terugbetaalde klant wiens toegang u nooit hebt afgesneden, is een abonnement dat u uit eigen zak financiert. Afstemmen tegen Get Refund History en intrekken op wat u vindt, is hoe u die meter uitzet wanneer een melding erdoorheen glipte.

Een refund-reden van 1 is een vermomd defectrapport

revocationReason kost u dubbel als u het negeert. De eerste kost is de refund zelf. De tweede is elke toekomstige refund uit dezelfde oorzaak. Wanneer een product steeds terugkomt met revocationReason 1, een werkelijk of ervaren probleem in uw app, reikt Apple u een gelabeld staaltje aan van wat klanten hun geld terug doet vragen. Zet het uit per product en u kunt het lek dichten in plaats van het één refund tegelijk uit te betalen.

Het laat vangen is nog altijd beter dan het niet vangen

Een chargeback is definitief bij de bank en draagt in de andere store inmiddels een vergoeding die de ontwikkelaar slikt. Een App Store refund is dat niet. Hij is afgehandeld, maar de rechten zijn van u om in te trekken op het moment dat u het weet. Zelfs een refund die u dagen te laat via dit endpoint vindt, is dus de moeite waard om te vinden. U kunt het geld niet terughalen, maar u kunt de uitgave stoppen die er nog achter liep.

Hoe dit past bij meldingen, en bij Google

Zie de onderdelen als één systeem. De REFUND-melding is het live signaal, naar uw server geduwd terwijl Apple beslist. Get Refund History is de pull-gebaseerde bron van waarheid voor één klant, de aanroep die u doet wanneer de push mislukte of wanneer een mens het volledige account voor zich nodig heeft. Aan de Google Play kant is de vorm hetzelfde idee met andere namen: een VoidedPurchaseNotification wordt in realtime geduwd, en de Voided Purchases API is de lijst die u trekt. Beide stores geven u een stroom en een grootboek. De fout is alleen de stroom vertrouwen, want stromen vallen weg.

Het aansluiten op de RefundHalt manier

De lus is klein zodra elk onderdeel op zijn plaats staat. Neem een REFUND-melding als de trigger. Stem af tegen Get Refund History zodat een weggevallen webhook nooit een terugbetaald account actief laat. Decodeer elke transactie, koppel het op appAccountToken of transactionId terug aan uw gebruiker, lees revocationReason zodat een defect-refund wordt gemarkeerd en niet alleen weggeborgen, en trek de exacte rechten in in plaats van het hele account. Pagineer met het revision-token zodat u nieuwe refunds leest, niet oude.

Dit is het deel dat RefundHalt voor u draait. Het luistert naar de refund-meldingen, valt terug op Get Refund History wanneer het de gezaghebbende lijst nodig heeft, verifieert elke ondertekende transactie, trekt de precieze aankoop in en bewaart het revision zodat elke doorloop alleen leest wat veranderd is. U krijgt de toegang binnen seconden afgesneden en een schoon overzicht van wie werd terugbetaald, waarvoor en waarom, zonder de polling en de JWS-verificatie zelf op te zetten.

Veelgestelde vragen

Hoe zie ik elke refund over mijn hele app, niet alleen één klant?
Dat kan niet met Get Refund History, want het is per klant en heeft een transactie-id nodig voor het account waar u naar vraagt. Voor het app-brede overzicht gebruikt u uw App Store Server Notifications stroom, die een REFUND-melding stuurt voor elke refund zodra Apple die verleent, en Get Notification History om die stroom, gefilterd op refund-typen, over een datumbereik opnieuw af te spelen.
Hoeveel refunds geeft het Get Refund History endpoint terug?
De huidige versie geeft tot 20 terugbetaalde transacties per pagina terug, gesorteerd met de oudste refund eerst, en pagineert door de rest met een revision-token wanneer hasMore true is. Het verouderde V1 endpoint gaf tot 50 in één antwoord terug. Er is geen limiet op het totaal, dus een klant met een lange geschiedenis beslaat simpelweg meer pagina's.
Waar is het revision-token voor?
Het is hoe u pagineert en hoe u vermijdt om de hele geschiedenis van een klant elke keer opnieuw te lezen. Elk antwoord bevat een revision. U geeft het terug om de volgende pagina op te halen, en u bewaart het laatste zodat uw volgende opzoeking alleen refunds teruggeeft die nieuwer zijn dan dat punt. Dat houdt een geplande afstemming op een korte lijst met nieuwe regels.
Wat betekent revocationReason in een terugbetaalde transactie?
Het is waarom Apple de transactie terugbetaalde. Een waarde van 1 betekent dat de klant terugbetaald kreeg wegens een werkelijk of ervaren probleem binnen uw app, en 0 betekent een andere reden, zoals een onbedoelde aankoop. revocationDate vertelt u wanneer de refund plaatsvond, in UNIX-milliseconden. Het lezen van revocationReason laat u een productdefect scheiden van een eenmalige spijt-refund.
Heb ik dit nog nodig als ik al REFUND-meldingen verwerk?
Ja, als vangnet. Meldingen zijn het live signaal, maar een push kan mislukken tijdens een storing, een slechte deploy of een webhook-wijziging, en een gemiste refund laat een terugbetaald account actief en kost u geld. Get Refund History is de pull-gebaseerde bron van waarheid waartegen u afstemt zodat niets aan blijft staan dat Apple al heeft terugbetaald.

Bronnen en verder lezen

RefundHalt

De terugbetalingsautopiloot voor de App Store en Google Play

Lees verder

Het volgende terugbetalingsverzoek is al onderweg.

Stel RefundHalt in binnen de tijd die het kost om nog een supportmail te lezen over een terugbetaling die je niet kon betwisten.