Inicio
Copia un prompt de configuración con los pasos de instalación y la guía de markdown completa para este 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.
Instalación
Título de la sección “Instalación”Puedes utilizar nuestra configuración asistida por IA para instalar el plugin. Agrega las Capgo habilidades a tu herramienta de IA utilizando el siguiente comando:
npx skills add https://github.com/Cap-go/capgo-skills --skill capacitor-pluginsLuego utiliza el siguiente prompt:
Use the `capacitor-plugins` skill from `Cap-go/capgo-skills` to install the `@capgo/native-purchases` plugin in my project.Si prefieres la configuración manual, instala el complemento ejecutando los siguientes comandos y sigue las instrucciones específicas de la plataforma a continuación:
-
Instalar el paquete
Ventana de terminal bun add @capgo/native-purchases -
Sincronizar con proyectos nativos
Ventana de terminal bunx cap sync -
Verificar el soporte de facturación
import { NativePurchases } from '@capgo/native-purchases';const { isBillingSupported } = await NativePurchases.isBillingSupported();if (!isBillingSupported) {throw new Error('Billing is not available on this device');} -
Cargar productos directamente desde las tiendas
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);}); -
Implementar flujos de compra y restauración
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();- Crear productos y suscripciones en la Tienda de App Connect.
- Utilice StoreKit Local Testing o Sandbox testers para pruebas de QA.
- No se requieren ediciones del manifiesto. Asegúrese de que sus productos estén aprobados.
- Crear productos y suscripciones en el Console de Google Play.
- Subir al menos una versión de prueba interna y agregar licenciatarios de prueba.
- Agregar la permiso de facturación a
AndroidManifest.xml:
<uses-permission android:name="com.android.vending.BILLING" /> - Crear productos y suscripciones en la Tienda de App Connect.
Ejemplo de servicio de compra
Título de la sección “Ejemplo de servicio de compra”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, }), }); }}Opciones de compra requeridas
Título de la sección “Opciones de compra requeridas”| Opción | Plataforma | Descripción |
|---|---|---|
productIdentifier | iOS + Android | Sku/ID de producto configurado en App Store Connect / Google Play Console. |
productType | Solo para Android | PURCHASE_TYPE.INAPP o PURCHASE_TYPE.SUBSo INAPPpor defecto SUBS siempre |
planIdentifier | para suscripciones. | Suscripciones de Android |
billingPlanType | suscripciones de iOS | plan de facturación de StoreKit para realizar una compra. Utilice 'monthly' para facturación mensual con un compromiso de 12 meses cuando product.pricingTerms exponga esa opción. |
quantity | iOS | Solo para compras en la aplicación, por defecto se utiliza 1. Android siempre compra un artículo. |
appAccountToken | iOS + Android | iOS + Android |
isConsumable | ID de dispositivo UUID/cadena que vincula la compra a su usuario. Es necesario que sea UUID en iOS; Android acepta cualquier cadena obfusca hasta 64 caracteres. | Android true Establezca a true para consumir tokens automáticamente después de conceder acceso a consumibles. Por defecto se establece en false. |
Verificar el estado de la licencia
Sección titulada “Verificar el estado de la licencia”Usar getPurchases() para una vista cruzada de todas las transacciones que los almacenes informan:
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); }});Comportamiento de la plataforma
Sección titulada “Comportamiento de la plataforma”- iOS: Las suscripciones incluyen
isActive,expirationDate,willCancel, y el soporte de escucha de StoreKit 2. Las compras en la aplicación requieren la validación de la factura del servidor. - Android:
isActive/expirationDateno se rellenan; llame al desarrollador de Google Play API con elpurchaseTokenpara obtener el estatus autoritativo.purchaseStatedebe serPURCHASEDyisAcknowledgeddebe sertrue.
API referencia rápida
Sección titulada “API referencia rápida”isBillingSupported()– compruebe la disponibilidad de StoreKit / Google Play.getProduct()/getProducts()– recupere el precio, título localizado, descripción, ofertas de introducción y términos de precios de iOS admitidos.purchaseProduct()– inicie el flujo de compra de StoreKit 2 o Billing cliente, incluidos los planes de facturación mensuales de iOS.restorePurchases()– reproduzca las compras históricas y sincronice con el dispositivo actual.getPurchases()– liste todas las transacciones de iOS o compras de Play Billing.manageSubscriptions()– abra la interfaz de usuario de gestión de suscripciones nativa.addListener('transactionUpdated')– maneje transacciones pendientes de StoreKit 2 cuando su aplicación inicie (solo para iOS).
Prácticas recomendadas
Sección titulada “Prácticas recomendadas”- Mostrar precios de la tienda – Apple requiere mostrar
product.titleyproduct.priceString; nunca codifique directamente. - Usar
appAccountToken– genere de manera determinista un UUID (v5) a partir del ID de usuario para vincular compras a cuentas. - Validar en el lado del servidor – envíe
receipt(solo para iOS) /purchaseToken(Android) a su servidor de backend para su verificación. - Maneje errores con amabilidad – compruebe las cancelaciones de usuario, las fallas de red y los entornos de facturación no soportados.
- Pruebe exhaustivamente – siga las instrucciones del guía de pruebas de sandbox de iOS y guía de pruebas de sandbox de Android.
- Ofrezca restauración y gestión – agregue botones de interfaz de usuario conectados a
restorePurchases()ymanageSubscriptions().
pasos siguientes de ingresos
Paso siguiente para la recaudación de ingresosDespués de que el flujo de compra funciona, utilice el Libro de estrategias de ingresos planificar su primer canal de pago: alcance del producto, optimización de la búsqueda en la tienda, precios, ubicación de la pantalla de pago, análisis y retroalimentación de la tasa de abandono.
Resolución de problemas
Sección titulada “Resolución de problemas”Productos no se están cargando
- Asegúrese de que el ID de paquete / ID de aplicación coincida con la configuración de la tienda.
- Confirme que los IDs de producto estén activos y aprobados (App Store) o activados (Google Play).
- Espera varias horas después de crear productos; la propagación de almacenamiento no es instantánea.
La compra ha sido cancelada o se ha quedado atascada
- Los usuarios pueden cancelar en plena ejecución; envuelva las llamadas en
try/catchy mensajes de error amigables para la superficie. - Para Android, asegúrese de que las cuentas de prueba instalen la aplicación desde la Tienda de Play (pista interna) para que funcione la facturación.
- Verifique logcat/Xcode para errores de facturación al ejecutar en dispositivo.
Estado de la suscripción incorrecto
- Usar
getPurchases()para comparar los datos de la tienda con su caché de derechos locales. - En Android, siempre consulte el Google Play Developer API con el
purchaseTokenpara obtener fechas de vencimiento o estado de devolución. - En iOS, verifique
isActive/expirationDatey valide los recibos para detectar devoluciones o revocaciones.
Siga adelante desde Inicio
Título de la sección “Siga adelante desde Inicio”If estás utilizando Getting Started para planificar la aprobación de la tienda y la distribución, conecta con Usando @capgo/compras-nativas para la capacidad nativa en Usando @capgo/compras-nativas @capgo/revisión-en-aplicación-capacitor para el detalle de implementación en @capgo/revisión-en-aplicación-capacitor Usando @capgo/revisión-en-aplicación-capacitor para la capacidad nativa en Usando @capgo/revisión-en-aplicación-capacitor @capgo/mercado-nativo-capacitor para el detalle de implementación en @capgo/mercado-nativo-capacitor, y Usando @capgo/mercado-nativo-capacitor para la capacidad nativa en Using @capgo/capacitor-native-market.