J'ai une application simple (nécessite une connexion utilisateur avec un compte). Je propose des fonctionnalités premium aux utilisateurs payants, comme plus de contenu d'actualité.
Je dois enregistrer si l'utilisateur a acheté cet article dans la base de données de mon serveur. Lorsque je fournis du contenu de données à l'appareil de l'utilisateur, je peux alors vérifier l'état de l'utilisateur et fournir un contenu différent pour l'utilisateur payant.
J'ai vérifié l'exemple officiel de Trivialdrive fourni par Google, il ne fournit aucun exemple de code pour la vérification côté serveur, voici mes questions.
- J'ai trouvé que l'exemple utilise la clé publique de mon application à l'intérieur pour vérifier l'achat, cela ne semble pas bon, je pense que je peux simplement déplacer le processus de vérification sur mon serveur combiné avec les informations de connexion de l'utilisateur pour voir si l'achat de l'utilisateur est terminé, puis mettre à jour la base de données.
- Il existe également une API d'achat que je peux utiliser pour interroger, ce dont j'ai besoin est de transmettre le ticket d'achat de l'utilisateur au serveur.
Je ne suis pas sûr de la méthode à suivre pour vérifier l'achat de l'utilisateur et marquer le statut de l'utilisateur dans ma base de données, peut-être les deux?
Et j'ai peur qu'il y ait une situation, si un utilisateur a acheté cet article sur google play, mais pour une raison quelconque, juste à ce moment-là, lorsque mon application a lancé la vérification sur mon serveur, la connexion réseau est en panne ou mon propre serveur est en panne , l'utilisateur vient de payer l'argent dans google play mais je n'ai pas enregistré l'achat sur mon serveur? Que dois-je faire, comment puis-je gérer cette situation.
Réponses:
Il semble que ce que vous recherchez est un moyen de vérifier si l'utilisateur a des fonctionnalités premium activées sur son compte, c'est donc par là que je commencerais;
Assurez-vous qu'il existe un indicateur d'une sorte sur votre base de données indiquant si l'utilisateur dispose de fonctionnalités premium et incluez-le dans la charge utile de réponse de l'API lors de la demande d'informations sur le compte. Ce drapeau sera votre autorité principale pour les «fonctionnalités premium».
Lorsqu'un utilisateur effectue un achat dans l'application, mettez en cache les détails (jeton, ID de commande et ID de produit) localement sur le client (c'est-à-dire l'application), puis envoyez-les à votre API.
Votre API doit ensuite envoyer le
purchaseToken
à l' API Google Play Developer pour validation.Quelques choses peuvent se produire à partir d'ici:
Dans le cas de 1. ou 2. (codes de statut 2xx ou 4xx), votre client efface le cache des détails d'achat car il n'en a plus besoin car l'API a indiqué qu'il a été reçu.
Après une validation réussie (cas 1), vous devez définir l'
premium
indicateur sur true pour l'utilisateur.Dans le cas de 3. (code d'état 5xx) ou d'un délai d'expiration du réseau, le client doit continuer d'essayer jusqu'à ce qu'il reçoive un code d'état 2xx ou 4xx de votre API.
En fonction de vos besoins, vous pouvez le faire attendre quelques secondes avant de l'envoyer à nouveau ou simplement envoyer les détails à votre API chaque fois que l'application est lancée à nouveau ou sort de l'arrière-plan si les détails de l'achat sont présents dans le cache de l'application.
Cette approche doit prendre en charge les délais d'expiration du réseau, les serveurs indisponibles, etc.
Il y a maintenant quelques questions à considérer:
Que doit-il se passer immédiatement après un achat? L'application doit-elle attendre que la validation soit réussie avant de fournir un contenu premium ou doit-elle provisoirement accorder l'accès et le supprimer si la validation échoue?
L'octroi d'un accès provisoire aux fonctionnalités premium facilite le processus pour une majorité de vos utilisateurs, mais vous accorderez également l'accès à un certain nombre d'utilisateurs frauduleux pendant que votre API valide le
purchaseToken
.Pour le dire d'une autre manière: l'achat est valide jusqu'à ce qu'il soit prouvé frauduleux ou; frauduleux jusqu'à preuve de la validité?
Afin d'identifier si l'utilisateur a toujours un abonnement valide lorsque sa période d'abonnement arrive pour le renouvellement, vous devrez planifier une revalidation sur le
purchaseToken
à exécuter auexpiryTimeMillis
qui a été retourné dans le résultat .Si le
expiryTimeMillis
est dans le passé, vous pouvez définir l'premium
indicateur sur false. Si c'est dans le futur, reprogrammez-le à nouveau pour le nouveauexpiryTimeMillis
.Enfin, pour vous assurer que l'utilisateur dispose d'un accès premium (ou non), votre application doit interroger votre API pour obtenir les détails de l'utilisateur lors du lancement de l'application ou lorsqu'elle sort de l'arrière-plan.
la source
La documentation à ce sujet est déroutante et étrangement verbeuse avec les choses qui sont presque sans importance tout en laissant la documentation réellement importante presque sans lien et très difficile à trouver. Cela devrait fonctionner parfaitement sur la plate-forme de serveur la plus populaire capable d'exécuter les bibliothèques clientes de google api, notamment Java, Python, .Net et NodeJS. Remarque: j'ai testé uniquement le client api Python comme indiqué ci-dessous.
Etapes nécessaires:
Créez un projet d'API, à partir du lien d'accès à l'API dans votre console Google Play
Créez un nouveau compte de service, enregistrez la clé privée JSON qui est générée. Vous devrez apporter ce fichier sur votre serveur.
Appuyez sur Terminé dans la section du compte de service de la console Play pour actualiser, puis autoriser l'accès au compte de service
Obtenez une bibliothèque cliente google api pour votre plate-forme serveur à partir de https://developers.google.com/api-client-library
Utilisez la bibliothèque client de votre plate-forme particulière pour créer une interface de service et lire directement le résultat de votre vérification d'achat.
Vous n'avez pas besoin de vous soucier des portées d'autorisation, des appels de demandes personnalisées, de l'actualisation des jetons d'accès, etc., la bibliothèque cliente de l'API s'occupe de tout. Voici un exemple d'utilisation de la bibliothèque Python pour vérifier un abonnement:
Tout d'abord, installez le client google api dans votre pipenv comme ceci:
Ensuite, vous pouvez configurer les informations d'identification du client API à l'aide du fichier json de clé privée pour authentifier le compte de service.
Vous pouvez désormais vérifier directement les achats d'abonnements ou de produits à l'aide de la bibliothèque.
La documentation de l'interface de service de plate-forme pour l'API Play Developer n'est pas liée de manière facile à trouver, pour certains, elle est carrément difficile à trouver . Voici les liens vers les plateformes populaires que j'ai trouvées:
Python | Java | .NET | PHP | NodeJS (Github TS) | Aller (Github JSON)
la source
Exemple complet d'utilisation de la bibliothèque cliente des API Google pour PHP :
Configurez votre projet Google et accédez à Google Play pour votre compte de service comme décrit dans la réponse de Marc ici https://stackoverflow.com/a/35138885/1046909 .
Installez la bibliothèque: https://developers.google.com/api-client-library/php/start/installation .
Vous pouvez maintenant vérifier votre reçu de la manière suivante:
Après cet achat $ est une instance de Google_Service_AndroidPublisher_SubscriptionPurchase
la source
Vous pouvez essayer d'utiliser Purchases.subscriptions: get server-side. Il prend packageName, subscriptionId et token comme paramètres et nécessite une autorisation .
En cas de succès, cette méthode retourne une ressource Purchases.subscriptions dans le corps de la réponse.
la source
Je réponds à cette préoccupation
La situation est:
L'utilisateur achète l'élément 'abc' à l'aide du service Google Play -> retourne OK -> échoue à vérifier avec le serveur pour certaines raisons telles que l'absence de connexion Internet.
La solution est:
Côté client, avant d'afficher le bouton "Google Wallet", vous vérifiez si l'élément "abc" est déjà détenu.
https://developer.android.com/google/play/billing/billing_reference.html#getSkuDetails
la source