Wszystkie artykuły
Deep dive9 min czytania

Zakup oczekujący wygląda jak sprzedaż, ale pieniądze jeszcze nie dotarły, a udostępnienie go zbyt wcześnie oznacza oddanie produktu za darmo

Zarówno App Store, jak i Google Play mają stan zakupu oczekującego, czyli zamówienie, które sklep przyjął, ale za które jeszcze nie pobrał opłaty. Odblokuj je, zanim wpłynie płatność, a każde, które przepadnie, to czysty koszt. Oto jak zakupy oczekujące działają w każdym ze sklepów, ile kosztuje błędnie przyznany zakup i jak sobie z nimi radzić bez strat.

Kasjer podaje mały zapakowany pakunek przez ladę sklepową w ciepłym świetle, ilustrując zakup oczekujący, w którym towar wędruje, zanim wpłynie płatność

Najważniejsze wnioski

  • Zakup oczekujący to prawdziwe zamówienie, które sklep przyjął, ale za które jeszcze nie pobrał opłaty. Twój kod widzi nowy zakup, ale pieniądze nie dotarły i mogą nigdy nie dotrzeć.
  • Przyznawaj uprawnienie tylko wtedy, gdy stan to PURCHASED w Google Play lub gdy transakcja jest zakończona w Apple. Nigdy nie odblokowuj przy stanie PENDING ani przy oczekującym wyniku Apple.
  • W Google Play płatności gotówką w sklepie, przelewy bankowe i niektóre płatności przez rachunek telefoniczny rozliczają się poza głównym obiegiem, więc zakup wraca jako PENDING, a nie PURCHASED, dopóki klient faktycznie nie zapłaci.
  • W Apple zakup oczekujący to zwykle Ask to Buy, gdzie organizator rodziny musi go zatwierdzić. Zatwierdzenie może zająć godziny lub dni, a zakończona transakcja dociera później przez Transaction.updates.
  • Jeśli odblokujesz przy zamówieniu oczekującym, które potem zostanie anulowane, wydałeś moc obliczeniową, wywołania API, pamięć lub wypłatę za produkt zużywalny na obciążenie, które nigdy nie wpłynęło. W przeciwieństwie do zwrotu nie ma pieniędzy do odzyskania, bo nigdy żadnych nie pobrano.
  • Sklep informuje Cię, gdy zamówienie oczekujące przepada. Google wysyła ONE_TIME_PRODUCT_CANCELED, typ 2, lub SUBSCRIPTION_PENDING_PURCHASE_CANCELED, typ 20. Apple po prostu nigdy nie dostarcza zakończonej transakcji.
  • Zamówienie oczekujące może zmienić się w prawdziwą sprzedaż, gdy Twoja aplikacja jest zamknięta, więc sprawdzaj ponownie po powrocie: wywołaj queryPurchasesAsync() w onResume() w Google Play i nasłuchuj dalej Transaction.updates w Apple.

Ktoś stuka w Twojej aplikacji przycisk kup. Twoje logi pokazują nowe zamówienie, Twój listener rozliczeń się uruchamia, a Ty wydajesz towar. W przypadku większości zakupów to dokładnie to, co trzeba. W przypadku zakupu oczekującego to błąd, bo zamówienie istnieje, ale pieniądze nie. Klient wybrał metodę płatności, która rozlicza się później, sklep wciąż czeka na zapłatę, a Ty właśnie dostarczyłeś płatną funkcję za obciążenie, które może nigdy nie wpłynąć. To cichy krewny zwrotu. Tutaj nic nie zostaje cofnięte, bo nic nigdy nie zostało pobrane. Po prostu oddałeś produkt za darmo.

Zakup oczekujący to prawdziwe zamówienie w stanie jeszcze-nieopłaconym i mają go zarówno App Store, jak i Google Play. Oba sklepy wyraźnie mówią, żeby czekać. Pułapka polega na tym, że zamówienie oczekujące w Twoim kodzie wygląda niemal identycznie jak zakończone, więc integracja, która traktuje każdy nowy zakup jako sprzedaż, wydaje towar na zamówienia, które sklep wciąż próbuje pobrać. Zrób to poprawnie, a nic nie stracisz. Zrób to źle, a każda powolna płatność, która przepada, to czysty koszt, dostarczony na Twój rachunek.

Czym właściwie jest zakup oczekujący

Zakup oczekujący to zamówienie, które sklep zarejestrował, ale za które jeszcze nie pobrał opłaty. Kupujący rozpoczął proces, sklep go przyjął, a rozliczenie odbywa się gdzieś, gdzie Twoja aplikacja nie widzi. Google Play nazywa to stanem PENDING. Apple nazywa to transakcją oczekującą lub odroczoną. Różne nazwy, ten sam fakt: sklep trzyma zamówienie otwarte, czekając na zapłatę, i powiedział Ci, żeby nie traktować tego zamówienia jak pieniędzy.

Google Play: płatność dzieje się gdzie indziej

Niektóre metody płatności rozliczają się poza głównym obiegiem. Gotówka w fizycznym sklepie, przelewy bankowe i niektóre płatności przez rachunek telefoniczny wymagają dodatkowych kroków między stuknięciem a obciążeniem. Gdy klient wybierze jedną z nich, Google zwraca zakup w stanie PENDING zamiast PURCHASED. Przy płatności gotówką klient otrzymuje kod przez powiadomienie i e-mail, zanosi go do uczestniczącego sklepu i płaci w kasie. Dopóki to się nie stanie, Google nic nie pobrało, i Ty również. Reguła Google to jedno zdanie: użyj getPurchaseState() i przyznaj uprawnienie tylko wtedy, gdy stan to PURCHASED. Google mówi też, żeby nie potwierdzać zakupu, dopóki jest PENDING, bo potwierdzenie należy się zamówieniu opłaconemu, a nie obiecanemu.

Apple: zakup czeka na czyjeś stuknięcie

Oczekujący stan Apple oznacza, że transakcja potrzebuje działania zewnętrznego, zanim będzie mogła się zakończyć. Najczęstsze to Ask to Buy, gdzie dziecko rozpoczyna zakup, a organizator rodziny musi go zatwierdzić. W StoreKit 2 wywołanie zakupu zwraca Product.PurchaseResult.pending. W starszym StoreKit transakcja jest zgłaszana jako odroczona. Tak czy inaczej Apple nikogo nie obciążył, a zakończona transakcja, jeśli nadejdzie, dociera asynchronicznie przez Transaction.updates. Pokaż klientowi stan oczekiwania i nie odblokowuj niczego, dopóki nie wpłynie zakończona transakcja.

Dlaczego udostępnienie zakupu oczekującego kosztuje Cię prawdziwe pieniądze

Strata tutaj nie jest tego rodzaju co zwrot, gdzie zaksięgowane pieniądze zostają wycofane. Jest gorsza w jeden konkretny sposób: nie ma pieniędzy do wycofania, bo nigdy żadnych nie pobrano.

Dostarczasz, a sklep nigdy nic nie pobiera

Gdy odblokujesz przy zamówieniu oczekującym, które później zostanie anulowane, już poniosłeś wydatek na jego obsługę. Moc obliczeniowa, która uruchomiła funkcję, opłacone wywołania API zewnętrznych dostawców, przydzielona pamięć, a w przypadku produktu zużywalnego rzeczywista wypłata sprzedanej rzeczy. Wszystko to wychodzi za drzwi na zamówieniu, które nie przyniosło przychodu. Zwrot zaczyna się przynajmniej od obciążenia, które nastąpiło. Błędnie przyznany zakup oczekujący nigdy nie miał żadnego obciążenia, więc nawet nie pojawia się jako wychodzące pieniądze. Pojawia się jako nic, i właśnie dlatego łatwo go przeoczyć i łatwo powtórzyć.

Sygnał anulowania i co oznacza

Sklep faktycznie informuje Cię, gdy zamówienie oczekujące umiera. W Google Play produkt jednorazowy, który przepada, wysyła powiadomienie ONE_TIME_PRODUCT_CANCELED, typ 2, a subskrypcja, która była oczekująca, wysyła SUBSCRIPTION_PENDING_PURCHASE_CANCELED, typ 20. Gdy te same zamówienia zamiast tego przechodzą, otrzymujesz ONE_TIME_PRODUCT_PURCHASED, typ 1, lub SUBSCRIPTION_PURCHASED, typ 4. W Apple nie ma zdarzenia anulowania do przechwycenia, bo transakcja odroczona, która zostaje odrzucona, po prostu nigdy nie staje się zakończoną transakcją. Jeśli odblokowałeś zbyt wcześnie, ta cisza to rachunek.

PytanieGoogle PlayApple
Co to wyzwalaGotówka, przelew bankowy, niektóre płatności przez rachunek telefonicznyZatwierdzenie Ask to Buy lub inne wymagane działanie
Stan, który widziszPurchaseState PENDINGwynik oczekujący lub transakcja odroczona
Przyznaj dostęp, gdyStan to PURCHASEDTransakcja jest zakończona
PrzeszłoONE_TIME_PRODUCT_PURCHASED (1), SUBSCRIPTION_PURCHASED (4)Zakończona transakcja przez Transaction.updates
PrzepadłoONE_TIME_PRODUCT_CANCELED (2), SUBSCRIPTION_PENDING_PURCHASE_CANCELED (20)Nigdy nie dociera żadna zakończona transakcja
Czy pobrano pieniądzeNie, dopiero przy PURCHASEDNie, dopiero gdy transakcja się zakończy

Okno czasowe i kto na kogo czeka

Zakup oczekujący to nie zegar, z którym się ścigasz. To zegar, który z Twojej strony jeszcze nie ruszył.

Google Play daje klientowi dni, nie minuty

Płatność gotówką lub przelewem bankowym rozlicza się według harmonogramu klienta, nie Twojego. Zamówienie tkwi w PENDING, dopóki klient nie zapłaci albo okno nie upłynie i Google go nie anuluje. Twoje własne trzydniowe okno potwierdzenia, to, które automatycznie zwraca zakup, którego nie potwierdzisz, nawet się nie zaczyna, dopóki zakup nie przejdzie z PENDING do PURCHASED. Nie ma więc pośpiechu, żeby obsłużyć zamówienie oczekujące. Jest tylko dyscyplina, żeby czekać na zmianę stanu.

Zatwierdzenie Apple jest na telefonie organizatora rodziny

Prośba Ask to Buy trafia na urządzenie organizatora jako monit, który zatwierdza lub odrzuca, kiedy się do tego zabierze. To może być minuty, godziny lub dzień później, a Twoja aplikacja nie może tego przyspieszyć. Jedyne poprawne zachowanie to odzwierciedlenie stanu oczekiwania i pozwolenie, by StoreKit przekazał Ci zakończoną transakcję, jeśli i kiedy nadejdzie zatwierdzenie.

Zaklejone tekturowe pudełko obok klepsydry na biurku, ilustrujące zakup oczekujący, w którym towar jest gotowy, ale płatność jeszcze nie wpłynęła

Jak obsługiwać zakupy oczekujące bez strat

Całe zadanie sprowadza się do czterech nawyków. Żaden z nich nie jest trudny, a pominięcie choćby jednego to miejsce, gdzie znikają pieniądze.

Przyznawaj przy stanie opłaconym, nigdy przy oczekującym

W Google Play sprawdzaj getPurchaseState() i przyznawaj tylko przy PURCHASED, i nie potwierdzaj zakupu, dopóki jest PENDING. W Apple odblokowuj tylko przy zakończonej transakcji i nigdy przy wyniku oczekującym. Ta jedna reguła zamyka cały wyciek. Cała reszta polega na upewnieniu się, że faktycznie zauważysz, gdy nadejdzie stan opłacony.

Sprawdzaj ponownie, gdy aplikacja wraca

Przejście z oczekiwania do opłacenia często dzieje się, gdy Twoja aplikacja nie działa. W Google Play wywołaj queryPurchasesAsync() w swoim handlerze onResume(), aby wychwycić zamówienia, które w tle stały się PURCHASED, i utrzymuj swój listener Real-time Developer Notifications jako serwerowe źródło prawdy. W Apple nasłuchuj Transaction.updates przez całe życie aplikacji, bo zatwierdzona transakcja może nadejść długo po tym, jak pierwotne wywołanie zakupu zwróciło wynik.

Włącz obsługę oczekujących i przetestuj oba zakończenia

Google wymaga wywołania enablePendingPurchases() przy tworzeniu BillingClient, a obsługa transakcji oczekujących dla produktów jednorazowych jest obowiązkowa, nie opcjonalna. Przetestuj to, zanim wdrożysz. Testerzy licencyjni otrzymują dwa dodatkowe instrumenty testowe dla opóźnionych form płatności, gdzie płatność automatycznie się kończy lub automatycznie anuluje po kilku minutach, więc możesz obserwować zarówno ścieżkę zapłaty, jak i ścieżkę przepadnięcia od początku do końca.

Powiedz klientowi, że zamówienie nie jest ukończone

Kupujący oczekujący to prawdziwy klient w środku zakupu, nie porażka. Pokaż mu, że zamówienie czeka na jego płatność lub na zatwierdzenie, i daj mu jasną drogę powrotu, by je dokończyć. Cichy stan oczekiwania traci sprzedaże, które dobrze oznaczony odzyskuje, bo większość tych kupujących wciąż chce tej rzeczy i został im tylko jeden krok.

Te same kanały Real-time Developer Notifications i App Store Server Notifications, które RefundHalt już czyta dla zwrotów i obciążeń zwrotnych, niosą też te sygnały. Powiadomienie purchased mówiące, że zamówienie oczekujące w końcu wpłynęło, i powiadomienie canceled mówiące, że nie, lądują w Twoim panelu obok reszty zdarzeń przychodowych, więc zamówienie oczekujące, które przepadło, to coś, co możesz zobaczyć, a nie coś, za co przypadkiem zapłaciłeś.

Wersja skrócona

Zakup oczekujący to zamówienie bez płatności i oba sklepy jasno mówią, że powinieneś czekać. Google Play zwraca zamówienia gotówkowe, przelewem bankowym i niektóre przez rachunek telefoniczny w stanie PENDING i mówi, żeby przyznawać dostęp tylko przy PURCHASED. Apple zwraca transakcję oczekującą lub odroczoną dla Ask to Buy i innych wymaganych działań i dostarcza zakończoną transakcję później przez Transaction.updates. Odblokowuj przy stanie opłaconym, sprawdzaj ponownie, gdy Twoja aplikacja się wznawia, włącz i przetestuj obsługę oczekujących oraz oznacz oczekujące zamówienie dla klienta. Zrób to, a zakup oczekujący nic Cię nie kosztuje. Pomiń to, a dostarczysz płatny produkt za obciążenie, które nigdy nie nadeszło, co jest jedyną stratą bez paragonu, na który można wskazać.

Często zadawane pytania

Czym jest zakup oczekujący?
Zakup oczekujący to zamówienie, które sklep przyjął, ale za które jeszcze nie pobrał opłaty. W Google Play to stan zakupu PENDING, używany dla metod płatności rozliczających się później, takich jak gotówka, przelew bankowy i niektóre płatności przez rachunek telefoniczny. W Apple to transakcja oczekująca lub odroczona, najczęściej zakup Ask to Buy czekający na zatwierdzenie organizatora rodziny. W obu przypadkach nie pobrano jeszcze żadnych pieniędzy, więc nie powinieneś przyznawać dostępu.
Czy powinienem przyznać dostęp, gdy zakup jest oczekujący?
Nie. Przyznawaj uprawnienie tylko wtedy, gdy stan to PURCHASED w Google Play lub gdy transakcja jest zakończona w Apple. Jeśli odblokujesz funkcję, gdy zamówienie wciąż jest oczekujące, a płatność nigdy nie wpłynie, dostarczyłeś produkt za darmo, i nie ma obciążenia do cofnięcia, bo żadnego nie dokonano.
Które metody płatności powodują zakup oczekujący w Google Play?
Metody płatności, które rozliczają się poza głównym obiegiem. Płatności gotówką w fizycznym sklepie, przelewy bankowe i niektóre opcje płatności przez rachunek telefoniczny wymagają dodatkowych kroków między stuknięciem a obciążeniem, więc Google zwraca zakup w stanie PENDING zamiast PURCHASED. Przy płatności gotówką klient otrzymuje kod przez powiadomienie i e-mail, a następnie płaci w uczestniczącym sklepie.
Czym jest Ask to Buy i jak wiąże się z zakupami oczekującymi?
Ask to Buy to funkcja Family Sharing od Apple, która pozwala dziecku poprosić o zakup, który musi zatwierdzić organizator rodziny. Gdy prośba czeka, zakup jest w oczekującym stanie Apple, zwracany jako Product.PurchaseResult.pending w StoreKit 2 lub jako transakcja odroczona w starszym StoreKit. Zakończona transakcja dociera tylko, przez Transaction.updates, jeśli i kiedy organizator ją zatwierdzi.
Co się dzieje, jeśli zakup oczekujący nigdy nie zostanie opłacony?
Zamówienie zostaje anulowane i nie dochodzi do przepływu pieniędzy. W Google Play otrzymujesz powiadomienie ONE_TIME_PRODUCT_CANCELED, typ 2, dla produktu jednorazowego lub SUBSCRIPTION_PENDING_PURCHASE_CANCELED, typ 20, dla subskrypcji. W Apple transakcja odroczona po prostu nigdy nie staje się zakończoną transakcją. Jeśli już przyznałeś dostęp, to moment, w którym strata staje się realna.
Czy zakup oczekujący to to samo co zwrot?
Nie. Zwrot cofa płatność, która faktycznie została pobrana. Zakup oczekujący, który przepada, nigdy nie został obciążony, więc nie ma nic do cofnięcia i nic nie pojawia się w raporcie zwrotów. Jeśli odblokowałeś go zbyt wcześnie, kosztem jest moc obliczeniowa, wywołania API, pamięć lub produkt zużywalny, które wydałeś na obsługę zamówienia, które nie przyniosło przychodu.

Źródła i materiały dodatkowe

RefundHalt

Autopilot zwrotów dla App Store i Google Play

Czytaj dalej

Kolejny wniosek o zwrot jest już w drodze.

Skonfiguruj RefundHalt w czasie potrzebnym na przeczytanie kolejnej wiadomości od pomocy technicznej o zwrocie, którego nie udało Ci się zakwestionować.