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
Ouvrez la console Google Cloud et choisissez un projet
console.cloud.google.comUtilisez 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
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
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
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
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é ?
#2. Lui donner accès dans Play Console
- 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
Accorder ces deux autorisations
Autorisations de l'application (App permissions) → Ajouter une application (Add app) → choisissez votre applicationCochez « 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
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
Google peut mettre jusqu'à un jour à l'activer
#3. L'associer à une clé API
- 1
Ouvrir la clé utilisée par votre application
Console → Clés API → ModifierUtilisez une clé dédiée à l'application (voir ci-dessous).
- 2
Remplir « Vérification des abonnements Google Play »
Configurer la vérification Google PlaySaisissez 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
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
#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.
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érification | Ce que fait l'application | Cause habituelle |
|---|---|---|
| active: true, in_trial: true | Débloquer. Afficher « Fin de l'essai » avec expiry_time. | Essai gratuit |
| active: true | Débloquer jusqu'à expiry_time. | Payé, y compris les abonnements annulés qui ne sont pas encore arrivés à échéance |
| subscribed: true, active: false | Bloquer et afficher un écran de renouvellement. | Expiré, suspendu, en attente |
| subscribed: false | Bloquer et afficher l'écran d'abonnement. | Jeton inconnu, paiement en attente |
| HTTP 502 / 503 | Conserver 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
#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é
#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.
Toujours bloqué ?
Envoyez-nous l'ID de requête ou le message d'erreur, et nous examinerons le problème.