Empezar
Copie 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
Sección titulada “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 plugin ejecutando los siguientes comandos y sigue las instrucciones específicas del plataforma a continuación:
-
Instala el paquete
Ventana de terminal bun add @capgo/native-purchases -
Sincronizar con proyectos nativos
Ventana de terminal bunx cap sync -
Ver 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 en App Store Connect.
- Utilice StoreKit Local Testing o Sandbox testers para QA.
- No se requieren ediciones del manifiesto. Asegúrese de que sus productos estén aprobados.
- Crear productos y suscripciones en la consola de Google Play.
- Subir al menos una versión de prueba interna y agregar pruebas de licencia.
- Agregar la permiso de facturación a
AndroidManifest.xml:
<uses-permission android:name="com.android.vending.BILLING" /> - Crear productos y suscripciones en la tienda en App Store Connect.
Ejemplo de servicio de compra
Sección titulada “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
Sección titulada “Opciones de compra requeridas”| Opción | Plataforma | Descripción |
|---|---|---|
productIdentifier | iOS + Android | El SKU/ID de producto configurado en App Store Connect / Google Play Console. |
productType | Solo para Android | PURCHASE_TYPE.INAPP o PURCHASE_TYPE.SUBS. Por defecto es INAPP. Siempre se establece en SUBS para las suscripciones. |
planIdentifier | Suscripciones de Android | ID de plan base desde Google Play Console. Requerido para las suscripciones, ignorado en iOS y compras in-app. |
billingPlanType | Suscripciones de iOS | Plan de facturación de StoreKit para comprar. Utilice 'monthly' para la facturación mensual con un compromiso de 12 meses cuando product.pricingTerms exposa esa opción. |
quantity | iOS | Solo para compras en la aplicación, por defecto es 1. Siempre compra un artículo en Android. |
appAccountToken | iOS + Android | UUID/cadena que vincula la compra a su usuario. Es obligatorio que sea UUID en iOS; Android acepta cualquier cadena obfusca hasta 64 caracteres. |
isConsumable | Android | Establezca a true para consumir tokens automáticamente después de conceder la autorización para consumibles. Por defecto es false. |
Verificar el estado de la autorización
Sección titulada “Verificar el estado de la autorización”Usar getPurchases() para una vista transversal de cada transacción 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,willCancely el soporte de escucha de StoreKit 2. Los 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 el estado autoritativo.purchaseStatedeben serPURCHASEDyisAcknowledgeddebe sertrue.
API referencia rápida
Sección titulada “API referencia rápida”isBillingSupported()– verificar la disponibilidad en la Tienda de Mac / Google Play.getProduct()/getProducts()– obtener el precio, título localizado, descripción, ofertas de introducción y términos de precios de iOS admitidos.purchaseProduct()– iniciar el flujo de compra del cliente de StoreKit 2 o Billing, incluyendo los planes de facturación mensuales de iOS.restorePurchases()– reproducir compras históricas y sincronizar con el dispositivo actual.getPurchases()– listar todas las transacciones de iOS o compras de facturación de Play Billing.manageSubscriptions()– abrir la interfaz de usuario de gestión de suscripciones nativa.addListener('transactionUpdated')– manejar transacciones pendientes de StoreKit 2 cuando se inicia la aplicación (solo iOS).
Consejos de práctica
Sección titulada “Consejos de práctica”- Muestra el precio de la tienda – Apple requiere mostrar
product.titleyproduct.priceString; nunca codifiques directamente. - Utilice
appAccountToken– genere determinísticamente un UUID (v5) a partir del ID del usuario para vincular compras a cuentas. - Valida en el servidor – envía
receipt(iOS) /purchaseToken(Android) a su back-end para la verificación. - Gestiona errores con amabilidad – comprueba las cancelaciones de usuario, las fallas de red y los entornos de facturación no compatibles.
- Prueba exhaustivamente – sigue el iOS guía de sandbox y Android guía de sandbox.
- Ofrece restauración y administración – agrega botones de interfaz de usuario conectados a
restorePurchases()ymanageSubscriptions().
Pasos de ingresos siguientes
Sección titulada “Pasos de ingresos siguientes”Después de que el flujo de compra funciona, utilice el Libro de estrategias de ingresos para planificar tu primer funel pagado: alcance del producto, ASO, precios, ubicación de la pantalla de pago, análisis y retroalimentación de abandono.
Solución de problemas
Sección titulada “Solución de problemas”Los productos no se cargan
- Asegúrate de que el ID de la cesta / ID de la aplicación coincida con la configuración de la tienda.
- Confirma que los IDs de los productos estén activos y aprobados (App Store) o activados (Google Play).
- Espera varias horas después de crear productos; la propagación de la tienda no es instantánea.
La compra se canceló o se quedó atascada
- Los usuarios pueden cancelar en medio del flujo; envuelve las llamadas en
try/catchy muestra mensajes de error amigables. - Para Android, asegúrate de que las cuentas de prueba instalen la aplicación desde la tienda Play (pista interna) para que la facturación funcione.
- Revisa logcat/Xcode para errores de facturación cuando se ejecuta en dispositivo.
Estado de 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 reembolso. - En iOS, revise
isActive/expirationDatey valide los recibos para detectar reembolsos o revocaciones.
Sigue adelante desde Getting Started
Sección titulada “Sigue adelante desde Getting Started”Si está utilizando Getting Started para planificar la aprobación y distribución de la tienda, conecte con ella Usando @capgo/compras-nativas para la capacidad nativa en Usando @capgo/compras-nativas, @capgo/capacitor-revisión-de-aplicación-interna para el detalle de implementación en @capgo/capacitor-revisión-de-aplicación-interna, Usando @capgo/capacitor-revisión-de-aplicación-interna para la capacidad nativa en Usando @capgo/capacitor-revisión-de-aplicación-interna, @capgo/capacitor-mercado-nativo para el detalle de implementación en @capgo/capacitor-mercado-nativo, y Usando @capgo/capacitor-mercado-nativo para la capacidad nativa en Usando @capgo/capacitor-mercado-nativo.