Inizia a utilizzare
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 abilitazioni al tuo strumento di AI utilizzando il seguente comando:
npx skills add https://github.com/Cap-go/capgo-skills --skill capacitor-pluginsInfine utilizza 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 l'installazione manuale, installa il plugin eseguendo i seguenti comandi e segui le istruzioni specifiche per la piattaforma riportate di seguito:
-
Installare 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 flussi di acquisto e di 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 sottoscrizioni in-app in App Store Connect.
- Utilizza StoreKit Local Testing o Sandbox testers per le prove di qualità.
- Assicurati che i tuoi prodotti siano approvati. Nessuna modifica del manifesto è richiesta.
- Crea prodotti e sottoscrizioni in-app in Google Play Console.
- Carica almeno un build di test interno e aggiungi i testatori di licenza.
- Aggiungi la permessione di fatturazione a
AndroidManifest.xml:
<uses-permission android:name="com.android.vending.BILLING" /> - Crea prodotti e sottoscrizioni 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. Utilizza 'monthly' per la 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 | ID UUID/insieme di caratteri 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 su true per consumare automaticamente i token dopo aver concesso l'entitatività per i consumabili. Predefinito a false. |
Verifica stato di abbonamento
Sezione intitolata “Verifica stato di abbonamento”Usa getPurchases() per una vista cross-platform 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 del dispositivo
Sezione intitolata “Comportamento del dispositivo”- iOS: Gli abbonamenti includono
isActive,expirationDate,willCancele supporto per ascoltatore di StoreKit 2. Le vendite in-app richiedono la validazione del ricevuto server. - Android:
isActive/expirationDatenon sono popolate; chiama il Google Play Developer API con ilpurchaseTokenper ottenere lo status di autorità.purchaseStatedeve esserePURCHASEDeisAcknowledgeddeve 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 del client di StoreKit 2 o di Billing, incluso i piani mensili di fatturazione iOS.restorePurchases()– riproduci le acquisti storici e sincronizza con il dispositivo corrente.getPurchases()– elenca tutte le transazioni iOS o le acquisti di Play Billing.manageSubscriptions()– apri l'interfaccia utente di gestione delle sottoscrizioni nativa.addListener('transactionUpdated')– gestisci le transazioni StoreKit 2 pendenti quando il tuo app si avvia (solo iOS).
Pratiche raccomandate
Sezione intitolata “Pratiche raccomandate”- Mostra il prezzo della store – Apple richiede di visualizzare
product.titleeproduct.priceString; non utilizzare mai la programmazione rigida. - Utilizza
appAccountToken– generare deterministicamente un UUID (v5) dal ID dell'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 delicatezza – controlla le cancellazioni degli utenti, le fallite connessioni di rete e gli ambienti di fatturazione non supportati.
- Testa con attenzione – segui le guide del sandbox per iOS e Android Offri la gestione del restore e della fatturazione.
- – aggiungi pulsanti di interfaccia utente collegati a e
restorePurchases()passaggi successivi per la fatturazione del reddito.manageSubscriptions().
Handle errors gracefully is not translated as it is a protected token
Section intitolata “Passaggi per il prossimo gettito di entrate”Dopo che il flusso di acquisto funziona, utilizza il Revenue Playbook per pianificare il primo canale di entrate a pagamento: ambito del prodotto, ottimizzazione della visibilità negli store, prezzo, posizionamento del paywall, analisi e feedback sulla perdita di clienti.
Risoluzione dei problemi
Section intitolata “Risoluzione dei problemi”Prodotti non caricati
- Assicurati che l'ID del bundle / ID dell'applicazione corrisponda alla configurazione dello store.
- 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 dello store non è istantanea.
Acquisto annullato o bloccato
- Gli utenti possono annullare il flusso a metà; avvolgi le chiamate in
try/catche messaggi di errore amichevoli per la superficie. - Per Android, assicurati che gli account di test installino l'applicazione dallo Store di Gioco (pista interna) per far funzionare la fatturazione.
- Controlla logcat/Xcode per gli errori di fatturazione quando si esegue su dispositivo.
Lo stato della sottoscrizione è errato
- Usa
getPurchases()per confrontare i dati dello store con il cache delle entrate locali. - Su Android, consulta sempre il Google Play Developer API con il
purchaseTokenper ottenere le date di scadenza o lo stato di rimborso. - Su iOS, controlla
isActive/expirationDatee validare le ricevute per rilevare i rimborsi o le revocazioni.
Continua da Getting Started
Sezione intitolata “Continua da Getting Started”Se stai utilizzando Inizia per pianificare l'approvazione e la distribuzione del negozio, connettilo con Utilizza @capgo/native-purchases per la capacità nativa in Utilizza @capgo/native-purchases, @capgo/capacitor-in-app-review per la dettagliata implementazione in @capgo/capacitor-in-app-review, Utilizza @capgo/capacitor-in-app-review per la capacità nativa in Utilizza @capgo/capacitor-in-app-review, @capgo/capacitor-native-market per la dettagliata implementazione in @capgo/capacitor-native-market, e Utilizza @capgo/capacitor-native-market per la capacità nativa in Utilizzare @capgo/capacitor-native-market.