L'intégrer à votre application

Abonnements Google Play

Pour les applications Android qui vendent des abonnements via Google Play et n'ont pas de backend propre. Votre application envoie le jeton d'achat à la passerelle avec une clé API ; la passerelle interroge Google avec votre compte de service et indique si l'abonnement est actif. La vérification est gratuite.

#Avant de commencer

  • Un identifiant Play Console propriétaire du compte ou administrateur, pour pouvoir inviter des utilisateurs.
  • Un compte Google capable de créer un projet dans la console Google Cloud (n'importe quel compte Google le peut).
  • Le nom de package de votre application (applicationId), par exemple com.example.app, et au moins un produit d'abonnement créé dans Play Console.
  • Environ 15 minutes de clics, puis jusqu'à un jour pour que Google active l'autorisation.

#1. Obtenir le JSON du compte de service

Le fichier JSON est la clé du compte de service. Il permet à la passerelle d'interroger Google sur les achats de votre application, et rien d'autre. Google l'appelle clé de compte de service ; ce n'est pas le fichier client OAuth (client_secret_….json).

  1. 1

    Ouvrez la console Google Cloud et choisissez un projet

    console.cloud.google.com

    Utilisez le sélecteur de projet en haut. N'importe quel projet convient ; en créer un dédié aux vérifications Play permet de rester organisé.

  2. 2

    Activer l'API Play

    API et services (APIs & Services) → Bibliothèque (Library) → Google Play Android Developer API → Activer (Enable)

    Recherchez le nom exact. Si le bouton indique Gérer (Manage), l'API est déjà activée.

  3. 3

    Créer le compte de service

    IAM et administration (IAM & Admin) → Comptes de service (Service accounts) → Créer un compte de service (Create service account)

    Donnez-lui n'importe quel nom, par exemple play-verify. Ignorez les étapes facultatives qui accordent des rôles sur le projet ou un accès utilisateur : il n'a besoin d'aucun rôle Cloud. Cliquez sur OK (Done).

  4. 4

    Télécharger sa clé JSON

    Ouvrez le compte de service → Clés (Keys) → Ajouter une clé (Add key) → Créer une clé (Create new key) → JSON → Créer (Create)

    Le navigateur télécharge un fichier .json. Conservez-le en lieu sûr : Google ne le montre plus jamais, et toute personne qui le possède peut lire les achats de votre application.

  5. 5

    Copier l'adresse e-mail du compte de service

    Elle ressemble à play-verify@your-project.iam.gserviceaccount.com et s'affiche sur la page du compte de service ainsi que dans le fichier, sous client_email. Vous en aurez besoin à l'étape suivante.

« Créer une clé » est grisé ou refusé ?

Votre organisation Google Cloud bloque le téléchargement des clés avec la règle iam.disableServiceAccountKeyCreation (activée par défaut pour les nouvelles organisations). Un administrateur de l'organisation peut la désactiver pour ce projet dans IAM et administration → Règles d'administration (Organization policies), ou vous pouvez utiliser un projet hors de l'organisation.

#2. Lui donner accès dans Play Console

  1. 1

    Inviter le compte de service

    play.google.com/console → Utilisateurs et autorisations (Users and permissions) → Inviter de nouveaux utilisateurs (Invite new users)

    Collez l'adresse e-mail du compte de service comme adresse e-mail. Un compte de service n'a pas besoin d'accepter l'invitation.

  2. 2

    Accorder ces deux autorisations

    Autorisations de l'application (App permissions) → Ajouter une application (Add app) → choisissez votre application

    Cochez « Afficher les données financières, les commandes et les réponses aux enquêtes sur les résiliations » (View financial data, orders, and cancellation survey responses) et « Gérer les commandes et les abonnements » (Manage orders and subscriptions). Laissez tout le reste décoché. Cocher ces deux mêmes autorisations dans Autorisations du compte (Account permissions) couvre toutes vos applications.

  3. 3

    Envoyer l'invitation

    Appliquer (Apply) → Inviter l'utilisateur (Invite user)

    Le compte de service apparaît désormais dans Utilisateurs et autorisations avec l'état Actif (Active).

Pourquoi ces autorisations

La passerelle se contente de lire un abonnement avec purchases.subscriptionsv2.get de Google. Google exige les autorisations sur les données financières et les commandes pour cette lecture. La passerelle ne confirme, ne rembourse et n'annule jamais rien.

Google peut mettre jusqu'à un jour à l'activer

D'ici là, les vérifications renvoient google_play_permission_denied. Modifier un produit d'abonnement dans Play Console (changer sa description, enregistrer, puis rétablir) permet souvent d'appliquer plus vite la nouvelle autorisation.

#3. L'associer à une clé API

  1. 1

    Ouvrir la clé utilisée par votre application

    Console → Clés API → Modifier

    Utilisez une clé dédiée à l'application (voir ci-dessous).

  2. 2

    Remplir « Vérification des abonnements Google Play »

    Configurer la vérification Google Play

    Saisissez le nom de package exactement comme dans le build.gradle de votre application (applicationId), choisissez le fichier JSON de l'étape 1, puis enregistrez.

  3. 3

    Lire le message affiché à l'enregistrement

    La passerelle teste le fichier auprès de Google avant de le stocker. Si Google refuse encore, la boîte de dialogue indique ce qui manque, généralement l'API de l'étape 1 ou l'autorisation de l'étape 2. Le fichier est stocké chiffré et n'est plus jamais affiché ; importez-le de nouveau pour le remplacer.

Utilisez une clé dédiée à l'application

Les paramètres Google Play sont propres à une clé. Créez une clé distincte pour l'application, limitez-la aux modèles qu'elle utilise et attribuez-lui un plafond de quota.

#4. Vérifier depuis l'application

Vérifiez juste après un achat, puis à chaque ouverture de l'application avec le jeton enregistré. Ne bloquez pas le démarrage de l'application en attendant la réponse : affichez le dernier résultat enregistré et mettez-le à jour au retour de la vérification. Un même jeton reçoit une réponse issue d'un cache d'une minute. Chaque clé peut effectuer 120 vérifications par minute par défaut ; les paramètres Google Play de la clé indiquent sa limite actuelle, et le support peut l'augmenter pour une clé. Les appels au-delà de la limite renvoient 429 et ne sont pas journalisés : conservez donc la dernière réponse enregistrée.

google_play.dart
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:in_app_purchase/in_app_purchase.dart';

const apiKey = 'sk-YOUR_KEY';

Future<Map<String, dynamic>?> checkSubscription(String purchaseToken) async {
  final res = await http.post(
    Uri.parse('https://www.aisplice.store/v1/google-play/verify'),
    headers: {
      'Authorization': 'Bearer $apiKey',
      'Content-Type': 'application/json',
      // Request signing on for this key? Then this call must be signed too:
      // ...signedHeaders('POST', '/v1/google-play/verify'),
    },
    body: jsonEncode({'purchase_token': purchaseToken}),
  );
  if (res.statusCode != 200) return null; // keep the last saved answer
  return jsonDecode(res.body) as Map<String, dynamic>;
}

// In your purchaseStream listener:
Future<void> onPurchase(PurchaseDetails purchase) async {
  if (purchase.status != PurchaseStatus.purchased &&
      purchase.status != PurchaseStatus.restored) return;
  final token = purchase.verificationData.serverVerificationData;
  final status = await checkSubscription(token);
  if (status != null && status['active'] == true) {
    await saveEntitlement(token, status); // your local storage
    unlockPaidFeatures();
  }
  if (purchase.pendingCompletePurchase) {
    await InAppPurchase.instance.completePurchase(purchase); // acknowledges on Android
  }
}

#5. Décider quoi débloquer

Réponse de la vérificationCe que fait l'applicationCause habituelle
active: true, in_trial: trueDébloquer. Afficher « Fin de l'essai » avec expiry_time.Essai gratuit
active: trueDébloquer jusqu'à expiry_time.Payé, y compris les abonnements annulés qui ne sont pas encore arrivés à échéance
subscribed: true, active: falseBloquer et afficher un écran de renouvellement.Expiré, suspendu, en attente
subscribed: falseBloquer et afficher l'écran d'abonnement.Jeton inconnu, paiement en attente
HTTP 502 / 503Conserver la dernière réponse enregistrée et réessayer plus tard.Google ou le compte de service ne répond pas

Enregistrez expiry_time avec la réponse. Entre deux vérifications, considérez l'abonnement comme utilisable jusqu'à cette date : un téléphone hors ligne continue ainsi de fonctionner.

#6. Confirmer chaque achat

Les achats non confirmés sont remboursés au bout de 3 jours

La passerelle ne fait que lire l'abonnement ; elle ne le confirme jamais. Votre application doit appeler completePurchase (Flutter) ou acknowledgePurchase (Play Billing). Si la vérification renvoie acknowledged: false pour un achat datant de plus de quelques minutes, l'application ne l'a pas encore fait.

#7. Protéger la clé dans l'application

Une clé intégrée à une application peut être lue à partir du trafic capturé. Activez la signature des requêtes pour cette clé afin qu'une clé copiée ne puisse pas être utilisée seule, obfusquez le build et gardez un plafond de quota sur la clé.

La signature couvre chaque appel effectué avec la clé

Une fois la signature activée, /v1/google-play/verify nécessite X-Timestamp, X-Nonce et X-Signature comme toute autre requête effectuée avec cette clé, sinon il répond 401 signature_required. Signez-le avec son propre chemin : signedHeaders('POST', '/v1/google-play/verify'). N'activez la signature qu'une fois publiée la version de l'application qui signe.

Signature des requêtes pour les applications →

#8. Consulter l'historique des vérifications

Chaque vérification, y compris les réponses en cache et les échecs, est listée dans Console → Journal des requêtes en tant que « Vérification Google Play » gratuite sur la clé. Recherchez par jeton d'achat complet, par ses derniers caractères ou par l'ID de commande (GPA.…) qu'un utilisateur vous transmet depuis l'e-mail de reçu de Google.

  • google_play_api_disabled : l'API Play de l'étape 1 n'est pas activée dans le projet auquel appartient le fichier JSON.
  • google_play_permission_denied : l'invitation de l'étape 2 est absente, n'a pas les deux autorisations, concerne une autre application ou n'est pas encore active.
  • google_play_credentials_invalid : la clé JSON a été supprimée ou désactivée dans Google Cloud. Créez une nouvelle clé et importez-la sur la clé API.
  • L'enregistrement indique que le fichier n'est pas une clé de compte de service : vous avez choisi le fichier client OAuth. Téléchargez plutôt la clé depuis l'onglet Clés du compte de service.
  • Chaque vérification indique que l'achat est introuvable : le nom de package de la clé diffère de l'applicationId de l'application, ou le jeton provient d'une autre application.
  • Les achats de test effectués par des testeurs de licence renvoient test_purchase: true.

Tous les champs et codes d'erreur →

Toujours bloqué ?

Envoyez-nous l'ID de requête ou le message d'erreur, et nous examinerons le problème.