Ich habe eine einfache App (benötigt Benutzer Login mit Konto). Ich biete einige Premium-Funktionen für bezahlte Benutzer, wie z. B. mehr Nachrichteninhalte.
Ich muss aufzeichnen, ob der Benutzer diesen Artikel in meiner Serverdatenbank gekauft hat. Wenn ich dem Benutzer Dateninhalte zur Verfügung stelle, kann ich den Status des Benutzers überprüfen und verschiedene Inhalte für bezahlte Benutzer bereitstellen.
Ich habe das offizielle Trivialdrive-Beispiel von Google überprüft. Es enthält keinen Beispielcode für die serverseitige Überprüfung. Hier sind meine Fragen.
- Ich habe festgestellt, dass das Beispiel den öffentlichen Schlüssel meiner App verwendet, um den Kauf zu überprüfen. Es sieht nicht gut aus. Ich denke, ich kann den Überprüfungsprozess einfach zusammen mit den Anmeldeinformationen des Benutzers auf meinen Server verschieben, um festzustellen, ob der Kauf des Benutzers abgeschlossen wurde, und dann die Datenbank aktualisieren.
- Außerdem gibt es eine Kauf-API, mit der ich abfragen kann. Ich muss das Kauf-Token des Benutzers an den Server übergeben.
Ich bin nicht sicher, wie ich den Kauf des Benutzers überprüfen und den Status des Benutzers in meiner Datenbank markieren soll, vielleicht beides?
Und ich befürchte, es gibt eine Situation, in der ein Nutzer diesen Artikel bei Google Play gekauft hat, aber aus irgendeinem Grund ist gerade in dieser Zeit, als meine App die Überprüfung meines Servers startete, die Netzwerkverbindung unterbrochen oder mein eigener Server ist ausgefallen . Benutzer hat gerade das Geld in Google Play bezahlt, aber ich habe den Kauf nicht auf meinem Server aufgezeichnet? Was soll ich tun, wie kann ich mit dieser Situation umgehen?
Antworten:
Es klingt so, als ob Sie nach einer Möglichkeit suchen, um zu überprüfen, ob für den Benutzer Premium-Funktionen in seinem Konto aktiviert sind. Hier würde ich also beginnen.
Stellen Sie sicher, dass Ihre Datenbank eine Art Flag enthält, das angibt, ob der Benutzer über Premium-Funktionen verfügt, und fügen Sie diese in die API-Antwortnutzlast ein, wenn Sie Kontoinformationen anfordern. Dieses Flag ist Ihre Hauptautorität für "Premium-Funktionen".
Wenn ein Benutzer einen In-App-Kauf tätigt, speichern Sie die Details (Token, Bestell-ID und Produkt-ID) lokal auf dem Client (dh der App) und senden Sie sie an Ihre API.
Ihre API sollte diese dann zur Validierung
purchaseToken
an die Google Play Developer API senden .Von hier aus könnten einige Dinge passieren:
Im Fall von 1. oder 2. (2xx- oder 4xx-Statuscodes) löscht Ihr Kunde den Cache mit Kaufdetails, da diese nicht mehr benötigt werden, da die API angegeben hat, dass sie empfangen wurden.
Nach einer erfolgreichen Validierung (Fall 1) sollten Sie das
premium
Flag für den Benutzer auf true setzen.Im Fall von 3. (5xx-Statuscode) oder einem Netzwerk-Timeout sollte der Client es so lange versuchen, bis er einen 2xx- oder 4xx-Statuscode von Ihrer API erhält.
Abhängig von Ihren Anforderungen können Sie einige Sekunden warten, bevor Sie erneut senden, oder die Details einfach an Ihre API senden, wenn die App erneut gestartet wird, oder den Hintergrund verlassen, wenn die Kaufdetails im App-Cache vorhanden sind.
Dieser Ansatz sollte Netzwerkzeitüberschreitungen, nicht verfügbare Server usw. berücksichtigen.
Es gibt jetzt einige Fragen, die Sie berücksichtigen müssen:
Was soll sofort nach dem Kauf passieren? Sollte die App warten, bis die Validierung erfolgreich ist, bevor sie Premium-Inhalte bereitstellt, oder sollte sie vorläufig Zugriff gewähren und diese entfernen, wenn die Validierung fehlschlägt?
Durch das Gewähren eines vorläufigen Zugriffs auf Premium-Funktionen wird der Prozess für die Mehrheit Ihrer Benutzer vereinfacht. Sie gewähren jedoch auch einer Reihe betrügerischer Benutzer Zugriff, während Ihre API das überprüft
purchaseToken
.Anders ausgedrückt: Der Kauf ist gültig, bis sich herausstellt, dass er betrügerisch ist oder; betrügerisch bis nachweislich gültig?
Um festzustellen, ob der Benutzer zum Zeitpunkt der Verlängerung seines Abonnementzeitraums noch ein gültiges Abonnement hat, müssen Sie eine erneute Validierung für die
purchaseToken
Ausführung planen , die mit demexpiryTimeMillis
im Ergebnis zurückgegebenen Abonnement ausgeführt werden soll .Wenn das
expiryTimeMillis
in der Vergangenheit liegt, können Sie daspremium
Flag auf false setzen. Wenn es in der Zukunft liegt, planen Sie es erneut für das neueexpiryTimeMillis
.Um sicherzustellen, dass der Benutzer über Premium-Zugriff verfügt (oder nicht), sollte Ihre App Ihre API nach den Benutzerdetails beim Start der App oder bei Hintergrundinformationen abfragen.
quelle
Die Dokumentation dazu ist verwirrend und seltsam ausführlich mit den Dingen, die fast belanglos sind, während die tatsächlich wichtige Dokumentation fast unverbunden und sehr schwer zu finden ist. Dies sollte auf den meisten gängigen Serverplattformen funktionieren, auf denen die Google API-Clientbibliotheken ausgeführt werden können, darunter Java, Python, .Net und NodeJS. Hinweis: Ich habe nur den Python-API-Client wie unten gezeigt getestet.
Notwendige Schritte:
Erstellen Sie ein API-Projekt über den API-Zugriffslink in Ihrer Google Play-Konsole
Erstellen Sie ein neues Dienstkonto und speichern Sie den generierten privaten JSON-Schlüssel. Sie müssen diese Datei auf Ihren Server bringen.
Klicken Sie im Abschnitt "Dienstkonto" der Play-Konsole auf "Fertig", um das Dienstkonto zu aktualisieren und anschließend Zugriff zu gewähren
Unter https://developers.google.com/api-client-library erhalten Sie eine Google API-Clientbibliothek für Ihre Serverplattform
Verwenden Sie die Clientbibliothek Ihrer Plattform, um eine Serviceschnittstelle zu erstellen und das Ergebnis Ihrer Kaufüberprüfung direkt zu lesen.
Sie müssen sich nicht um Autorisierungsbereiche kümmern, benutzerdefinierte Anfragen stellen, Zugriffstoken aktualisieren usw. Die API-Client-Bibliothek kümmert sich um alles. Hier ist ein Beispiel für die Verwendung der Python-Bibliothek, um ein Abonnement zu überprüfen:
Installieren Sie zunächst den Google API-Client wie folgt in Ihrem Pipenv:
Anschließend können Sie API-Client-Anmeldeinformationen mithilfe der JSON-Datei mit privatem Schlüssel zur Authentifizierung des Dienstkontos einrichten.
Jetzt können Sie Abonnementkäufe oder Produktkäufe direkt über die Bibliothek überprüfen.
Die Dokumentation für die Plattform-Service-Oberfläche für die Play Developer API ist nicht leicht zu finden, für einige ist sie ausgesprochen schwer zu finden . Hier sind die Links zu den beliebten Plattformen, die ich gefunden habe:
Python | Java | .NET | PHP | NodeJS (Github TS) | Los (Github JSON)
quelle
Vollständiges Beispiel für die Verwendung der Google API Client Library für PHP :
Richten Sie Ihr Google-Projekt ein und greifen Sie auf Google Play für Ihr Dienstkonto zu, wie in Marc's Antwort hier https://stackoverflow.com/a/35138885/1046909 beschrieben .
Installieren Sie die Bibliothek: https://developers.google.com/api-client-library/php/start/installation .
Jetzt können Sie Ihre Quittung folgendermaßen überprüfen:
Danach ist $ purchase eine Instanz von Google_Service_AndroidPublisher_SubscriptionPurchase
quelle
Sie können versuchen, Purchases.subscriptions zu verwenden: Server-seitig. Paketparameter, Abonnement-ID und Token werden als Parameter verwendet und müssen autorisiert werden .
Bei Erfolg gibt diese Methode eine Purchases.subscriptions-Ressource im Antworttext zurück.
quelle
Ich antworte auf diese Besorgnis
Die Situation ist:
Der Benutzer kauft "abc" über den Google Play-Dienst -> OK zurückgeben -> aus bestimmten Gründen, z. B. ohne Internetverbindung, keine Überprüfung beim Server.
Lösung ist:
Bevor Sie auf der Clientseite die Schaltfläche "Google Wallet" anzeigen, überprüfen Sie, ob das Element "abc" bereits im Besitz ist.
https://developer.android.com/google/play/billing/billing_reference.html#getSkuDetails
quelle