Android: validation du reçu d'achat inApp Google Play

92

J'utilise google wallet pour ma passerelle de paiement, après avoir acheté le produit google en me donnant une réponse ci-dessous qui

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

J'essaie d'utiliser la validation de reçu que Google Play a récemment introduite.Dans la console Google Developer, j'ai créé une clé de certificat par compte de service dans l'autorisation. Mais je ne sais pas comment utiliser la validation des reçus après avoir acheté un produit sur le Google Play-Store.

Quelqu'un peut-il donc m'aider à faire la validation du reçu d' InAppachat.

Binil Surendran
la source
Bonjour Binil, l'avez-vous complété pour l'achat d'un abonnement?
Anshul Tyagi
son produit de gestion @Anshul Tyag
Binil Surendran
@BinilSurendran .. Ma question est différente de votre question, mais j'ai besoin de connaître l'identifiant de messagerie utilisé pour l'achat via l'application. pouvez-vous s'il vous plaît aider comment je peux obtenir cet e-mail, car j'en ai besoin pour plus de référence dans mon application
Pallavi
@Pallavi. désolé, je n'ai pas l'idée d'obtenir l'identifiant de courriel de l'acheteur. comme la réponse donnée par google après l'achat n'a pas d'email_id
Binil Surendran

Réponses:

216

Google fournit la validation des reçus via l' API développeur de Google Play , dans l'API se trouvent deux points de terminaison qui vous intéresseront le plus: Purchases.products: get et Purchases.subscriptions: get .

Purchases.products: getpeut être utilisé pour vérifier un achat de produit sans renouvellement automatique, où Purchases.subscriptions: getest pour vérifier et revérifier les abonnements de produits à renouvellement automatique.

Pour utiliser des points d' extrémité , vous devez connaître le packageName, productId, purchaseTokentous ces éléments peuvent être trouvés dans la charge utile que vous avez reçu à l' achat. Vous avez également besoin d'un access_tokenque vous pouvez obtenir en créant un compte de service Google API.

Pour commencer avec un compte de service, accédez d'abord à la page des paramètres d'accès à l'API de la console développeur de Google play et cliquez sur le bouton Créer un projet:

Créer un nouveau projet d'API Google

Vous devriez maintenant voir un nouveau projet lié et quelques nouvelles sections, dans la section Compte de service, cliquez sur le bouton Créer un compte de service.

Créer un nouveau compte de service

Une boîte d'informations vous sera présentée avec des instructions pour créer votre compte de service. Cliquez sur le lien vers Google Developers Console et un nouvel onglet apparaîtra.

Ouvrez la Google Developers Console

Cliquez maintenant sur Créer un nouvel ID client, sélectionnez Compte de service dans les options et cliquez sur Créer un ID client.

Créer un nouvel ID client

Un fichier JSON sera téléchargé, c'est votre jeton Web JSON que vous utiliserez pour échanger contre un, access_tokenalors gardez-le en sécurité.

Ensuite, revenez à la console développeur de Google play et cliquez sur Terminé dans la zone d'informations. Vous devriez voir votre nouveau compte de service dans la liste. Cliquez sur Accorder l'accès à côté de l'e-mail du compte de service.

Accorder l'accès

Ensuite, sous Choisir un rôle pour cet utilisateur, sélectionnez Finance et cliquez sur Ajouter un utilisateur.

Définissez le rôle sur Finance

Vous avez maintenant configuré votre compte de service et il dispose de tous les accès nécessaires pour effectuer les validations de reçus. Ensuite, échangez votre JWT contre un access_token.

Le access_tokenexpire après une heure d'échange, vous avez donc besoin d'un code serveur pour gérer cela et Google a fourni plusieurs bibliothèques dans de nombreuses langues pour gérer cela (liste non exhaustive):

Je n'entrerai pas dans les détails car il y a beaucoup de documentation sur la façon d'utiliser ces bibliothèques, mais je mentionnerai que vous voulez utiliser le https://www.googleapis.com/auth/androidpublishercomme la portée OAuth2, le client_emaildu JWT comme le issueret la clé publique que vous pouvez obtenir du private_keyet la phrase de passe notasecretsera utilisée pour le signing_key.

Une fois que vous avez le, access_tokenvous êtes prêt à partir (au moins pour l'heure suivante, à quel point vous voudrez en demander un nouveau en suivant le même processus dans le paragraphe ci-dessus).

Pour vérifier l'état d'un achat de consommables (sans renouvellement automatique), faites une getdemande http à:https://www.googleapis.com/androidpublisher/v2/applications/com.example.app/purchases/products/exampleSku/tokens/rojeslcdyyiapnqcynkjyyjh?access_token=your_access_token

Si vous obtenez un code de réponse http 200, tout s'est déroulé comme prévu et votre achat était valide. Un 404 signifie que votre jeton est invalide, donc l'achat était très probablement une tentative de fraude. Un 401 signifiera que votre jeton d'accès est invalide et un 403 signifiera que votre compte de service a un accès insuffisant, vérifiez que vous avez activé Finance pour le compte d'accès dans la console développeur de Google Play.

La réponse d'un 200 ressemblera à ceci:

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

Pour une explication de chaque propriété, consultez https://developers.google.com/android-publisher/api-ref/purchases/products .

Les abonnements sont similaires, mais le point de terminaison ressemble à ceci:

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

Et la réponse doit contenir ces propriétés:

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

Voir https://developers.google.com/android-publisher/api-ref/purchases/subscriptions pour les descriptions des propriétés et notez que startTimeMilliset expiryTimeMillissera sujet à changement en fonction de la durée de l'abonnement.

Bonne validation!

Marc Greenstock
la source
J'ajoute un nouvel utilisateur dans la console développeur et j'ai un certificat JSON qui provient de la console.Pouvez-vous s'il vous plaît m'aider à faire la validation du reçu avec le fichier téléchargé @Marc Greenstock
Binil Surendran
@BinilS Vous devrez être plus précis, dans quel langage côté serveur allez-vous écrire votre code?
Marc Greenstock
J'utilise java côté serveur @Marc Greenstock
Binil Surendran
3
C'est la première fois que je vois un guide détaillé pour mettre en œuvre la validation de paiement serveur en 2 jours de recherche. Pouces vers le haut. Y a-t-il quelque part un code serveur prêt à l'emploi? Je trouve très étrange de ne pas trouver quelque chose comme ça nulle part
Anonyme
2
@MarcGreenstock Merci pour la réponse détaillée.
Lavakush
28

La réponse de Marc est excellente. J'ajouterai seulement que la bibliothèque cliente de l'API Google Play Developer pour Java simplifie considérablement la connexion de votre serveur aux serveurs Google Play. La bibliothèque gère automatiquement l'actualisation du jeton d'authentification et fournit également une API de type sécurisé pour que vous n'ayez pas à vous soucier des URL.

Voici comment vous configurez le Publishersingleton:

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

Le code suivant interroge un achat de produit:

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

Vous pouvez également rechercher des abonnements:

SubscriptionPurchase sub = publisher.purchases().subscriptions().get(PACKAGE_NAME, sku, token).execute();
sub.getAutoRenewing();
sub.getCancelReason();
...
Jeshurun
la source
C'est du code sur un serveur Java ou exécuté sur Android avant d'appeler un serveur arbitraire?
utilisateur
2
@jeshurun ​​Merci pour le code. Aux autres lecteurs APP_NAME = APP_PACKAGE_NAME.
blizzard
1
Et Python?
Babken Vardanyan
1
Merci! Pour moi au lieu de getClass().getResourceAsStream(...moi utilisé new FileInputStream(....
António Almeida
Merci. Très utile. Cependant, j'avais également besoin d'ajouter: credential.refreshToken();entre l'obtention des informations d'identification et l'éditeur.
grooble
5

@ marc-greenstock a fourni une excellente réponse, cependant, il y a une chose très importante à propos de la validation des reçus à l'aide de l'API Google Play Android Developer.

Si vous rencontrez des problèmes lors de l'utilisation de cette API et que vous avez ajouté votre produit intégré à l' application AVANT d' accorder l'autorisation ou de vous associer à votre compte de service, vous devez ouvrir "Produits intégrés à l' application" et effectuer une mise à jour. Vous pouvez par exemple modifier la description de votre produit et enregistrer. Vous devriez immédiatement obtenir la permission.

J'ai passé quelques heures à réfléchir à ce que j'avais fait de mal ...

Wojciech Kulik
la source
2

Cette réponse est excellente. Un autre problème que nous avons rencontré en suivant la direction était que le compte de service ne s'affichait pas dans la console Google Play. Nous avons fini par trouver cette solution pour vous aider: le compte de service n'apparaît pas dans la console Google après la création

En gros, accédez à IAM sur Google API Console et ajoutez le nouveau compte de service, puis il apparaîtra sur Google Play Console. capture d'écran

flambée
la source
Pouvez-vous ajouter une description ici. Sinon une fois si le lien est révoqué, votre réponse devient invalide
Mathews Sunny
1
Quel devrait être le rôle du compte ajouté?
Adi