Android: potwierdzenie zakupu w aplikacji Google Play

92

Używam portfela Google do mojej bramki płatności, po zakupie produktu Google daje mi poniższą odpowiedź, że

{ 
 "orderId":"12999763169054705758.1371079406387615", 
 "packageName":"com.example.app",
 "productId":"exampleSku",
 "purchaseTime":1345678900000,
 "purchaseState":0,
 "developerPayload":"bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ",
 "purchaseToken":"rojeslcdyyiapnqcynkjyyjh"
 }

Próbuję skorzystać z weryfikacji paragonów, którą niedawno wprowadził Google Play. W konsoli Google Developer utworzyłem klucz certyfikatu przez Konto usługi w Uprawnieniu. Ale jestem zdezorientowany, jak skorzystać z weryfikacji paragonu po zakupie produktu w sklepie Google Play.

Więc może ktoś mi pomóc jak to zrobić walidację Otrzymanie z InAppzakupu.

Binil Surendran
źródło
Witaj Binil, czy ukończyłeś go w celu zakupu subskrypcji?
Anshul Tyagi
jego produkt zarządzający @Anshul Tyag
Binil Surendran
@BinilSurendran .. Moje pytanie różni się od twojego, ale muszę znać identyfikator e-mail użyty do zakupu w aplikacji. czy możesz mi pomóc, jak mogę otrzymać ten e-mail, ponieważ potrzebuję go do dalszych odniesień w mojej aplikacji
Pallavi
@Pallavi. przepraszam, nie mam pomysłu na uzyskanie identyfikatora e-mail kupującego. jako odpowiedź udzielona przez Google po zakupie bez adresu email_id
Binil Surendran

Odpowiedzi:

216

Google zapewnia weryfikację paragonów przez Google Play Developer API , w ramach API znajdują się dwa punkty końcowe, którymi będziesz najbardziej zainteresowany: Purchases.products: get i Purchases.subscriptions: get .

Purchases.products: getmoże służyć do weryfikacji zakupu produktu bez automatycznego odnawiania, gdzie Purchases.subscriptions: getsłuży do weryfikacji i ponownej weryfikacji automatycznie odnawiających się subskrypcji produktów.

Aby użyć punktu końcowego należy znać packageName, productId, purchaseTokenwszystkie z nich można znaleźć w zawartości otrzymanej na zakup. Potrzebujesz również, access_tokenktóre możesz uzyskać, tworząc konto usługi Google API.

Aby rozpocząć korzystanie z konta usługi, najpierw przejdź do strony ustawień dostępu do interfejsu API konsoli programisty Google Play i kliknij przycisk Utwórz nowy projekt:

Utwórz nowy projekt Google API

Powinieneś teraz zobaczyć nowy połączony projekt i kilka nowych sekcji, w sekcji Konto usługi kliknij przycisk Utwórz konto usługi.

Utwórz nowe konto usługi

Zostanie wyświetlone okno informacyjne z instrukcjami tworzenia konta usługi. Kliknij link do Google Developers Console, a pojawi się nowa karta.

Otwórz Google Developers Console

Teraz kliknij Utwórz nowy identyfikator klienta, wybierz konto usługi z opcji i kliknij Utwórz identyfikator klienta.

Utwórz nowy identyfikator klienta

Plik JSON zostanie pobrany, to jest Twój token sieciowy JSON, którego użyjesz do wymiany na taki, access_tokenwięc zachowaj go w bezpiecznym miejscu.

Następnie przełącz karty z powrotem do konsoli programisty Google Play i kliknij Gotowe w polu informacyjnym. Na liście powinno pojawić się nowe konto usługi. Kliknij Przyznaj dostęp obok adresu e-mail konta usługi.

Dostęp uznany

Następnie w obszarze Wybierz rolę dla tego użytkownika wybierz Finanse i kliknij Dodaj użytkownika.

Ustaw rolę na Finanse

Skonfigurowałeś już swoje konto serwisowe i masz dostęp do wszystkich niezbędnych do weryfikacji paragonów. Następnym krokiem jest wymiana JWT na access_token.

access_tokenWygasa po jednej godzinie wymiany masz tak potrzebne niektóre kod serwera obsłużyć to i Google dostarczyły kilku bibliotek w wielu językach, aby poradzić sobie z tym (lista nie jest wyczerpująca):

Nie będę wchodzić w szczegóły, ponieważ istnieje mnóstwo dokumentacji na temat korzystania z tych bibliotek, ale wspomnę, że chcesz użyć https://www.googleapis.com/auth/androidpublisherzakresu OAuth2 jako zakresu OAuth2, client_emailz JWT jako issueri klucza publicznego, który można uzyskać z private_keyi hasło notasecretbędzie używane dlasigning_key .

Gdy już masz access_token będziesz gotowy, możesz iść (przynajmniej przez następną godzinę, w którym to momencie będziesz chciał poprosić o nowy, postępując zgodnie z tym samym procesem w powyższym akapicie).

Aby sprawdzić stan zakupu materiałów eksploatacyjnych (bez automatycznego odnawiania), przeprowadź http get żądanie do:https://www.googleapis.com/androidpublisher/v2/applications/com.example.app/purchases/products/exampleSku/tokens/rojeslcdyyiapnqcynkjyyjh?access_token=your_access_token

Jeśli otrzymasz kod odpowiedzi 200 http, wszystko poszło zgodnie z planem, a zakup był ważny. 404 oznacza, że ​​twój token jest nieważny, więc zakup był najprawdopodobniej próbą oszustwa. 401 będzie oznaczać, że twój token dostępu jest nieprawidłowy, a 403 będzie oznaczać, że twoje konto usługi ma niewystarczający dostęp, sprawdź, czy włączyłeś Finanse dla konta dostępu w konsoli programisty Google Play.

Odpowiedź z 200 będzie wyglądać podobnie do tego:

{
  "kind": "androidpublisher#productPurchase",
  "purchaseTimeMillis": long,
  "purchaseState": integer,
  "consumptionState": integer,
  "developerPayload": string
}

Wyjaśnienie każdej usługi znajdziesz na https://developers.google.com/android-publisher/api-ref/purchases/products .

Subskrypcje są podobne, ale punkt końcowy wygląda następująco:

https://www.googleapis.com/androidpublisher/v2/applications/packageName/purchases/subscriptions/subscriptionId/tokens/token?access_token=you_access_token

Odpowiedź powinna zawierać te właściwości:

{
  "kind": "androidpublisher#subscriptionPurchase",
  "startTimeMillis": long,
  "expiryTimeMillis": long,
  "autoRenewing": boolean
}

Zobacz https://developers.google.com/android-publisher/api-ref/purchases/subscriptions, aby zapoznać się z opisami usług. Pamiętaj, że startTimeMillisiexpiryTimeMillis będzie ulegać zmianom w zależności od czasu trwania abonamentu.

Miłego sprawdzania!

Marc Greenstock
źródło
Dodałem nowego użytkownika w konsoli programisty i otrzymałem certyfikat JSON, który otrzymuję z konsoli. Czy możesz mi pomóc, jak sprawdzić poprawność odbioru za pomocą pobranego pliku @Marc Greenstock
Binil Surendran
@BinilS Będziesz musiał sprecyzować, w jakim języku po stronie serwera będziesz pisać kod?
Marc Greenstock
używam javy po stronie serwera @Marc Greenstock
Binil Surendran
3
Po raz pierwszy widziałem szczegółowy przewodnik dotyczący implementacji weryfikacji płatności na serwerze w ciągu 2 dni wyszukiwania. Kciuki w górę. Czy jest gdzieś gotowy do użycia kod serwera? Uważam to za bardzo dziwne, że nigdzie nie mogę znaleźć czegoś takiego
Anonimowy,
2
@MarcGreenstock Dzięki za szczegółową odpowiedź.
Lavakush
28

Odpowiedź Marca jest doskonała. Dodam tylko, że biblioteka klienta Google Play Developer API Client dla Java znacznie upraszcza połączenie z serwera do serwerów Google Play. Biblioteka automatycznie obsługuje odświeżanie tokena uwierzytelniania, a także zapewnia bezpieczny interfejs API, dzięki czemu nie musisz grzebać w adresach URL.

Oto jak skonfigurować Publishersingletona:

httpTransport = GoogleNetHttpTransport.newTrustedTransport();
jsonFactory = JacksonFactory.getDefaultInstance();      
credential = GoogleCredential.fromStream(getClass().getResourceAsStream("/path/to/your/key.json")).createScoped(Collections.singleton(AndroidPublisherScopes.ANDROIDPUBLISHER));
publisher = new AndroidPublisher.Builder(httpTransport, jsonFactory, credential).setApplicationName(APP_NAME).build();

Poniższy kod pyta o zakup produktu:

ProductPurchase product = publisher.purchases().products().get(PACKAGE_NAME, sku, token).execute();
Integer purchaseState = product.getPurchaseState();
product.getPurchaseTimeMillis();
product.getConsumptionState();
product.getDeveloperPayload();

Możesz podobnie zapytać o subskrypcje:

SubscriptionPurchase sub = publisher.purchases().subscriptions().get(PACKAGE_NAME, sku, token).execute();
sub.getAutoRenewing();
sub.getCancelReason();
...
Jeshurun
źródło
To jest kod na serwerze Java lub wykonywany w systemie Android przed wywołaniem dowolnego serwera?
użytkownik
2
@jeshurun ​​Dzięki za kod. Do innych czytelników APP_NAME = APP_PACKAGE_NAME.
zamieć
1
A co z Pythonem?
Babken Vardanyan
1
Dziękuję Ci! Dla mnie zamiast getClass().getResourceAsStream(...użyłem new FileInputStream(....
António Almeida
Dzięki. Bardzo przydatne. Musiałem jednak dodać: credential.refreshToken();między uzyskaniem referencji a wydawcą.
grooble
5

@ marc-greenstock dostarczył świetnej odpowiedzi, jednak jest bardzo ważna rzecz dotycząca weryfikacji paragonu za pomocą Google Play Android Developer API.

Jeśli masz jakiekolwiek problemy z używaniem tego interfejsu API, a produkt w aplikacji został dodany PRZED udzieleniem uprawnień lub połączeniem z kontem usługi, musisz otworzyć „Produkty w aplikacji” i przeprowadzić aktualizację. Możesz na przykład edytować opis swojego produktu i zapisać. Powinieneś natychmiast uzyskać pozwolenie.

Spędziłem kilka godzin zastanawiając się, co zrobiłem źle ...

Wojciech Kulik
źródło
2

Ta odpowiedź jest doskonała. Kolejnym problemem, na który natknęliśmy się, podążając za wskazówkami, było to, że konto usługi nie pojawiło się w Konsoli Google Play. W końcu znaleźliśmy to rozwiązanie, które pomoże: konto usługi nie pojawia się w konsoli Google po utworzeniu

Zasadniczo przejdź do IAM w Google API Console i dodaj nowe konto usługi, a następnie pojawi się w Google Play Console. zrzut ekranu

szybowanie
źródło
Czy możesz dodać opis tutaj. W innym przypadku, jeśli link zostanie odwołany, Twoja odpowiedź stanie się nieważna
Mathews Sunny,
1
Jaka powinna być rola dodanego konta?
Adi