Getting Started
Copia un prompt di configurazione con i passaggi di installazione e la guida markdown completa per questo plugin.
Set up this Capacitor plugin in the project.
Use the package manager already used by the project.
Install these package(s): `@capgo/native-purchases`
Run the required Capacitor sync/update step after installation.
Read this markdown guide for the full setup steps: https://raw.githubusercontent.com/Cap-go/website/refs/heads/main/apps/docs/src/content/docs/docs/plugins/native-purchases/getting-started.mdx
Use that guide for platform-specific steps, native file edits, permissions, config changes, imports, and usage setup.
If that guide references other docs pages, read them too.
Installazione
Sezione intitolata “Installazione”Puoi utilizzare la nostra configurazione assistita dall'IA per installare il plugin. Aggiungi le Capgo abilità al tuo strumento di IA utilizzando il seguente comando:
npx skills add https://github.com/Cap-go/capgo-skills --skill capacitor-pluginsUsa poi il seguente prompt:
Use the `capacitor-plugins` skill from `Cap-go/capgo-skills` to install the `@capgo/native-purchases` plugin in my project.Se preferisci la configurazione manuale, installa il plugin eseguendo i seguenti comandi e segui le istruzioni specifiche del tuo platform qui sotto:
-
Installa il pacchetto
Finestra del terminale bun add @capgo/native-purchases -
Sincronizza con i progetti nativi
Finestra del terminale bunx cap sync -
Verifica il supporto fatturazione
import { NativePurchases } from '@capgo/native-purchases';const { isBillingSupported } = await NativePurchases.isBillingSupported();if (!isBillingSupported) {throw new Error('Billing is not available on this device');} -
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);}); -
Implementa le flussi di acquisto e ripristino
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';const monthlyPlanId = 'monthly-plan'; // Base Plan ID from Google Play Consoleconst transaction = await NativePurchases.purchaseProduct({productIdentifier: 'com.example.premium.monthly',planIdentifier: monthlyPlanId, // REQUIRED for Android subscriptions, ignored on iOSproductType: PURCHASE_TYPE.SUBS,quantity: 1,});console.log('Transaction ID', transaction.transactionId);await NativePurchases.restorePurchases();- Crea prodotti e abbonamenti in-app in App Store Connect.
- Utilizza StoreKit Local Testing o Sandbox tester per le prove di qualità.
- Non sono richieste modifiche al manifesto. Assicurati che i tuoi prodotti siano approvati.
- Crea prodotti e abbonamenti in-app nel Console di Google Play.
- Carica almeno una versione di test interna e aggiungi i tester di licenza.
- Aggiungi la permessione di fatturazione a
AndroidManifest.xml:
<uses-permission android:name="com.android.vending.BILLING" /> - Crea prodotti e abbonamenti in-app in App Store Connect.
Esempio di servizio di acquisto
Sezione intitolata “Esempio di servizio di acquisto”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, }), }); }}Opzioni di acquisto richieste
Sezione intitolata “Opzioni di acquisto richieste”| Opzione | Piattaforma | Descrizione |
|---|---|---|
productIdentifier | iOS + Android | Codice SKU/ID prodotto configurato in App Store Connect / Google Play Console. |
productType | Solo Android | PURCHASE_TYPE.INAPP o PURCHASE_TYPE.SUBS. Predefinito a INAPP. Sempre impostato a SUBS per le sottoscrizioni. |
planIdentifier | Sottoscrizioni Android | ID piano base da Google Play Console. Richiesto per le sottoscrizioni, ignorato su iOS e per acquisti in-app. |
billingPlanType | Sottoscrizioni iOS | Piano di fatturazione StoreKit per l'acquisto. Utilizzare 'monthly' per fatturazione mensile con un impegno di 12 mesi quando product.pricingTerms esporre quella opzione. |
quantity | iOS | Solo per acquisti in-app, predefinito a 1. L'Android acquista sempre un oggetto. |
appAccountToken | iOS + Android | UUID/stringa che collega l'acquisto al tuo utente. Richiesto essere UUID su iOS; l'Android accetta qualsiasi stringa obfuscata fino a 64 caratteri. |
isConsumable | Android | Impostato a true per consumare automaticamente i token dopo aver concesso l'entitatività per consumabili. Predefinito a false. |
Verificare lo stato dell'entitatività
Sottosezione intitolata “Verificare lo stato dell'entitatività”Usa getPurchases() per una vista transazionale 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); }});Comportamento della piattaforma
Sezione intitolata “Comportamento della piattaforma”- 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/expirationDatenon sono popolate; chiama il Google Play Developer API con ilpurchaseTokenper lo stato autorizzativo.purchaseStatedeve esserePURCHASEDEcco alcune best practiceisAcknowledgedDeve esseretrue.
API riferimento rapido
Sottosezione intitolata “API riferimento rapido”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 di fatturazione, inclusi piani mensili di impegno di fatturazione iOS.restorePurchases()– riproduci le transazioni storiche e sincronizza con il dispositivo corrente.getPurchases()– elenca tutte le transazioni iOS o le fatturazioni di Play Billing.manageSubscriptions()– apre l'interfaccia utente di gestione delle sottoscrizioni native.addListener('transactionUpdated')– gestisci le transazioni di StoreKit 2 in attesa quando il tuo'app inizia (solo iOS).
Consigli di pratica
Sezione intitolata “Buone pratiche”- Mostra il prezzo della store – Apple richiede di visualizzare
product.titleeproduct.priceString; non hardcoded mai. - Utilizza
appAccountToken– generare deterministicamente un UUID (v5) dal tuo ID utente per collegare le acquisizioni agli account. - Valida server-side – invia
receipt(iOS) /purchaseToken(Android) al tuo backend per la verifica. - Gestisci gli errori con grazia – controlla le cancellazioni dell'utente, le fallite di rete e gli ambienti di fatturazione non supportati.
- Testa attentamente – segui le guide del sandbox iOS sandbox guide e Android sandbox guide.
- Offri la gestione del ripristino & – aggiungi pulsanti di interfaccia utente collegati a
restorePurchases()emanageSubscriptions().
passaggi successivi per il reddito
Sezione intitolata “Passaggi successivi per il reddito”Dopo che il flusso di acquisto funziona, utilizza il Libro di ricavi per pianificare il tuo primo canale di ricavi a pagamento: ambito del prodotto, ottimizzazione della visibilità, prezzo, posizionamento della barriera di pagamento, analisi e feedback di churn.
Risoluzione dei problemi
Sezione intitolata “Risoluzione dei problemi”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).
- Aspetta 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/catche visualizza messaggi di errore amichevoli. - Per Android, assicurati che gli account di test installino l'applicazione dallo Store di Google (track interno) affinché il Billing funzioni.
- Controlla logcat/Xcode per gli errori di fatturazione quando si esegue su dispositivo.
Lo stato della sottoscrizione è errato
- Usa
getPurchases()per confrontare i dati del negozio con il cache delle tue licenze locali. - Su Android, consulta sempre il Google Play Developer API per ottenere le date di scadenza o lo stato di rimborso.
purchaseTokenSu iOS, controlla - e verifica le ricevute per rilevare i rimborsi o le revocazioni.
isActive/expirationDateContinua da Getting Started
Se stai utilizzando
Getting StartedContinua da qui: Getting Started Se stai utilizzando Getting Started per pianificare l'approvazione e la distribuzione del negozio, connettilo con Utilizzare @capgo/native-purchases per la capacità nativa in Utilizzare @capgo/native-purchases, @capgo/capacitor-in-app-review per il dettaglio di implementazione in @capgo/capacitor-in-app-review, Utilizzare @capgo/capacitor-in-app-review per la capacità nativa in Utilizzare @capgo/capacitor-in-app-review, @capgo/capacitor-native-market per il dettaglio di implementazione in @capgo/capacitor-native-market, e Utilizzare @capgo/capacitor-native-market per la capacità nativa in Utilizzare @capgo/capacitor-native-market.