Powiadomienie o anulowanym zakupie pozwala Twojemu serwerowi Google Play odebrać dostęp w chwili, gdy pojawia się zwrot
Google Play może wypchnąć do Twojego serwera powiadomienie o anulowanym zakupie w tej samej chwili, gdy zakup zostaje zwrócony, obciążony zwrotnie lub anulowany. Niesie ono purchaseToken, orderId, productType oraz refundType i oznacza jedno, odbierz dostęp. Oto jak je odczytać i podłączyć.

Najważniejsze wnioski
- Powiadomienie o anulowanym zakupie to Real-time Developer Notification, które Google Play wypycha do Twojego tematu Cloud Pub/Sub w chwili, gdy zakup zostaje zwrócony, obciążony zwrotnie lub w inny sposób anulowany. To sygnał push, a nie coś, co musisz odpytywać.
- Powiadomienie niesie dokładnie cztery pola: `purchaseToken`, `orderId`, `productType` oraz `refundType`. To wystarczy, aby odnaleźć dokładny zakup w Twojej bazie danych i odebrać powiązane z nim uprawnienie.
- `productType` wynosi `1` dla anulowanej subskrypcji i `2` dla anulowanego zakupu jednorazowego. `refundType` wynosi `1` dla pełnego zwrotu i `2` dla częściowego zwrotu opartego na ilości, który dotyczy wyłącznie wieloilościowych zakupów jednorazowych.
- Powiadomienie o anulowanym zakupie oznacza, że klient już odzyskał swoje pieniądze. Własne wskazówki Google mówią, aby odebrać dostęp do powiązanej treści, ponieważ kupujący nie powinien już posiadać tego uprawnienia.
- Powiadomienia o anulowanych zakupach są wyłączone, dopóki ich nie włączysz. W Play Console w sekcji Monetization setup wybierasz albo subskrypcje wraz ze wszystkimi anulowanymi zakupami, albo to samo plus zdarzenia produktów jednorazowych. Obie opcje obejmują anulowane zakupy.
- Powiadomienie o anulowanym zakupie nie jest jednym z dwóch przepływów zwrotów, które proszą Cię o dowody. To zawiadomienie po fakcie. Jedyne przepływy, które przyjmują Twoje dane wejściowe, to CONSUMPTION_REQUEST Apple z oknem 12-hour oraz przegląd obciążeń zwrotnych Google Play przez `orders.reviewrefund` z oknem 24-hour.
- Od August 3, 2026 Google przekazuje deweloperowi cenę zakupu wraz z opłatą bankową obciążenia zwrotnego. Powiadomienie o anulowanym zakupie często jest sposobem, w jaki Twój serwer po raz pierwszy dowiaduje się, że anulowanie z tytułu obciążenia zwrotnego dotarło, więc jego podłączenie jest tym, co pozwala Ci przestać obsługiwać klienta, za którego nie otrzymujesz już zapłaty.
Zwrot w Google Play nie musi być czymś, co odkrywasz później w raporcie. Google Play może wypchnąć do Twojego serwera powiadomienie o anulowanym zakupie w chwili, gdy zakup zostaje anulowany, niezależnie od tego, czy kupujący skorzystał ze zwrotu samoobsługowego, agent wsparcia go przyznał, bank wymusił obciążenie zwrotne, czy sam zwróciłeś zamówienie z włączoną flagą odebrania. Wiadomość jest maleńka, wskazuje dokładny zakup i niesie jedną instrukcję, oddaj uprawnienie, ponieważ pieniędzy już nie ma.
Czym właściwie jest powiadomienie o anulowanym zakupie
Powiadomienie o anulowanym zakupie to jeden z typów Real-time Developer Notifications Google Play, czyli RTDN. RTDN to kanał push. Google publikuje wiadomość do tematu Cloud Pub/Sub, który posiadasz, a Twój backend odbiera ją w ciągu chwil od zdarzenia, zamiast dowiadywać się o nim przy następnym zaplanowanym odpytywaniu. To cała istota powiadomienia o anulowanym zakupie w porównaniu ze starszą ścieżką pull: dowiadujesz się o zwrocie, gdy się dzieje, a nie godziny później.
Ścieżka pull nadal istnieje i nadal ma znaczenie. Voided Purchases API pozwala Twojemu serwerowi zapytać, według własnego harmonogramu, o listę zakupów anulowanych w danym przedziale czasu. Oba rozwiązania się uzupełniają. Powiadomienie mówi Ci w chwili, gdy jeden zakup się zmienia; API pozwala uzgadniać zbiorczo i uzupełniać wszystko, co pozostawiłaby pominięta wiadomość.
Podróżuje wewnątrz Real-time Developer Notification
Powiadomienie o anulowanym zakupie nigdy nie przychodzi samo. Znajduje się wewnątrz opakowania DeveloperNotification, a to opakowanie jest dostarczane jako pojedynczy ciąg zakodowany w base64 w polu data wiadomości Pub/Sub. Twój handler dekoduje ten ciąg do JSON, zanim będzie mógł cokolwiek odczytać. Opakowanie zawsze wskazuje aplikację i czas zdarzenia oraz zawiera dokładnie jeden obiekt powiadomienia spośród pięciu, które definiuje Google. Wykluczają się one wzajemnie, więc wiadomość niosąca voidedPurchaseNotification nie będzie jednocześnie nieść zdarzenia subskrypcji ani jednorazowego.
| Pole opakowania | Co zawiera |
|---|---|
version | Wersja schematu powiadomienia, na przykład 1.0 |
packageName | Aplikacja, do której należy zdarzenie, na przykład com.acme.app |
eventTimeMillis | Kiedy zdarzenie nastąpiło, w milisekundach od epoki |
| Jeden z pięciu obiektów powiadomienia | oneTimeProductNotification, subscriptionNotification, voidedPurchaseNotification, pendingRefundReviewNotification lub testNotification. W każdej wiadomości obecny jest tylko jeden |
Cztery pola, które niesie
Zdejmij opakowanie, a samo powiadomienie o anulowanym zakupie to cztery pola. To celowo oszczędne. Stanowisko Google jest takie, że jeśli wszystko, czego potrzebujesz, to odnaleźć właściwy zakup i skorygować uprawnienie, te cztery pola wystarczą i nie musisz wywoływać żadnego API, aby zadziałać.
| Pole | Czym jest | Jak go używasz |
|---|---|---|
purchaseToken | Token przekazany urządzeniu w momencie zakupu przedmiotu | Twój klucz główny. Dopasuj go do rekordu zakupu zapisanego w chwili przyznania |
orderId | Id zamówienia pokazywane kupującemu, na przykład GS.0000-0000-0000 | Czytelny dla człowieka drugi klucz do wsparcia i uzgadniania |
productType | Czy anulowany przedmiot był subskrypcją, czy zakupem jednorazowym | Skieruj na właściwą ścieżkę odbierania |
refundType | Czy anulowanie było pełnym zwrotem, czy częściowym zwrotem opartym na ilości | Zdecyduj, czy odebrać wszystko, czy tylko zwróconą ilość |
productType mówi Ci, co zostało anulowane
productType to mała liczba całkowita, która decyduje, którą z Twoich ścieżek odbierania obrać. Anulowanie subskrypcji musi rozwikłać trwający dostęp; anulowanie zakupu jednorazowego po prostu usuwa pojedyncze uprawnienie.
| Wartość `productType` | Stała | Znaczenie |
|---|---|---|
1 | PRODUCT_TYPE_SUBSCRIPTION | Anulowano zakup subskrypcji |
2 | PRODUCT_TYPE_ONE_TIME | Anulowano zakup jednorazowy |
refundType mówi Ci, ile wróciło
refundType oddziela czyste pełne odwrócenie od częściowego. Przypadek częściowy jest wąski. Pojawia się tylko wtedy, gdy wieloilościowy zakup jednorazowy miał zwróconą część, ale nie całą swoją ilość.
| Wartość `refundType` | Stała | Znaczenie |
|---|---|---|
1 | REFUND_TYPE_FULL_REFUND | Zakup został całkowicie anulowany |
2 | REFUND_TYPE_QUANTITY_BASED_PARTIAL_REFUND | Anulowano część wieloilościowego zakupu |
Najpierw to włącz, bo inaczej nigdy nie przyjdzie
Powiadomienia o anulowanych zakupach nie płyną domyślnie. Włączasz RTDN raz, w Play Console, i kierujesz je na temat Pub/Sub, który kontrolujesz. Przełącznik znajduje się w Monetize, następnie Monetization setup, w sekcji Real-time developer notifications na górze strony. Zaznacz Enable real-time notifications, następnie wklej pełną nazwę tematu w formacie projects/{project_id}/topics/{topic_name} i użyj Send Test Message, aby potwierdzić, że kanał działa, zanim mu zaufasz.
Przełącznik treści to miejsce, w którym ludzie pomijają anulowane zakupy. Oba wybory je obejmują, więc nie możesz przypadkowo zrezygnować ze zwrotów, zachowując subskrypcje.
- Otrzymuj powiadomienia dla subskrypcji i wszystkich anulowanych zakupów. Otrzymujesz zdarzenia subskrypcji i każdy anulowany zakup, ale nie zdarzenia zakupu produktów jednorazowych.
- Otrzymuj wszystkie powiadomienia dla subskrypcji i produktów jednorazowych. Otrzymujesz powyższe plus zdarzenia produktów jednorazowych, takie jak
ONE_TIME_PRODUCT_PURCHASEDiONE_TIME_PRODUCT_CANCELED.

Ile Cię to kosztuje, w pieniądzu
Anulowanie to strata już zaksięgowana, zanim powiadomienie do Ciebie dotrze. Cena sprzedaży przepadła, podobnie jak wszystko, co wydałeś na obsługę tego klienta. Jeśli generował obrazy, uruchamiał wywołania Twoich modeli, pobierał pamięć masową lub wyzwolił wypłatę na rzecz strony trzeciej, te koszty zostały opłacone prawdziwymi pieniędzmi i nie wracają wraz ze zwrotem. Powiadomienie nie może odzyskać żadnego z nich. Może natomiast zatrzymać krwawienie od tego momentu, co jest całym powodem, aby zadziałać na nie szybko.
Krwawienie jest najgorsze przy subskrypcjach i najgorsze przy obciążeniach zwrotnych. Subskrypcja, której nie odbierzesz, wciąż kosztuje Cię obsługę, miesiąc po miesiącu, dla klienta, który już nie płaci. A obciążenie zwrotne to najdroższy rodzaj anulowania. Od August 3, 2026 dokumentacja Google stwierdza, że obciążenie zwrotne przekazuje deweloperowi cenę zakupu wraz z opłatą banku. Powiadomienie o anulowanym zakupie często jest pierwszym miejscem, w którym Twoje własne systemy słyszą, że obciążenie zwrotne zostało zakończone, więc handler, który odbiera dostęp od razu, jest tym, co powstrzymuje utraconą sprzedaż przed przekształceniem się w utraconą sprzedaż plus tygodnie darmowej obsługi.
Jak obsłużyć powiadomienie o anulowanym zakupie, krok po kroku
Zweryfikuj i usuń duplikaty wiadomości
- Potwierdź, że wiadomość Pub/Sub pochodzi z Google i celuje w temat, który skonfigurowałeś, a następnie zdekoduj pole
dataz base64, aby uzyskać JSONDeveloperNotification. - Użyj
messageIdPub/Sub, aby odrzucać duplikaty. Google ostrzega, że to samo powiadomienie może zostać dostarczone więcej niż raz, więc traktuj powtórki jako normalne i uczyń swój handler idempotentnym. - Potwierdź (acknowledge) wiadomość dopiero po bezpiecznym jej zapisaniu, aby awaria w trakcie działania handlera nie utraciła zdarzenia.
Odszukaj zakup
- Dopasuj
purchaseTokendo zakupu zapisanego przy pierwszym przyznaniu uprawnienia. W razie potrzeby posłuż sięorderIddo wyszukiwań wsparcia i ręcznego uzgadniania. - Odczytaj
productType, aby wybrać ścieżkę odbierania subskrypcji lub jednorazową, i odczytajrefundType, aby zdecydować między pełnym a częściowym odebraniem.
Odbierz i zapisz
- Usuń uprawnienie. Przy pełnym zwrocie odetnij dostęp do przedmiotu. Przy częściowym zwrocie opartym na ilości zmniejsz przyznaną ilość o kwotę zwróconą i pozostaw resztę nienaruszoną.
- Zapisz, co zrobiłeś i kiedy, kluczując według
purchaseTokeniorderId. Ten zapis pozwala Ci później odpowiedzieć na zgłoszenie wsparcia i pozwala Voided Purchases API czysto uzgadniać się z Twoim własnym stanem.
Gdzie mieści się wśród innych sygnałów zwrotu
Powiadomienie o anulowanym zakupie to zawiadomienie, a nie negocjacja. Mówi Ci o wyniku, który jest już przesądzony. Warto zobaczyć je obok sygnałów, z którymi łatwo je pomylić, bo tylko niektóre z nich w ogóle proszą o Twoją wersję historii.
| Sygnał | Kierunek | Czy przyjmuje Twoje dane wejściowe |
|---|---|---|
| Powiadomienie o anulowanym zakupie (RTDN) | Google wypycha do Twojego serwera | Nie. Zgłasza anulowanie, które już się wydarzyło |
| Voided Purchases API | Twój serwer pobiera z Google | Nie. To lista tylko do odczytu przeszłych anulowań |
pendingRefundReviewNotification (RTDN) | Google wypycha do Twojego serwera | Tak, pośrednio. Oznacza obciążenie zwrotne, które następnie kwestionujesz przez orders.reviewrefund w ciągu 24 godzin |
| Apple CONSUMPTION_REQUEST | Apple pyta Twój serwer | Tak. Odpowiadasz przez Send Consumption Information w ciągu 12 godzin |
Myśl, której trzeba się trzymać, jest prosta. W obu sklepach istnieją dokładnie dwa przepływy zwrotów, w których deweloper ma głos, CONSUMPTION_REQUEST Apple i przegląd obciążeń zwrotnych Google Play. Powiadomienie o anulowanym zakupie nie jest żadnym z nich. Zanim do Ciebie dotrze, decyzja jest już za Tobą, a jedyne, co pozostaje w Twoich rękach, to jak szybko odbierzesz dostęp.
Często zadawane pytania
- Co oznacza powiadomienie o anulowanym zakupie w Google Play?
- Oznacza, że zakup został zwrócony, obciążony zwrotnie lub w inny sposób anulowany, a klient odzyskał swoje pieniądze. Wskazówki Google mówią, aby odebrać dostęp do powiązanej treści, ponieważ kupujący nie powinien już posiadać tego uprawnienia. Powiadomienie wskazuje dokładny zakup przez swój `purchaseToken` i `orderId`.
- Jakie pola zawiera powiadomienie o anulowanym zakupie Google Play?
- Cztery: `purchaseToken`, `orderId`, `productType` oraz `refundType`. `productType` wynosi `1` dla subskrypcji i `2` dla zakupu jednorazowego. `refundType` wynosi `1` dla pełnego zwrotu i `2` dla częściowego zwrotu opartego na ilości przy wieloilościowym zakupie.
- Jak włączyć powiadomienia o anulowanych zakupach?
- W Play Console otwórz Monetize, następnie Monetization setup, i w sekcji Real-time developer notifications zaznacz Enable real-time notifications, a potem wprowadź nazwę swojego tematu Cloud Pub/Sub. Obie opcje treści, subskrypcje wraz ze wszystkimi anulowanymi zakupami oraz to samo plus zdarzenia produktów jednorazowych, obejmują anulowane zakupy.
- Jaka jest różnica między powiadomieniem o anulowanym zakupie a Voided Purchases API?
- Powiadomienie to sygnał push dostarczany w czasie rzeczywistym przez Cloud Pub/Sub w chwili, gdy zakup zostaje anulowany. Voided Purchases API to ścieżka pull, którą Twój serwer odpytuje według własnego harmonogramu, aby wylistować anulowania w danym przedziale czasu. Użyj powiadomienia, aby reagować natychmiast, a API, aby uzgadniać i uzupełniać.
- Czy powiadomienie o anulowanym zakupie pozwala mi zakwestionować zwrot?
- Nie. To zawiadomienie po fakcie o decyzji, która już zapadła. Jedyny przepływ Google Play, który przyjmuje Twoje dane wejściowe, to przegląd obciążeń zwrotnych przez `orders.reviewrefund`, na który masz 24 godziny na odpowiedź, a w Apple jest to CONSUMPTION_REQUEST z oknem 12-hour.
Źródła i materiały dodatkowe
- Android Developers: Real-time developer notifications reference guide
- Google Play Developer API: Voided Purchases API
- Google Play Developer API: REST Resource purchases.voidedpurchases
- Android Developers: Purchase lifecycle and RTDNs
- Google Play Console Help: refund protection and chargeback cost responsibility
- Google Play Developer API: Method orders.reviewrefund
RefundHalt
Autopilot zwrotów dla App Store i Google Play
Czytaj dalej
Możesz samodzielnie zwrócić zamówienie Google Play, a zrobienie tego przed obciążeniem zwrotnym oszczędza opłatę bankową
Możesz zwrócić dowolne zamówienie Google Play młodsze niż three years jednym wywołaniem API, z odebraniem dostępu lub bez. Zrobienie tego samodzielnie, zanim spór zamieni się w obciążenie zwrotne, oszczędza opłatę bankową, która od August 3, 2026 spada na deweloperów. Oto jak działa orders.refund.
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.