Apple Send Consumption Information prosi teraz o pięć pól, a nie dwanaście, i oto każde z nich
Gdy klient prosi Apple o zwrot, ładunek Send Consumption Information jest Twoją odpowiedzią. Apple skróciło go z dwunastu pól do pięciu, trzy wymagane i dwa opcjonalne. Oto każde pole, wartości, które każde przyjmuje, oraz 12-godzinne okno, w którym je wysyłasz.

Najważniejsze wnioski
- Ładunek Apple Send Consumption Information niesie teraz pięć pól, z dwunastu wcześniej. Trzy są wymagane, customerConsented, deliveryStatus i sampleContentProvided, a dwa są opcjonalne, consumptionPercentage i refundPreference.
- customerConsented to twarda bramka. Własne wytyczne Apple mówią, że jeśli klient nie zgodził się na udostępnienie danych o zużyciu, w ogóle nie wysyłasz ładunku.
- deliveryStatus niesie Twój najsilniejszy sygnał. DELIVERED mówi, że zakup zadziałał, a cztery wartości UNDELIVERED informują Apple, że klient nigdy nie otrzymał działającego produktu.
- consumptionPercentage zastąpiło stary czterostopniowy enum consumptionStatus precyzyjną liczbą w milliunits, gdzie 100,000 milliunits oznacza, że element został w pełni zużyty.
- refundPreference to teraz ciąg znaków, a nie liczba. Trzy wartości to DECLINE, GRANT_FULL i GRANT_PRORATED, i wyraża preferencję, a nie decyzję. Apple wciąż rozstrzyga.
- Ładunek wysyłasz metodą PUT do punktu końcowego Send Consumption Information, adresowanego identyfikatorem transakcji, a Apple zwraca 202 Accepted z pustym ciałem. Okno wynosi 12 godzin po CONSUMPTION_REQUEST.
- W przypadku subskrypcji odnawialnych automatycznie Apple samo oblicza zużycie na podstawie upływu czasu, więc consumptionPercentage jest przeznaczone dla zakupów konsumpcyjnych i nieodnawialnych.
Lista faktów, o które Apple Cię prosi, gdy klient chce zwrotu, znacznie się skróciła. Ładunek Send Consumption Information, jedyna odpowiedź, jaką deweloper może wprowadzić do decyzji o zwrocie w App Store, miał wcześniej dwanaście pól. Teraz ma pięć. Apple skróciło go w okolicach WWDC24 i złożyło większość starych pytań o profilowanie konta w dwa proste pytania i jedną liczbę. Mniej pól to nie drobna zmiana. Zmienia to, jakie dowody Apple waży, i zmienia to, w których polach nie możesz sobie pozwolić na błąd.
Oto dlaczego zasługuje to na Twoją uwagę, a nie jest tylko notatką o schemacie. Ten ładunek to jedyny moment w zwrocie Apple, w którym Twoja wersja historii dociera do decyzji. Zwrot za zakup konsumpcyjny cofa przychód, który już wydałeś realne pieniądze, aby dostarczyć, a pięć pól to sposób, w jaki mówisz Apple, że produkt został dostarczony i wykorzystany. Przegap 12-godzinne okno albo wypełnij pole błędnie, a Apple rozstrzygnie wyłącznie na podstawie roszczenia klienta.
Czym jest Send Consumption Information
Send Consumption Information to punkt końcowy App Store Server API, który wywołujesz po tym, jak Apple wyśle na Twój serwer powiadomienie CONSUMPTION_REQUEST. To powiadomienie oznacza, że klient poprosił Apple o zwrot za zakup w aplikacji, a Apple chce Twojego wkładu, zanim zdecyduje. Odpowiadasz, wysyłając małe ciało JSON, ConsumptionRequest, metodą PUT do punktu końcowego. Apple je czyta, waży wobec historii klienta i podejmuje decyzję. Nigdy nie decydujesz o zwrocie. Dostarczasz fakty.
Ciało to cały interfejs. Nie ma osobnego formularza, odwołania ani drugiego zgłoszenia, które się liczy. Cokolwiek wyślesz w tym jednym ładunku, jest Twoją całą sprawą, więc znaczenie każdego pola waży więcej, niż sugeruje liczba pól.
Pięć pól, o które Apple teraz prosi
Bieżący ConsumptionRequest ma pięć członków. Trzy są wymagane, a dwa opcjonalne. Wszystko, o co Apple pytało wcześniej odnośnie konta klienta, jego staż, jego łączne wydatki, jego łączne zwroty, jego czas gry, zostało usunięte z tego, co wysyłasz.
| Pole | Wymagane | Typ | Co niesie |
|---|---|---|---|
| customerConsented | Tak | Boolean | Czy klient zgodził się udostępnić Apple dane o zużyciu |
| deliveryStatus | Tak | String | Czy Twoja aplikacja dostarczyła działający produkt |
| sampleContentProvided | Tak | Boolean | Czy przed zakupem zaoferowałeś darmową próbkę lub wersję próbną |
| consumptionPercentage | Nie | Integer | Ile z zakupu zostało zużyte, w milliunits |
| refundPreference | Nie | String | Twój preferowany wynik dla żądania zwrotu |
customerConsented to bramka
customerConsented to Boolean i jest to pole, które decyduje, czy w ogóle cokolwiek wysyłasz. Rejestruje, czy klient zgodził się, abyś udostępnił Apple dane o zużyciu. Wytyczne Apple są jednoznaczne: jeśli klient nie wyraził zgody, nie wysyłaj informacji o zużyciu. To zatem nie jest pole, które przełączasz na true, aby wzmocnić swoją sprawę. Odzwierciedla realne tak lub nie, które musisz już posiadać, a false tutaj oznacza, że reszta ładunku nie powinna być wysyłana.
deliveryStatus to pole, które porusza zwroty
deliveryStatus to enum typu String i jest to najsilniejsza dźwignia, jaką masz. Mówi Apple, czy Twoja aplikacja faktycznie dostarczyła działający zakup w aplikacji. Jedna wartość mówi tak. Pozostałe cztery mówią nie, każda z innego powodu, i każda mówi Apple, że klient ma uzasadnioną skargę.
| Wartość | Co mówi Apple |
|---|---|
| DELIVERED | Aplikacja dostarczyła działający zakup w aplikacji |
| UNDELIVERED_QUALITY_ISSUE | Zakup nie został dostarczony z powodu problemu z jakością |
| UNDELIVERED_WRONG_ITEM | Klient otrzymał niewłaściwy element |
| UNDELIVERED_SERVER_OUTAGE | Awaria serwera zatrzymała dostarczenie |
| UNDELIVERED_OTHER | Zakup nie został dostarczony z innego powodu |
sampleContentProvided odpowiada na pytanie o uczciwość
sampleContentProvided to Boolean. Rejestruje, czy dałeś klientowi darmową próbkę, wersję próbną lub jasne informacje o tym, co robi zakup, zanim go kupił. True tutaj to mały sygnał uczciwości: klient miał szansę wiedzieć, co kupuje. Samo w sobie niczego nie rozstrzyga, ale jest jednym z zaledwie trzech wymaganych pól, więc Apple wyraźnie chce je mieć w każdej odpowiedzi.
consumptionPercentage to teraz liczba, a nie status
To pole, które zmieniło się najbardziej. Stary ładunek miał consumptionStatus, czterostopniowy enum: UNDECLARED, NOT_CONSUMED, PARTIALLY_CONSUMED, FULLY_CONSUMED. Nowy ładunek zastępuje go przez consumptionPercentage, liczbę całkowitą mierzoną w milliunits. 100,000 milliunits oznacza, że element został w pełni zużyty, więc 50,000 to połowa, a 0 to nietknięty. Precyzyjna liczba bije podział na cztery kubełki, bo pozwala powiedzieć, że klient wykorzystał 90 procent pakietu kredytów, zamiast zaokrąglać w dół do częściowo zużytego.
Jedno zastrzeżenie, na którym ludzie się potykają. W przypadku subskrypcji odnawialnych automatycznie Apple samo ustala zużycie na podstawie upływu czasu, więc consumptionPercentage jest przeznaczone dla zakupów konsumpcyjnych i nieodnawialnych. Wysyłaj je tam, gdzie ma zastosowanie, a tam, gdzie nie ma, pozwól Apple je wyprowadzić.

refundPreference wyraża preferencję, a nie werdykt
refundPreference to opcjonalny ciąg znaków i to tutaj mówisz Apple, jaki wynik byś wolał. Ono również zmieniło formę. Stare pole było liczbą z wartościami takimi jak prefer-grant, prefer-decline i no-preference. Nowe to nazwany ciąg znaków z trzema wartościami.
| Wartość | O co prosisz |
|---|---|
| GRANT_FULL | Wolałbyś, aby Apple przyznało pełny zwrot |
| GRANT_PRORATED | Wolałbyś częściowy zwrot odzwierciedlający to, co wykorzystano |
| DECLINE | Wolałbyś, aby Apple odmówiło zwrotu |
Co Apple porzuciło i dlaczego to ma znaczenie
Stary ConsumptionRequest miał dwanaście pól. Siedem z nich zniknęło z tego, co wysyłasz. accountTenure, lifetimeDollarsPurchased, lifetimeDollarsRefunded, playTime, userStatus, platform i appAccountToken były profilującą konto połową ładunku, polami, które prosiły Cię o zaszufladkowanie klienta według tego, jak długo miał konto, ile wydał, ile mu zwrócono i jak długo używał aplikacji.
Apple wycięło je z powodu wartego odnotowania. Te pola prosiły deweloperów o przekazanie profilu klienta, a większość deweloperów albo zostawiała je niezadeklarowane, albo zgadywała. Pięć, które pozostaje, dotyczy zakupu i dostarczenia, faktów, które faktycznie możesz zweryfikować z własnych systemów. Przesunięcie następuje od tego, kim jest klient, do tego, co stało się z tym konkretnym zakupem.
| Stary ładunek | Bieżący ładunek | |
|---|---|---|
| Pola ogółem | 12 | 5 |
| Pola wymagane | Praktycznie żadne wymuszane | 3 |
| Sygnał zużycia | consumptionStatus, cztery kubełki | consumptionPercentage, dokładne milliunits |
| Preferencja zwrotu | Enum liczbowy | Nazwany ciąg znaków, 3 wartości |
| Profilowanie konta | staż, wydatki całościowe, zwroty, czas gry, status | Usunięte |
Punkt końcowy i zegar
Ładunek wysyłasz metodą HTTP PUT do punktu końcowego Send Consumption Information, adresowanego identyfikatorem transakcji spornego zakupu: PUT /inApps/v1/transactions/consumption/{transactionId}. Sukces zwraca 202 Accepted, a ciało odpowiedzi jest puste. Ta pusta odpowiedź jest oczekiwana, a nie błędem. Potwierdza, że Apple umieściło Twoje dane w kolejce, i nic nie mówi o ostatecznym wyniku, który przychodzi później jako powiadomienie REFUND lub REFUND_DECLINED.
Zegar to część, której nie rozciągniesz. Apple daje Ci 12 godzin od CONSUMPTION_REQUEST na odpowiedź. Używana jest tylko Twoja pierwsza odpowiedź, więc pierwszy ładunek musi być tym kompletnym i poprawnym. Apple może wysłać CONSUMPTION_REQUEST więcej niż raz dla tego samego zakupu, ale termin każdego z nich jest stały, a ręczna weryfikacja rzadko mieści się w 12 godzinach ponad strefami czasowymi i weekendami.
Ile kosztuje Cię źle obsłużone pole
Pieniądze opuściły budynek, zanim zrobił to zwrot
Zwrot za zakup konsumpcyjny nie jest czystym cofnięciem. Zanim klient poprosi o zwrot pieniędzy za pakiet kredytów lub partię generacji AI, już wydałeś na dostarczenie: inferencja GPU przy każdym żądaniu, wywołania API modeli zewnętrznych rozliczane za token, przechowywanie tego, cokolwiek wyprodukowałeś, i każda wypłata dla twórcy lub partnera powiązana z tym użyciem. Cena ze sklepu wraca do klienta. Twoje koszty dostarczenia nie wracają do Ciebie. Zwrot, który mogłeś zakwestionować, nie jest więc zdarzeniem bez zysku i straty, jest stratą netto wszystkiego, co zapłaciłeś, aby obsłużyć konto.
Pięć pól to sposób, w jaki unikasz płacenia dwa razy
deliveryStatus ustawione na DELIVERED i wysokie consumptionPercentage to dwa fakty, które mówią Apple, że klient otrzymał i wykorzystał produkt. Są Twoim dowodem, że moc obliczeniowa, wywołania API i przechowywanie wykonały swoją pracę. Zostaw ładunek niewysłany, a Apple nigdy tego nie usłyszy. Decyduje na podstawie roszczenia klienta, zwrot łatwiej przechodzi, a Ty ponosisz zarówno cofnięty przychód, jak i stojące za nim koszty dostarczenia.
Chargebacki to gorsze drzwi, a milczenie ku nim wskazuje
Klient, który nie uzyska satysfakcji przez proces zwrotów Apple, wciąż może zakwestionować obciążenie u swojego banku. Chargeback z karty jest ostateczny, niesie stałą opłatę za spór i zabiera decyzję z rąk Apple oraz Twoich. Dobra odpowiedź na CONSUMPTION_REQUEST utrzymuje spór wewnątrz systemu Apple, gdzie masz głos. Jego ignorowanie popycha przypadki graniczne ku jedynemu kanałowi, w którym głosu nie masz.
Jak radzi sobie z tym RefundHalt
Pięć pól wygląda prosto, dopóki nie musisz wypełnić ich poprawnie, w ciągu 12 godzin, przy każdym CONSUMPTION_REQUEST, przypisanych do właściwej transakcji. RefundHalt przechwytuje powiadomienie, odczytuje Twoje własne zapisy dostarczenia i użycia dla tego zakupu i wysyła ładunek automatycznie, zanim okno się zamknie. deliveryStatus odzwierciedla to, co faktycznie pokazują Twoje logi, consumptionPercentage pochodzi z rzeczywistego użycia, a nie z domysłu, a refundPreference podąża za polityką, którą ustawiasz raz. Otrzymujesz zakwestionowany zwrot rozpatrzony z dowodami, a nie przegapiony termin i decyzję podjętą bez Ciebie.
Często zadawane pytania
- Ile pól ma teraz Apple Send Consumption Information?
- Pięć. Trzy są wymagane, customerConsented, deliveryStatus i sampleContentProvided, a dwa są opcjonalne, consumptionPercentage i refundPreference. Poprzednia wersja ładunku miała dwanaście pól, a Apple usunęło te profilujące konto, jak accountTenure, lifetimeDollarsPurchased i userStatus.
- Co oznacza deliveryStatus w consumption request?
- deliveryStatus mówi Apple, czy Twoja aplikacja dostarczyła działający zakup w aplikacji. DELIVERED oznacza, że tak. Cztery wartości UNDELIVERED, UNDELIVERED_QUALITY_ISSUE, UNDELIVERED_WRONG_ITEM, UNDELIVERED_SERVER_OUTAGE i UNDELIVERED_OTHER, każda mówi, że nie, z podanego powodu. To najsilniejszy sygnał w ładunku, więc musi pasować do Twoich własnych logów.
- Czy consumptionPercentage to procent, czy surowa liczba?
- To liczba całkowita mierzona w milliunits, a nie zwykły procent. 100,000 milliunits oznacza, że klient w pełni zużył zakup, więc 50,000 to połowa, a 0 to nietknięty. Zastąpiło stary enum consumptionStatus, który miał tylko cztery kubełki od niezużytego do w pełni zużytego.
- Czy ustawienie refundPreference na DECLINE zatrzymuje zwrot?
- Nie. refundPreference wyraża Twój preferowany wynik, niczego nie rozstrzyga. DECLINE mówi Apple, że wolałbyś, aby nie dokonywało zwrotu, a GRANT_FULL lub GRANT_PRORATED mówią coś przeciwnego, ale Apple waży Twoją preferencję wobec historii klienta i własnej polityki i podejmuje ostateczną decyzję.
- Co, jeśli klient nie zgodził się na udostępnienie danych o zużyciu?
- Wtedy nie powinieneś wysyłać ładunku. customerConsented to wymagany Boolean, a wytyczne Apple mówią, że jeśli klient nie zgodził się na udostępnienie danych o zużyciu, w ogóle nie odpowiadasz na CONSUMPTION_REQUEST. Zgoda to realne tak lub nie, które musisz już posiadać, a nie wartość, którą ustawiasz na true, aby pomóc swojej sprawie.
- Ile czasu mam na wysłanie informacji o zużyciu?
- 12 godzin od chwili, gdy Apple wyśle powiadomienie CONSUMPTION_REQUEST. Odpowiadasz metodą PUT do punktu końcowego Send Consumption Information, a sukces zwraca 202 Accepted z pustym ciałem. Używana jest tylko Twoja pierwsza odpowiedź, więc pierwszy ładunek musi być kompletny, a ręczny proces rzadko mieści się w oknie.
Źródła i materiały dodatkowe
- Apple Developer: ConsumptionRequest
- Apple Developer: Send Consumption Information
- Apple Developer: Send Consumption Information V1
- Apple Developer: deliveryStatus
- Apple Developer: consumptionPercentage
- Apple Developer: refundPreference
- Apple Developer: Explore App Store server APIs for In-App Purchase (WWDC24)
RefundHalt
Autopilot zwrotów dla App Store i Google Play
Czytaj dalej
Jest jeden endpoint, który zwraca całą App Store refund history klienta, i oto co odsyła w odpowiedzi
Endpoint Get Refund History od Apple zwraca pełną App Store refund history klienta jako podpisane transakcje. Oto każde pole, jak token revision stronicuje, dlaczego działa per klient, a nie per aplikacja, i ile kosztuje Cię przeoczony zwrot.
Twoja aplikacja może pokazać arkusz wniosku o zwrot środków wewnątrz aplikacji, a oto co robi Apple, gdy klient dotknie przycisku wyślij
Wewnątrzaplikacyjny wniosek o zwrot Apple pozwala klientowi poprosić o zwrot bez opuszczania Twojej aplikacji, na arkuszu, który Apple buduje i sprawdza. Oto co zwraca beginRefundRequest, jakie zegary CONSUMPTION_REQUEST i 48 godzin uruchamia na Twoim serwerze oraz czy warto wdrożyć ten przycisk.