Saltare al contenuto

Iniziare

GitHub

Potresti utilizzare la nostra configurazione assistita dall'IA per installare il plugin. Aggiungi le Capgo competenze al tuo strumento di AI utilizzando il seguente comando:

Fermata di comando
npx skills add https://github.com/Cap-go/capgo-skills --skill capacitor-plugins

Poi utilizza la seguente richiesta:

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

Se preferisci l'installazione manuale, installa il plugin eseguendo i seguenti comandi e segui le istruzioni specifiche per la piattaforma riportate di seguito:

  1. Installa il pacchetto

    Finestra del terminale
    bun add @capgo/native-purchases
  2. Sincronizza con i progetti nativi

    Finestra del terminale
    bunx cap sync
  3. Verifica il supporto alla fatturazione

    import { NativePurchases } from '@capgo/native-purchases';
    const { isBillingSupported } = await NativePurchases.isBillingSupported();
    if (!isBillingSupported) {
    throw new Error('Billing is not available on this device');
    }
  4. Carica i prodotti direttamente dai negozi

    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. Implementa flussi di acquisto e di ripristino

    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();
    • Creare prodotti e sottoscrizioni in-app in App Store Connect.
    • Usare StoreKit Local Testing o Sandbox tester per le prove di qualità.
    • Non sono necessarie modifiche al manifesto. Assicurati che i tuoi prodotti siano approvati.
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,
}),
});
}
}
OpzionePiattaformaDescrizione
productIdentifieriOS + AndroidID SKU/ID prodotto configurato in App Store Connect / Google Play Console.
productTypeSolo per AndroidPURCHASE_TYPE.INAPP o PURCHASE_TYPE.SUBSo INAPPper le sottoscrizioni. SUBS Sottoscrizioni per Android
planIdentifierID di piano base da Google Play Console. Richiesto per le sottoscrizioni, ignorato su iOS e per le acquisti in-app.per le sottoscrizioni.
billingPlanTypeAbbonamenti iOSPiano di fatturazione StoreKit per l'acquisto. Utilizza 'monthly' per la fatturazione mensile con un impegno di 12 mesi quando product.pricingTerms esporre quella opzione.
quantityiOSSolo per acquisti in-app, predefinito su 1. L'Android acquista sempre un oggetto.
appAccountTokeniOS + AndroidID UUID/ stringa che collega l'acquisto al tuo utente. Richiesto essere UUID su iOS; l'Android accetta qualsiasi stringa obfuscatrice fino a 64 caratteri.
isConsumableAndroidImpostato su true per consumare automaticamente i token dopo aver concesso l'entitatività per i consumabili. Predefinito su false.

Usa getPurchases() per una vista a piattaforme multiple di ogni transazione che i negozi segnalano:

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);
}
});
  • iOS: Le sottoscrizioni includono isActive, expirationDate, willCancel, e supporto per l'ascolto di StoreKit 2. Le vendite in-app richiedono la validazione del ricevuto del server.
  • Android: isActive/expirationDate non sono popolate; chiama il Google Play Developer API con il purchaseToken per status autorizzativo. purchaseState deve essere PURCHASED e isAcknowledged deve essere true.
  • isBillingSupported() – controlla la disponibilità di StoreKit / Google Play.
  • getProduct() / getProducts() – recupera il prezzo, titolo localizzato, descrizione, offerte introduttive e termini di prezzo iOS supportati.
  • purchaseProduct() – avvia il flusso di acquisto di StoreKit 2 o del client Billing, incluso i piani mensili di fatturazione iOS.
  • restorePurchases() – riproduca le transazioni storiche e sincronizza con il dispositivo corrente.
  • getPurchases() – elenca tutte le transazioni iOS o le compravendite di Play Billing.
  • manageSubscriptions() – apre l'interfaccia utente di gestione delle sottoscrizioni native.
  • addListener('transactionUpdated') – gestisci le transazioni pendenti di StoreKit 2 quando il tuo app si avvia (solo iOS).
  1. Mostra prezzi della store – Apple richiede di visualizzare product.title e product.priceString ; non hardcoded mai.
  2. Usa appAccountToken – generare deterministicamente un UUID (v5) dal tuo ID utente per collegare le acquisizioni agli account.
  3. Valida server-side – invia receipt (iOS) / purchaseToken (Android) per la verifica con il tuo backend.
  4. Gestisci gli errori con delicatezza – controlla le cancellazioni dell'utente, le fallite di rete e gli ambienti di fatturazione non supportati.
  5. Testa accuratamente – segui le istruzioni del guida del sandbox iOS e guida del sandbox Android.
  6. Offri la gestione del ripristino e della fatturazione – aggiungi pulsanti di interfaccia utente collegati a restorePurchases() e manageSubscriptions().

passaggi successivi per la fatturazione

Titolo della sezione “Passaggi per il reddito”

Dopo che il flusso di acquisto funziona, utilizza il Revenue Playbook per pianificare il tuo primo canale di pagamento: ambito del prodotto, ottimizzazione della visibilità, prezzo, posizionamento del paywall, analisi e feedback sulla churn.

Prodotti non caricati

  • Assicurati che l'ID del bundle / ID dell'applicazione corrisponda alla configurazione del negozio.
  • Conferma che gli ID dei prodotti sono attivi e approvati (App Store) o attivati (Google Play).
  • Attendi alcuni ore dopo aver creato i prodotti; la propagazione del negozio non è istantanea.

Acquisto annullato o bloccato

  • Gli utenti possono annullare durante il flusso; avvolgi le chiamate in try/catch e messaggi di errore amichevoli per l'utente.
  • Per Android, assicurati che gli account di test installino l'applicazione dallo Store Play (track interno) affinché la fatturazione funzioni.
  • Controlla logcat/Xcode per gli errori di fatturazione quando si esegue l'applicazione sul dispositivo.

Lo stato della sottoscrizione è errato.

  • Usa getPurchases() per confrontare i dati dello store con il cache delle entità locali.
  • Sul dispositivo Android, consulta sempre il Google Play Developer API con il purchaseToken per ottenere le date di scadenza o lo stato di rimborso.
  • Sul dispositivo iOS, controlla isActive/expirationDate e validare le ricevute per rilevare i rimborsi o le revocazioni.

Se stai utilizzando Iniziare per pianificare l'approvazione della store e la distribuzione, connettilo con Utilizzare @capgo/acquisti nativi per la capacità nativa in Utilizzare @capgo/acquisti nativi per il dettaglio di implementazione in @capgo/capacitor-recensione in-app Utilizzare @capgo/capacitor-recensione in-app per la capacità nativa in Utilizzare @capgo/capacitor-recensione in-app per il dettaglio di implementazione in @capgo/capacitor-mercato nativo Utilizzare @capgo/capacitor-mercato nativo per la capacità nativa in Utilizzare @capgo/capacitor-mercato nativo e Utilizzare @capgo/capacitor-mercato nativo per la capacità nativa in Using @capgo/capacitor-native-market.