Android: InApp Kaufbeleg Validierung Google Play

89

Ich verwende Google Wallet für mein Zahlungsgateway, nachdem ich das Produkt Google gekauft habe

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

Ich versuche, die von Google Play neu eingeführte Quittungsüberprüfung zu verwenden. In der Google Developer Console habe ich den Zertifikatschlüssel über das Dienstkonto in der Berechtigung erstellt. Ich bin jedoch verwirrt, wie ich die Belegvalidierung nach dem Kauf eines Produkts im Google Play-Store verwenden kann.

Kann mir bitte jemand helfen, wie ich die Quittungsvalidierung des InAppKaufs durchführe ?

Binil Surendran
quelle
Hallo Binil, hast du es für den Abonnementkauf abgeschlossen?
Anshul Tyagi
sein verwalten Produkt @Anshul Tyag
Binil Surendran
@ BinilSurendran .. Meine Frage unterscheidet sich von Ihrer Frage, aber ich muss die E-Mail-ID kennen, die für den In-App-Kauf verwendet wurde. Können Sie mir bitte helfen, wie ich diese E-Mail erhalten kann, da ich sie als weitere Referenz in meiner App benötige
Pallavi
@Pallavi. Entschuldigung, ich habe keine Idee, die E-Mail-ID des Käufers zu erhalten. als die Antwort von Google nach dem Kauf haben keine email_id
Binil Surendran

Antworten:

214

Google bietet eine Belegvalidierung über die Google Play Developer-API . Innerhalb der API befinden sich zwei Endpunkte, an denen Sie am meisten interessiert sind: Purchases.products: get und Purchases.subscriptions: get .

Purchases.products: getkann verwendet werden, um einen Produktkauf ohne automatische Verlängerung zu überprüfen, wobei Purchases.subscriptions: getdie Abonnements für Produkte mit automatischer Verlängerung überprüft und erneut überprüft werden.

Um entweder Endpunkt verwenden Sie das wissen müssen packageName, productId, purchaseTokenall diese Faktoren können in der Nutzlast finden Sie beim Kauf erhalten haben . Sie benötigen außerdem ein access_tokenKonto, das Sie durch Erstellen eines Google API-Dienstkontos erhalten können.

Um mit einem Dienstkonto zu beginnen, rufen Sie zunächst die Seite mit den API-Zugriffseinstellungen für die Google Play Developer Console-Konsole auf und klicken Sie auf die Schaltfläche Neues Projekt erstellen:

Erstellen Sie ein neues Google API-Projekt

Sie sollten nun ein neues verknüpftes Projekt und einige neue Abschnitte sehen. Klicken Sie im Abschnitt Dienstkonto auf die Schaltfläche Dienstkonto erstellen.

Erstellen Sie ein neues Dienstkonto

Sie erhalten eine Infobox mit Anweisungen zum Erstellen Ihres Dienstkontos. Klicken Sie auf den Link zur Google Developers Console. Ein neuer Tab wird angezeigt.

Öffnen Sie die Google Developers Console

Klicken Sie nun auf Neue Client-ID erstellen, wählen Sie in den Optionen Dienstkonto aus und klicken Sie auf Client-ID erstellen.

Erstellen Sie eine neue Client-ID

Eine JSON-Datei wird heruntergeladen. Dies ist Ihr JSON-Web-Token, mit dem Sie eine JSON-Datei austauschen access_token .

Wechseln Sie anschließend wieder zur Google Play Developer-Konsole und klicken Sie im Infobox auf Fertig. Sie sollten Ihr neues Dienstkonto in der Liste sehen. Klicken Sie neben der E-Mail-Adresse des Dienstkontos auf Zugriff gewähren.

Zugriff gewähren

Wählen Sie als Nächstes unter Wählen Sie eine Rolle für diesen Benutzer aus die Option Finanzen aus und klicken Sie auf Benutzer hinzufügen.

Setzen Sie die Rolle auf Finanzen

Sie haben jetzt Ihr Dienstkonto eingerichtet und es verfügt über den erforderlichen Zugriff, um Quittungsüberprüfungen durchzuführen. Als nächstes tauschen Sie Ihre JWT gegen ein access_token aus.

Das access_tokenläuft nach einer Stunde Austausch ab. Sie benötigen also Servercode, um dies zu handhaben, und Google hat mehrere Bibliotheken in vielen Sprachen bereitgestellt, um dies zu handhaben (Liste nicht vollständig):

Ich werde nicht ins Detail gehen, da es reichlich Dokumentation zur Verwendung dieser Bibliotheken gibt, aber ich werde erwähnen, dass Sie den https://www.googleapis.com/auth/androidpublisherals OAuth2-Bereich, den client_emailvom JWT als den issuerund den öffentlichen Schlüssel verwenden möchten, den Sie vom private_keyund erhalten können Die Passphrase notasecretwird für die verwendet signing_key.

Sobald Sie das haben, können access_tokenSie loslegen (zumindest für die nächste Stunde, an der Sie nach dem gleichen Verfahren wie im obigen Absatz eine neue anfordern möchten).

Um den Status eines Verbrauchsmaterialkaufs (nicht automatisch erneuernd) zu überprüfen, senden Sie eine http- getAnfrage an:https://www.googleapis.com/androidpublisher/v2/applications/com.example.app/purchases/products/exampleSku/tokens/rojeslcdyyiapnqcynkjyyjh?access_token=your_access_token

Wenn Sie einen 200-http-Antwortcode erhalten, verlief alles wie geplant und Ihr Kauf war gültig. Ein 404 bedeutet, dass Ihr Token ungültig ist, sodass der Kauf höchstwahrscheinlich ein Betrugsversuch war. Ein 401 bedeutet, dass Ihr Zugriffstoken ungültig ist, und ein 403 bedeutet, dass Ihr Dienstkonto keinen ausreichenden Zugriff hat. Überprüfen Sie, ob Sie Finanzen aktiviert haben für das Zugriffskonto in der Google Play Developer-Konsole .

Die Antwort von einem 200 sieht ungefähr so ​​aus:

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

Eine Erläuterung der einzelnen Eigenschaften finden Sie unter https://developers.google.com/android-publisher/api-ref/purchases/products .

Abonnements sind ähnlich, aber der Endpunkt sieht folgendermaßen aus:

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

Die Antwort sollte folgende Eigenschaften enthalten:

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

Informationen zu den Eigenschaften finden Sie unter https://developers.google.com/android-publisher/api-ref/purchases/subscriptions. Beachten Sie, dass startTimeMillisundexpiryTimeMillis unterliegen wird in Abhängigkeit von der Dauer des Abonnements ändern.

Viel Spaß beim Validieren!

Marc Greenstock
quelle
Ich füge einen neuen Benutzer in die Entwicklerkonsole ein und habe ein JSON-Zertifikat erhalten, das von der Konsole abgerufen wird. Können Sie mir bitte helfen, die Quittungsüberprüfung mit der heruntergeladenen Datei @Marc Greenstock
Binil Surendran
@BinilS Sie müssen genauer sein, in welcher serverseitigen Sprache müssen Sie Ihren Code schreiben?
Marc Greenstock
Ich benutze Java auf der Serverseite @Marc Greenstock
Binil Surendran
3
Dies ist das erste Mal, dass ich innerhalb von 2 Tagen nach der Suche eine detaillierte Anleitung zur Implementierung der Überprüfung der Serverzahlung sehe. Daumen hoch. Gibt es irgendwo einen gebrauchsfertigen Servercode? Ich finde es sehr seltsam, dass ich so etwas nirgendwo finden kann
Anonym
2
@MarcGreenstock Danke für die ausführliche Antwort.
Lavakush
28

Marc's Antwort ist ausgezeichnet. Ich möchte nur hinzufügen, dass die Google Play Developer API-Clientbibliothek für Java das Herstellen einer Verbindung von Ihrem Server zu den Google Play-Servern erheblich vereinfacht. Die Bibliothek übernimmt automatisch das Aktualisieren des Authentifizierungstokens und bietet außerdem eine typsichere API, sodass Sie nicht mit URLs herumspielen müssen.

So richten Sie den PublisherSingleton ein:

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();

Der folgende Code fragt einen Produktkauf ab:

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

Sie können auch nach Abonnements fragen:

SubscriptionPurchase sub = publisher.purchases().subscriptions().get(PACKAGE_NAME, sku, token).execute();
sub.getAutoRenewing();
sub.getCancelReason();
...
Jeshurun
quelle
Dies ist Code auf einem Java-Server oder wird auf Android ausgeführt, bevor ein beliebiger Server aufgerufen wird?
Benutzer
2
@ Jeshurun ​​Danke für den Code. An andere Leser APP_NAME = APP_PACKAGE_NAME.
Schneesturm
1
Was ist mit Python?
Babken Vardanyan
1
Danke dir! Für mich statt getClass().getResourceAsStream(...ich verwendet new FileInputStream(....
António Almeida
Vielen Dank. Sehr hilfreich. Ich musste jedoch auch hinzufügen: credential.refreshToken();zwischen dem Abrufen des Berechtigungsnachweises und dem Herausgeber.
Grooble
3

@ marc-greenstock lieferte eine großartige Antwort. Es gibt jedoch eine sehr wichtige Sache bei der Belegvalidierung mit der Google Play Android Developer API.

Wenn Sie Probleme mit der Verwendung dieser API haben und Ihr In-App-Produkt hinzugefügt haben, bevor Sie die Berechtigung erteilen oder eine Verknüpfung zu Ihrem Dienstkonto herstellen, müssen Sie "In-App-Produkte" öffnen und einige Aktualisierungen durchführen. Sie können beispielsweise die Beschreibung Ihres Produkts bearbeiten und speichern. Sie sollten sofort die Erlaubnis erhalten.

Ich habe ein paar Stunden darüber nachgedacht, was ich falsch gemacht habe ...

Wojciech Kulik
quelle
2

Diese Antwort ist ausgezeichnet. Ein weiteres Problem, auf das wir gestoßen sind, als wir der Anweisung gefolgt sind, war, dass das Dienstkonto nicht in der Google Play Console angezeigt wurde. Wir haben diese Lösung gefunden, um zu helfen: Das Dienstkonto wird nach der Erstellung nicht in Google Console angezeigt

Gehen Sie in der Google API Console zu IAM und fügen Sie das neue Dienstkonto hinzu. Anschließend wird es in der Google Play Console angezeigt. Bildschirmfoto

schweben
quelle
Können Sie hier eine Beschreibung hinzufügen? Andernfalls wird Ihre Antwort ungültig, wenn der Link widerrufen wird
Mathews Sunny
1
Welche Rolle sollte das hinzugefügte Konto spielen?
Adi