Passer à la navigation

Getting Started

GitHub

Vous pouvez utiliser notre configuration assistée par l'IA pour installer le plugin. Ajoutez les Capgo compétences à votre outil IA en utilisant la commande suivante :

Fenêtre de terminal
npx skills add https://github.com/Cap-go/capgo-skills --skill capacitor-plugins

Ensuite, utilisez la prompt suivante :

Use the `capacitor-plugins` skill from `Cap-go/capgo-skills` to install the `@capgo/native-purchases` plugin in my project.

Si vous préférez la configuration manuelle, installez le plugin en exécutant les commandes suivantes et suivez les instructions spécifiques à la plateforme ci-dessous :

  1. Installez le package

    Fenêtre de terminal
    bun add @capgo/native-purchases
  2. Synchroniser avec les projets natifs

    Fenêtre de terminal
    bunx cap sync
  3. Vérifier le support facturation

    import { NativePurchases } from '@capgo/native-purchases';
    const { isBillingSupported } = await NativePurchases.isBillingSupported();
    if (!isBillingSupported) {
    throw new Error('Billing is not available on this device');
    }
  4. Charger les produits directement depuis les magasins

    import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
    const { products } = await NativePurchases.getProducts({
    productIdentifiers: [
    'com.example.premium.monthly',
    'com.example.premium.yearly',
    'com.example.one_time_unlock'
    ],
    productType: PURCHASE_TYPE.SUBS, // Use PURCHASE_TYPE.INAPP for one‑time products
    });
    products.forEach((product) => {
    console.log(product.title, product.priceString);
    });
  5. Implémenter les flux d'achat et de restauration

    import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
    const monthlyPlanId = 'monthly-plan'; // Base Plan ID from Google Play Console
    const transaction = await NativePurchases.purchaseProduct({
    productIdentifier: 'com.example.premium.monthly',
    planIdentifier: monthlyPlanId, // REQUIRED for Android subscriptions, ignored on iOS
    productType: PURCHASE_TYPE.SUBS,
    quantity: 1,
    });
    console.log('Transaction ID', transaction.transactionId);
    await NativePurchases.restorePurchases();
    • Créer des produits et des abonnements en application dans App Store Connect.
    • Utilisez StoreKit Local Testing ou des testeurs Sandbox pour les tests de QA.
    • Aucune modification du manifeste n'est requise. Assurez-vous que vos produits soient approuvés.
import { NativePurchases, PURCHASE_TYPE, Transaction } from '@capgo/native-purchases';
import { Capacitor } from '@capacitor/core';
class PurchaseService {
private premiumProduct = 'com.example.premium.unlock';
private monthlySubId = 'com.example.premium.monthly';
private monthlyPlanId = 'monthly-plan'; // Base Plan ID (Android only)
async initialize() {
const { isBillingSupported } = await NativePurchases.isBillingSupported();
if (!isBillingSupported) throw new Error('Billing unavailable');
const { products } = await NativePurchases.getProducts({
productIdentifiers: [this.premiumProduct, this.monthlySubId],
productType: PURCHASE_TYPE.SUBS,
});
console.log('Loaded products', products);
if (Capacitor.getPlatform() === 'ios') {
NativePurchases.addListener('transactionUpdated', (transaction) => {
this.handleTransaction(transaction);
});
}
}
async buyPremium(appAccountToken?: string) {
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: this.premiumProduct,
productType: PURCHASE_TYPE.INAPP,
appAccountToken,
});
await this.processTransaction(transaction);
}
async buyMonthly(appAccountToken?: string) {
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: this.monthlySubId,
planIdentifier: this.monthlyPlanId, // REQUIRED for Android subscriptions
productType: PURCHASE_TYPE.SUBS,
appAccountToken,
});
await this.processTransaction(transaction);
}
async restore() {
await NativePurchases.restorePurchases();
await this.refreshEntitlements();
}
async openManageSubscriptions() {
await NativePurchases.manageSubscriptions();
}
private async processTransaction(transaction: Transaction) {
this.unlockContent(transaction.productIdentifier);
this.validateOnServer(transaction).catch(console.error);
}
private unlockContent(productIdentifier: string) {
// persist entitlement locally
console.log('Unlocked', productIdentifier);
}
private async refreshEntitlements() {
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
console.log('Current purchases', purchases);
}
private async handleTransaction(transaction: Transaction) {
console.log('StoreKit transaction update:', transaction);
await this.processTransaction(transaction);
}
private async validateOnServer(transaction: Transaction) {
await fetch('/api/validate-purchase', {
method: 'POST',
body: JSON.stringify({
transactionId: transaction.transactionId,
receipt: transaction.receipt,
purchaseToken: transaction.purchaseToken,
}),
});
}
}
OptionPlateformeDescription
productIdentifieriOS + AndroidNuméro d'article SKU configuré dans App Store Connect / Google Play Console.
productTypeSeulement AndroidPURCHASE_TYPE.INAPP ou PURCHASE_TYPE.SUBSDefaults à INAPPToujours défini sur SUBS toujours défini sur
planIdentifierpour les abonnements.ID de la plan de base du Google Play Console. Obligatoire pour les abonnements, ignoré sur iOS et pour les achats en application.
billingPlanTypeAbonnements iOSPlan de facturation StoreKit pour les achats. Utilisez 'monthly' pour un facturation mensuelle avec un engagement de 12 mois lorsque product.pricingTerms exposez cette option.
quantityIOSSeulement pour les achats en application, par défaut à 1. L'Android achète toujours un article.
appAccountTokenIOS + AndroidIdentifiant UUID liant l'achat à votre utilisateur. Obligatoire en tant qu'UUID sur iOS ; Android accepte toute chaîne obfusquée jusqu'à 64 caractères.
isConsumableAndroidDéfinissez sur true Après avoir accordé un droit pour des biens consommables, permettre l'auto-consommation de jetons par défaut. false.

Vérification de l'état des droits d'accès

Titre de la section : « Vérification de l'état des droits »

Utilisez getPurchases() pour une vue croisée de toutes les transactions que les magasins signalent :

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
purchases.forEach((purchase) => {
if (purchase.isActive && purchase.expirationDate) {
console.log('iOS sub active until', purchase.expirationDate);
}
const isAndroidIapValid =
['PURCHASED', '1'].includes(purchase.purchaseState ?? '') && purchase.isAcknowledged;
if (isAndroidIapValid) {
console.log('Grant in-app entitlement for', purchase.productIdentifier);
}
});

Comportement de la plateforme

Comportement du plateforme
  • iOS : Les abonnements incluent isActive, expirationDate, willCancel, et le support de StoreKit 2. Les achats en application nécessitent une validation de la réception du serveur.
  • Android: isActive/expirationDate ne sont pas remplis ; appelez le développeur Google Play API avec le purchaseToken pour un statut authentique. purchaseState doit être PURCHASED et isAcknowledged doit être true.
  • isBillingSupported() – vérifiez la disponibilité de StoreKit / Google Play.
  • getProduct() / getProducts() Récupérer le prix, le titre localisé, la description, les offres d'introduction et les termes de tarification iOS pris en charge.
  • purchaseProduct() – déclenchez la procédure d'achat StoreKit 2 ou Billing client, y compris les plans mensuels de facturation iOS.
  • restorePurchases() – répliquez les achats historiques et synchronisez-les avec le dispositif actuel.
  • getPurchases() – affichez toutes les transactions iOS ou les achats de facturation Play.
  • manageSubscriptions() Ouvrez l'interface utilisateur de gestion des abonnements natives.
  • addListener('transactionUpdated') – gérez les transactions StoreKit 2 en attente lorsque votre application démarre (iOS uniquement).
  1. Afficher les tarifs de l'application – Apple exige de afficher product.title et product.priceString; ne jamais coder en dur.
  2. Utilisez appAccountToken – générer déterminativement un UUID (v5) à partir de l'ID de l'utilisateur pour lier les achats aux comptes.
  3. Valider côté serveur – envoyer receipt (iOS) / purchaseToken (Android) à votre backend pour la vérification.
  4. Gérer les erreurs avec souplesse Vérifiez les annulations de l'utilisateur, les échecs de réseau et les environnements de facturation non pris en charge.
  5. Tester soigneusement – suivez le guide de sandbox iOS et guide de sandbox Android.
  6. Proposez la restauration et la gestion – ajoutez des boutons de l'interface utilisateur branchés à restorePurchases() et manageSubscriptions().

Après que le flux d'achat fonctionne, utilisez le Plan de revenus pour planifier votre premier canal payant : portée du produit, ASO, tarification, placement de la barrière de paiement, analyse et feedback sur le taux de déchets.

Section intitulée « Résolution des problèmes »

  • Make sure the bundle ID / application ID matches store configuration.
  • Assurez-vous que l'ID de l'ensemble / l'ID d'application correspond à la configuration de la boutique.
  • Attendez plusieurs heures après avoir créé des produits ; la propagation des magasins n'est pas instantanée.

Annulation ou blocage d'achat

  • Annulation ou blocage de l'achat try/catch Les messages d'erreur amicaux et conviviaux.
  • For Android, ensure test accounts install the app from Play Store (internal track) so Billing works.
  • Vérifiez logcat/Xcode pour les erreurs de facturation lors de l'exécution sur appareil.

État d'abonnement incorrect

  • Utilisez getPurchases() pour comparer les données de magasin avec votre cache de droits locaux.
  • Sur Android, interrogez toujours le Google Play Developer API avec le purchaseToken pour obtenir les dates d'expiration ou l'état de remboursement.
  • Sur iOS, vérifiez isActive/expirationDate et validez les reçus pour détecter les remboursements ou les révocations.

Continuez de l'étape de démarrage

Continuer depuis l'étape de démarrage

Getting Started Prise en main pour planifier l'approbation et la distribution de l'application, connectez-l’à En utilisant @capgo/achats-natifs pour la capacité native dans En utilisant @capgo/achats-natifs, @capgo/capacitor-avis-en-ligne pour le détail d'implémentation dans @capgo/capacitor-avis-en-ligne, En utilisant @capgo/capacitor-avis-en-ligne pour la capacité native dans En utilisant @capgo/capacitor-avis-en-ligne, @capgo/capacitor-marché-natif pour le détail d'implémentation dans @capgo/capacitor-marché-natif, et En utilisant @capgo/capacitor-marché-natif pour la capacité native dans En utilisant @capgo/capacitor-marché-natif.