Optionen für die Kopie der Seite
Kopieren Sie eine Einrichtungsanleitung mit den Installationsanweisungen und der vollständigen Markdown-Anleitung für diesen 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.
-
Installieren Sie das Paket
Terminal-Fenster bun add @capgo/native-purchases -
Synchronisiere mit native Projekten
Terminalfenster bunx cap sync -
Überprüfe die Rechnungsbegleitung
import { NativePurchases } from '@capgo/native-purchases';const { isBillingSupported } = await NativePurchases.isBillingSupported();if (!isBillingSupported) {throw new Error('Billing is not available on this device');} -
Lade Produkte direkt aus den Geschäften
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);}); -
Implementiere Kauf- und Wiederherstellungsflüsse
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();- Erstellen Sie in-App-Produkte und -Abonnements in App Store Connect.
- Verwenden Sie StoreKit Local Testing oder Sandbox-Tester für QA.
- Keine Manifest-Änderungen erforderlich. Stellen Sie sicher, dass Ihre Produkte genehmigt sind.
- Erstellen Sie in-App-Produkte und -Abonnements in Google Play Console.
- Uploaden Sie mindestens eine interne Testversion und fügen Sie Lizenzprüfer hinzu.
- Fügen Sie die Abrechnungsrechte zu
AndroidManifest.xml:
<uses-permission android:name="com.android.vending.BILLING" /> - Erstellen Sie in-App-Produkte und -Abonnements in App Store Connect.
Beispiel für den Kauf einer Dienstleistung
Abschnitt mit dem Titel “Beispiel für den Kauf einer Dienstleistung”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, }), }); }}Erforderliche Kaufoptionen
Abschnitt mit dem Titel “Erforderliche Kaufoptionen”| Option | Plattform | Beschreibung |
|---|---|---|
productIdentifier | iOS + Android | Artikelnummer/Produkt-ID in App Store Connect / Google Play Console konfiguriert. |
productType | Nur für Android verfügbar | PURCHASE_TYPE.INAPP oder PURCHASE_TYPE.SUBSStandardmäßig ist INAPPimmer auf SUBS für Abonnements |
planIdentifier | Abonnements für Android | Basiskunden-ID aus Google Play Console. Erforderlich für Abonnements, wird bei iOS- und In-App-Käufen ignoriert. |
billingPlanType | Abonnements für iOS | StoreKit-Billing-Plan zum Kauf. Verwenden Sie 'monthly' für monatliche Abrechnung mit einer 12-monatigen Verpflichtung, wenn product.pricingTerms die Option offenlegt. |
quantity | iOS | Nur für In-App-Käufe, standardmäßig 1Android kauft immer ein Produkt. |
appAccountToken | iOS + Android | Eine UUID/Zeichenkette, die den Kauf mit Ihrem Benutzer verbindet. Erforderlich, dass es auf iOS eine UUID ist; Android akzeptiert jede verschlüsselte Zeichenkette bis zu 64 Zeichen. |
isConsumable | Android | Setzen Sie auf true Zum automatischen Verbrauch von Tokenen nach der Gewährung von Entgelt für Verbrauchsgüter. Standardmäßig false. |
Zustand der Entgeltstatusüberprüfung
Abschnitt mit dem Titel „Zustand der Entgeltstatusüberprüfung“Verwenden Sie getPurchases() für eine plattformübergreifende Ansicht aller Transaktionen, die die Stores melden:
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); }});Plattformverhalten
Abschnitt mit dem Titel „Plattformverhalten“- iOSIn den Abonnements sind
isActive,expirationDate,willCancelund StoreKit 2-Hinweisunterstützung. In-App-Käufe erfordern eine Server-Belegevalidierung. - Android:
isActive/expirationDatewerden nicht befüllt; rufen Sie den Google Play-Entwickler API mit dempurchaseTokenfür die verbindliche Statusanzeige.purchaseStatemüssenPURCHASEDundisAcknowledgedmüssentrue.
API schneller Überblick
Abschnitt mit dem Titel “API schneller Überblick”isBillingSupported()– Überprüfen Sie die Verfügbarkeit in der App-Store oder Google Play.getProduct()/getProducts()– Abrufen Sie den Preis, die lokalisierte Überschrift, Beschreibung, Einführungsangebote und unterstützte iOS-Preistypen.purchaseProduct()– Starten Sie den Kauffluss von StoreKit 2 oder Billing-Klient, einschließlich iOS-Monatsverpflichtungsabrechnungsplänen.restorePurchases()– Wiedergabe historischer Kaufvorgänge und Synchronisierung mit dem aktuellen Gerät.getPurchases()– Auflisten aller iOS-Transaktionen oder Play-Billing-Käufe.manageSubscriptions()– Öffnen Sie die native Abonnement-Verwaltungsoberfläche.addListener('transactionUpdated')– Verarbeiten Sie bei App-Start die laufenden StoreKit 2-Transaktionen (nur iOS).
Gute Praktiken
Abschnitt mit dem Titel “Gute Praktiken”- Zeigen Sie den Ladenpreis an – Apple erfordert die Anzeige von
product.titleundproduct.priceString; never hardcode. - Verwenden Sie
appAccountToken– generieren Sie deterministisch eine UUID (v5) aus Ihrem Benutzer-ID, um Kaufe mit Konten zu verknüpfen. - Validieren Sie serverseitig – senden Sie
receipt(iOS) /purchaseToken(Android) an Ihren Backend für die Verifizierung. - Fehler beherrschen – überprüfen Sie die Benutzerstornierungen, Netzwerkfehler und nicht unterstützte Bezahlumgebungen.
- Testen Sie gründlich – folge den iOS Sandbox-Leitfaden und Android Sandbox-Leitfaden.
- Wiederherstellung und Verwaltung anbieten – füge UI-Schaltflächen hinzu, die an
restorePurchases()undmanageSubscriptions().
Einnahmen-Schritte
Abschnitt mit dem Titel „Einnahmen-Schritte“Nachdem der Kauffluss funktioniert, verwende das Revenue Playbook um deinen ersten bezahlten Kanal zu planen: Produktumfang, ASO, Preis, Paywall-Platzierung, Analytics und Rückschläge zur Abmeldung.
Fehlersuche
Abschnitt mit dem Titel „Fehlersuche“Produkte laden nicht
- Stellen Sie sicher, dass die Bundle-ID / Anwendungs-ID der Store-Konfiguration entspricht.
- Bestätigen Sie, dass die Produkt-IDs aktiv und genehmigt (App Store) bzw. aktiviert (Google Play) sind.
- Warten Sie einige Stunden nach der Erstellung von Produkten; die Store-Verbreitung ist nicht sofort.
Kauf wurde abgebrochen oder hängt
- Benutzer können mitten im Flow abbrechen; Wrapen Sie Aufrufe in
try/catchund freundliche Fehlermeldungen an der Oberfläche. - Für Android stellen Sie sicher, dass Testkonten die App vom Play Store (internem Track) installieren, damit Billing funktioniert.
- Überprüfen Sie Logcat/Xcode für Fehler bei der Abrechnung, wenn Sie auf einem Gerät laufen.
Falsche Abonnementzustand
- Verwenden Sie
getPurchases()um Daten des Stores mit Ihrem lokalen Cache für Bezahlungen zu vergleichen. - Auf Android wird immer der Google Play Developer API abgefragt, um
purchaseTokenum Ablaufdaten oder den Status von Rückerstattungen zu erhalten. - Auf iOS prüfen Sie
isActive/expirationDateund überprüfen Sie die Rechnungen, um Rückerstattungen oder Widerrufe zu erkennen.