Aller au contenu

Règles de révision du Play Store Android pour les IAP

GitHub

Pour faire approuver votre application Android sur Google Play, vous devez respecter les politiques de Google, en particulier pour les applications avec achats intégrés et abonnements. Ce guide couvre tout ce qu'il faut pour passer la validation avec succès.

  1. Générer un Android App Bundle signé

    Les nouvelles applications Google Play doivent être envoyées sous forme d'Android App Bundle (.aab), et non via un APK de debug sideloadé.

    Incrémentez votre versionCode à chaque upload et conservez votre clé d'upload en sécurité si vous utilisez Play App Signing.

    Flux Android App Bundle

  2. Créer la fiche de l'application dans la Play Console

    Si vous n'avez pas encore de compte développeur, commencez par l'inscription à la Play Console. Ensuite, dans Accueil > Créer une application, choisissez la langue, le type d'app/jeu, le statut gratuit/payant, l'e-mail de support et acceptez les déclarations requises.

    Choisissez bien l'option gratuit/payant. Google permet de rendre une application payante gratuite plus tard, mais une fois qu'une application a été proposée gratuitement, elle ne peut plus devenir payante.

    Créer l'application dans la Play Console

  3. Compléter le contenu de l'app et la fiche du store

    Avant l'examen de production, terminez les déclarations obligatoires de la Play Console :

    • Politique de confidentialité
    • Publicités
    • Accès aux apps
    • Public cible et contenu
    • Classification du contenu
    • Data Safety
    • Déclarations de permissions sensibles, le cas échéant
  4. Lancer un canal de test Play

    Commencez par test interne pour une QA rapide. Si votre compte développeur est un compte personnel créé après le 13 novembre 2023, vous devez également effectuer un test fermé avec au moins 12 testeurs inscrits pendant 14 jours consécutifs avant l'accès à la production.

    Test interne dans la Play Console

  5. Vérifier la facturation de bout en bout

    Installez l'app depuis Google Play, et non via un APK exporté localement. Confirmez ensuite que :

    • Les produits se chargent correctement depuis Play
    • La feuille d'achat affiche une bannière d'achat de test pour les testeurs de licence
    • Les entitlements se débloquent après l'achat
    • Les flux de restauration et de gestion des abonnements fonctionnent

Pour les biens et services numériques, vous devez use Google Play’s billing system:

Biens numériques (Play Billing obligatoire) :

  • Abonnements aux fonctionnalités premium
  • Monnaie virtuelle ou crédits in-app
  • Contenu numérique (ebooks, musique, vidéos)
  • Améliorations et bonus de jeu
  • Déblocages d'app et niveaux premium

Biens physiques (Play Billing interdit) :

  • Produits dérivés physiques
  • Services dans le monde réel
  • Dons ponctuels à des organismes à but non lucratif

:::note Configuration des abonnements Dans la Play Console, configurez les abonnements Android en utilisant la structure : abonnement -> base plan -> offre modèle. In native-purchases, passez l'ID du Base Plan avec planIdentifier. :::

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Ensure billing is available on the device
const { isBillingSupported } = await NativePurchases.isBillingSupported();
if (!isBillingSupported) throw new Error('Google Play Billing not available');
// Fetch subscription products (Store data is required—never hardcode pricing)
const { products } = await NativePurchases.getProducts({
productIdentifiers: ['premium_monthly', 'premium_yearly'],
productType: PURCHASE_TYPE.SUBS,
});
// Plan identifiers are the Base Plan IDs you create in Google Play Console
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly',
planIdentifier: 'monthly-plan', // REQUIRED on Android, ignored on iOS
productType: PURCHASE_TYPE.SUBS,
});
console.log('Purchase token for server validation:', transaction.purchaseToken);

Google Play impose une divulgation claire de tous les coûts avant l'achat :

Éléments requis :

  • Prix exact dans la devise locale de l'utilisateur
  • Fréquence de facturation (mensuelle, annuelle, etc.)
  • Ce qui est inclus dans l'abonnement
  • Coût total des offres d'introduction
  • Périodicité des prélèvements

Bonnes pratiques de design UI

Exemple d'interface conforme :

function SubscriptionCard({ product }) {
return (
<div className="subscription-card">
<h3>{product.title}</h3>
{/* Show intro offer if available */}
{product.introductoryPrice && (
<div className="intro-offer">
<p className="intro-price">{product.introductoryPriceString}</p>
<p className="intro-period">
for {product.introductoryPricePeriod}
</p>
</div>
)}
{/* Regular price */}
<div className="regular-price">
<p className="price">{product.priceString}</p>
<p className="period">per {product.subscriptionPeriod}</p>
</div>
{/* Clear description */}
<p>{product.description}</p>
{/* Renewal terms */}
<p className="terms">
Renews automatically. Cancel anytime in Google Play.
</p>
<button onClick={() => handlePurchase(product)}>
Subscribe Now
</button>
</div>
);
}

Mention du renouvellement automatique

Section titled “Auto-Renewal Disclosure”

Avant le renouvellement automatique d'un abonnement, Google exige :

  • Notification claire du renouvellement à venir
  • Reminder of the price
  • Accès facile à la résiliation

Si vous vendez le même droit d'accès (entitlement) sur plusieurs plateformes, veillez à ce que le nom du produit, la période de facturation, les avantages inclus et les modalités de renouvellement soient cohérents pour ne pas surprendre les utilisateurs.

Les prix peuvent légitimement varier en raison des taxes, de la devise locale ou de l'économie des stores, mais l'interface d'achat ne doit jamais masquer ces différences ni suggérer un coût de renouvellement différent de celui facturé par Google Play.

Exigences pour la politique de confidentialité

Section titled “Privacy Policy Requirements”

Politique de confidentialité obligatoire

Section titled “Mandatory Privacy Policy”

Si votre application inclut des achats in-app, vous devez :

  1. Lien dans la fiche du Play Store

    • Add privacy policy URL in Play Console
    • Doit être accessible publiquement
    • Doit être dans la même langue que votre application
  2. Lien au sein de l'application

    • Display privacy policy in app settings
    • Afficher avant de collecter des données utilisateur
    • Rendre l'accès facile à trouver

Exemple d'implémentation :

function SettingsScreen() {
const openPrivacyPolicy = () => {
window.open('https://yourapp.com/privacy', '_blank');
};
const openTerms = () => {
window.open('https://yourapp.com/terms', '_blank');
};
return (
<div>
<h2>Settings</h2>
<button onClick={openPrivacyPolicy}>
Privacy Policy
</button>
<button onClick={openTerms}>
Terms of Service
</button>
<button onClick={() => NativePurchases.manageSubscriptions()}>
Manage Subscriptions
</button>
</div>
);
}

Google Play exige une déclaration détaillée dans la section Sécurité des données :

Pour les applications avec IAP, déclarez :

  • La collecte de l'historique d'achats
  • Les adresses e-mail (pour les reçus)
  • Identifiants d'appareil (prévention de la fraude)
  • Gestion des informations de paiement
  • Collecte de données analytiques

La section Sécurité des données est juridiquement contraignante. Des déclarations inexactes peuvent entraîner le retrait de l'application.

Déclarations de contenu de l'application

Section intitulée « Déclarations de contenu d'app »

La revue Google Play ne porte pas uniquement sur le binaire. Avant une release en production, complétez les déclarations sur Policy and programs > App content.

Éléments minimums à examiner attentivement :

  • Politique de confidentialité: URL publique dans la Play Console, plus un point d'entrée dans l'app si nécessaire
  • Publicités: Déclarer si l'application contient des publicités
  • Accès aux apps: Fournir des identifiants de test ou un parcours clair si un écran est protégé
  • Public cible et contenu: Correspondre à l'audience réelle de l'application
  • Classifications de contenu: Remplir le questionnaire IARC pour éviter que l'app ne soit non classée
  • Data Safety: Déclarez avec précision vos pratiques de collecte, de partage et de sécurité

Pourquoi cela échoue :

  • Non-utilisation de Google Play Billing pour les biens numériques
  • Utilisation d'API de facturation obsolètes
  • Implémenter des solutions de paiement personnalisées pour les abonnements

Prévention :

// ✅ Correct: Use native-purchases (uses Google Play Billing)
await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly',
planIdentifier: 'monthly-plan',
productType: PURCHASE_TYPE.SUBS,
});
// ❌ Wrong: Custom payment processor for subscriptions
// await CustomPayment.charge(user, 9.99);

Pourquoi cela échoue :

  • Prix affiché uniquement après avoir cliqué sur l'achat
  • Frais supplémentaires non divulgués au préalable
  • Conditions d'abonnement vagues

Prévention :

function PurchaseScreen({ product }) {
return (
<div>
{/* Show ALL costs upfront */}
<h2>Premium Subscription</h2>
<div className="pricing">
<p className="price">{product.priceString}/month</p>
<p className="taxes">Taxes may apply based on location</p>
</div>
<div className="features">
<h3>Includes:</h3>
<ul>
<li>Ad-free experience</li>
<li>Unlimited cloud storage</li>
<li>Priority support</li>
</ul>
</div>
<div className="terms">
<p>
Subscription renews automatically unless cancelled at least
24 hours before the end of the current period.
</p>
<p>
Manage or cancel in Google Play Subscriptions.
</p>
</div>
<button onClick={handlePurchase}>
Start Subscription
</button>
</div>
);
}

Pourquoi cela échoue :

  • Pré-sélection des options premium
  • Masquer les alternatives moins chères
  • Rendre la résiliation difficile
  • Fausse urgence (« Plus que 3 places ! »)

Bonnes pratiques de description

Directives marketing

Prévention :

  • Afficher tous les paliers d'abonnement de façon équitable
  • Rendre l'annulation claire et accessible
  • Éviter les comptes à rebours ou la fausse rareté
  • Ne pas utiliser de dark patterns pour imposer des options coûteuses

Pourquoi cela échoue :

  • L'application crash lors de l'achat
  • Les produits ne se chargent pas
  • La confirmation d'achat ne s'affiche pas
  • Les fonctionnalités premium ne se débloquent pas après l'achat
  • Tests effectués uniquement sur des builds sideloadés au lieu d'une piste de test installée via le Play Store

Prévention :

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Comprehensive testing before submission
async function testPurchaseFlow() {
try {
// 1. Test product loading
const { products } = await NativePurchases.getProducts({
productIdentifiers: ['premium_monthly', 'premium_yearly'],
productType: PURCHASE_TYPE.SUBS,
});
console.log('✓ Products loaded:', products.length);
// 2. Test purchase flow
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly',
planIdentifier: 'monthly-plan',
productType: PURCHASE_TYPE.SUBS,
});
console.log('✓ Purchase completed', transaction.transactionId);
// 3. Verify entitlements
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
if (
purchases.some(
(purchase) =>
purchase.productIdentifier === 'premium_monthly' &&
['PURCHASED', '1'].includes(purchase.purchaseState ?? '') &&
purchase.isAcknowledged,
)
) {
console.log('✓ Premium features unlocked');
}
// 4. Test restore
await NativePurchases.restorePurchases();
console.log('✓ Restore works');
} catch (error) {
console.error('✗ Test failed:', error);
}
}

5. Violations de la politique de confidentialité

Section titled “5. Privacy Policy Violations”

Pourquoi cela échoue :

  • Aucun lien vers la politique de confidentialité dans l'app
  • Politique de confidentialité inaccessible
  • Collecte de données non divulguée
  • Section Sécurité des données inexacte

Prévention :

  • Add privacy policy to Play Store listing
  • Inclure le lien dans les paramètres de l'app
  • Remplir avec précision la section Sécurité des données
  • Update policy when adding new data collection

Les programmes de facturation alternatifs de Google sont spécifiques à chaque région et peuvent évoluer. Si vous souhaitez utiliser une option autre que le Google Play Billing standard, vérifiez immédiatement l'éligibilité du marché, les API requises et les mentions légales dans la Play Console avant l'implémentation.

Les utilisateurs doivent pouvoir :

  • Consultez facilement les abonnements actifs
  • Annulez sans contacter le support
  • Comprenez quand l'annulation prend effet

Implémentation :

import { NativePurchases } from '@capgo/native-purchases';
function ManageSubscriptionButton() {
const openManagement = async () => {
try {
// Opens Google Play subscription management
await NativePurchases.manageSubscriptions();
} catch (error) {
// Fallback to direct URL
const playStoreUrl = 'https://play.google.com/store/account/subscriptions';
window.open(playStoreUrl, '_blank');
}
};
return (
<button onClick={openManagement}>
Manage Subscription in Google Play
</button>
);
}

Divulgation requise :

  • Quand l'annulation prend-elle effet ?
  • Do users keep access until period ends?
  • Des remboursements partiels sont-ils disponibles ?
function CancellationInfo() {
return (
<div className="cancellation-info">
<h3>Cancellation Policy</h3>
<ul>
<li>Cancel anytime in Google Play</li>
<li>Access continues until end of billing period</li>
<li>No refunds for partial periods</li>
<li>Resubscribe anytime to regain access</li>
</ul>
<button onClick={() => NativePurchases.manageSubscriptions()}>
Manage in Google Play
</button>
</div>
);
}

Checklist pré-soumission

  1. Vérifier l'implémentation de la facturation

    • Utiliser Google Play Billing (via native-purchases)
    • Tous les produits d'abonnement créés dans la Play Console
    • Plans de base et offres configurés correctement
    • Les produits sont activés et publiés
    • Tarifs définis pour tous les pays cibles
  2. Tester les flux d'achat

    • Créer un compte de test de licence
    • Installer le build depuis un canal de test Play
    • Tester chaque niveau d'abonnement
    • Vérifier le chargement des produits
    • Tester la finalisation de l'achat
    • Confirmer que la bannière d'achat de test bannière s'affiche
    • Vérifier le déblocage du premium
    • Tester la restauration de l'abonnement
    • Tester sur plusieurs appareils
  3. Réviser tous les textes

    • Tarifs affichés clairement avant l'achat
    • Tous les frais indiqués dès le départ
    • Conditions d'abonnement claires
    • Processus d'annulation expliqué
    • Aucune déclaration trompeuse
  4. Contenu et confidentialité de l'app

    • Politique de confidentialité liée dans la Play Console
    • Politique de confidentialité accessible dans l'app
    • Déclaration des publicités complétée
    • Instructions d'accès ajoutées si l'accès à l'app est restreint
    • Section Sécurité des données correctement remplie
    • Permissions justifiées et documentées
  5. Classification du contenu et audience

    • Remplir le questionnaire de classification du contenu
    • Compléter la section audience cible et contenu
    • S'assurer que la note correspond au contenu
    • Déclarer les achats in-app dans le questionnaire
  6. Préparer la fiche du store

    • Description de l'app précise
    • La description courte fait moins de 80 caractères
    • La description complète fait moins de 4000 caractères
    • Au moins 2 captures d'écran de téléphone envoyées
    • Graphisme de présentation 1024x500 envoyé
    • Les captures d'écran montrent la version actuelle
    • Tous les assets requis sont envoyés

Accès à la production pour les nouveaux comptes personnels : Généralement 7 jours ou moins après la demande Premier examen de production : Souvent plusieurs jours, parfois plus si des questions de facturation ou de politique sont soulevées Mises à jour : Souvent plus rapide qu'une première release, mais reste soumis à examen Appels : Prévoyez plusieurs jours et fournissez des correctifs précis ainsi que des instructions pour l'examinateur

:::tip Examens continus Contrairement à Apple, Google examine les apps en continu. Votre app peut être publiée à tout moment pendant la période d'examen, et non à un moment fixe. :::

  1. Ajouter un compte de test :

    • Accéder à la Play Console
    • Paramètres > Test de licence
    • Ajouter un compte Gmail pour les tests
  2. Tester en mode Sandbox :

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Test purchases with license test account
async function testInSandbox() {
const { isBillingSupported } = await NativePurchases.isBillingSupported();
if (!isBillingSupported) {
console.error('Billing not supported in this environment');
return;
}
// Fetch products (returns test pricing when using a license tester)
const { products } = await NativePurchases.getProducts({
productIdentifiers: ['premium_monthly'],
productType: PURCHASE_TYPE.SUBS,
});
console.log('Test products:', products);
// Make test purchase (no charge)
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly',
planIdentifier: 'monthly-plan',
productType: PURCHASE_TYPE.SUBS,
});
console.log('Test purchase complete:', transaction.transactionId);
}
  1. Vérifier la bannière de test :
    • Lors d'un achat avec un compte de test
    • La notification « Achat de test » doit s'afficher
    • Aucun débit réel n'est effectué

Avant la release en production :

  1. Créez un fichier test interne canal pour un QA rapide ou un test fermé canal pour des tests plus larges
  2. Envoyez un build signé .aab et publiez la release de test
  3. Ajoutez les e-mails des testeurs et partagez le lien d'inscription
  4. Demandez aux testeurs d'installer le build via Google Play
  5. Verify purchase flows work end-to-end on the Play-installed build
  6. Si votre compte développeur personnel a été créé après le 13 novembre 2023, maintenez au moins 12 testeurs inscrits à un test fermé pendant 14 jours consécutifs avant de demander l'accès à la production

Un build de debug sideloadé ne remplace pas un build de test installé via le Play Store pour valider Google Play Billing.

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
async function handlePurchase(productId: string, planIdentifier?: string) {
try {
setLoading(true);
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: productId,
planIdentifier,
productType: planIdentifier ? PURCHASE_TYPE.SUBS : PURCHASE_TYPE.INAPP,
});
console.log('Purchase token:', transaction.purchaseToken ?? transaction.receipt);
// Success - check entitlements from the store
const { purchases } = await NativePurchases.getPurchases({
productType: planIdentifier ? PURCHASE_TYPE.SUBS : PURCHASE_TYPE.INAPP,
});
const isOwned = purchases.some(
(purchase) =>
purchase.productIdentifier === productId &&
(purchase.purchaseState === 'PURCHASED' || purchase.purchaseState === '1') &&
purchase.isAcknowledged,
);
if (isOwned) {
unlockPremiumFeatures();
showSuccess('Premium activated!');
}
} catch (error: any) {
// Handle specific error cases
switch (error.code) {
case 'USER_CANCELLED':
// User backed out - no error needed
console.log('Purchase cancelled');
break;
case 'ITEM_ALREADY_OWNED':
// They already own it - restore instead
showInfo('You already own this! Restoring...');
await NativePurchases.restorePurchases();
break;
case 'ITEM_UNAVAILABLE':
showError('This subscription is currently unavailable. Please try again later.');
break;
case 'NETWORK_ERROR':
showError('Network error. Please check your connection and try again.');
break;
default:
showError('Purchase failed. Please try again.');
console.error('Purchase error:', error);
}
} finally {
setLoading(false);
}
}
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
function RestorePurchasesButton() {
const [loading, setLoading] = useState(false);
const handleRestore = async () => {
setLoading(true);
try {
await NativePurchases.restorePurchases();
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
const hasSubscription = purchases.some(
(purchase) => purchase.productType === 'subs' && purchase.isAcknowledged,
);
if (hasSubscription) {
unlockPremiumFeatures();
showSuccess('Subscriptions restored!');
return;
}
// Check one-time unlocks if needed
const { purchases: iaps } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.INAPP,
});
const hasInApp = iaps.some((purchase) => purchase.productIdentifier === 'premium_unlock');
if (hasInApp) {
unlockPremiumFeatures();
showSuccess('Previous purchases restored!');
return;
}
showInfo('No previous purchases found.');
} catch (error) {
showError('Failed to restore purchases. Please try again.');
} finally {
setLoading(false);
}
};
return (
<button onClick={handleRestore} disabled={loading}>
{loading ? 'Restoring...' : 'Restore Purchases'}
</button>
);
}
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
async function checkSubscriptionStatus() {
try {
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
const subscription = purchases.find(
(purchase) =>
purchase.productIdentifier === 'premium_monthly' &&
(purchase.purchaseState === 'PURCHASED' || purchase.purchaseState === '1') &&
purchase.isAcknowledged,
);
if (!subscription) {
showPaywall();
return;
}
console.log('Subscription active:', {
productId: subscription.productIdentifier,
expiresAt: subscription.expirationDate,
willRenew: subscription.willCancel === false,
purchaseToken: subscription.purchaseToken,
});
unlockPremiumFeatures();
} catch (error) {
console.error('Failed to check subscription:', error);
}
}

Politique de paiement :

  • Non-utilisation de Google Play Billing
  • Conditions d'abonnement trompeuses
  • Coûts cachés

Politique de données utilisateur :

  • Absence de politique de confidentialité
  • Déclarations de sécurité des données inexactes
  • Permissions excessives
  1. Examiner l'avis de violation

    • Lire la politique spécifique citée
    • Comprendre ce que Google a signalé
    • Consulter les exemples fournis
  2. Corriger le problème

    • Traiter la cause racine, pas seulement les symptômes
    • Tester rigoureusement après la correction
    • Documenter tous les changements effectués
  3. Déposer un recours (le cas échéant)

    Procédure de clarification et de recours

    Subject: Policy Violation Appeal - [App Name]
    Dear Google Play Review Team,
    I have received notification that my app violates [Policy X.Y].
    I have made the following changes to comply:
    1. [Specific change made]
    2. [Specific change made]
    3. [Specific change made]
    The updated version [version number] addresses all concerns raised.
    Test account for verification:
    Email: test@example.com
    Password: TestPass123
    Thank you for your consideration.

    Exemple de demande de documentation

  4. Resoumettre ou mettre à jour

    • Envoyer la version corrigée
    • Resoumettre pour examen
    • Suivre le statut dans la Play Console

Naviguer dans la revue du Play Store peut être complexe, surtout lorsqu'il faut combiner la conformité de la facturation, les déclarations de contenu de l'application et la configuration des canaux de test. Si vous avez besoin d'une assistance personnalisée :

Réserver un appel de consultation avec notre équipe pour obtenir de l'aide sur :

  • Préparer la revue du Play Store
  • Configuration du canal de test et recrutement des testeurs
  • la revue de l'implémentation IAP
  • Sécurité des données et conformité à la vie privée
  • Dépannage des rejets et recours
  • Processus complet de soumission d'app

Nos experts ont accompagné des centaines d'apps lors de leur publication sur le Play Store et peuvent vous aider à respecter les exigences actuelles.

Besoin d'aide pour l'implémentation ?

Continuer avec les règles du Play Store Android pour les IAP

Section intitulée « Continuer avec les règles du Play Store Android pour les IAP »

Si vous utilisez Règles de révision du Play Store Android pour les IAP pour planifier la sécurité et la conformité, connectez-l’à Utiliser @capgo/native-purchases pour la capacité native dans Utiliser @capgo/native-purchases Chiffrement pour les détails d'implémentation du chiffrement, Conformité pour les détails d'implémentation de la conformité, Scanner de sécurité Capgo pour le workflow produit dans Capgo Security Scanner, et Capgo et la sécurité pour le workflow produit dans Capgo Security.