Lompat ke konten

Getting Started

GitHub

Anda dapat menggunakan Pengaturan Bantu AI kami untuk menginstal plugin. Tambahkan Capgo kemampuan ke alat AI Anda menggunakan perintah berikut:

Jendela Terminal
npx skills add https://github.com/Cap-go/capgo-skills --skill capacitor-plugins

Lalu gunakan prompt berikut:

Use the `capacitor-plugins` skill from `Cap-go/capgo-skills` to install the `@capgo/native-purchases` plugin in my project.

Jika Anda lebih suka Pengaturan Manual, instal plugin dengan menjalankan perintah-perintah berikut dan ikuti instruksi spesifik platform di bawah:

  1. Pasang paket ini

    Jendela terminal
    bun add @capgo/native-purchases
  2. Sinkron dengan proyek native

    Jendela terminal
    bunx cap sync
  3. Periksa dukungan tagihan

    import { NativePurchases } from '@capgo/native-purchases';
    const { isBillingSupported } = await NativePurchases.isBillingSupported();
    if (!isBillingSupported) {
    throw new Error('Billing is not available on this device');
    }
  4. Muat produk secara langsung dari toko

    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);
    });
  5. Implementasikan alur pembelian & restorasi

    import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
    const monthlyPlanId = 'monthly-plan'; // Base Plan ID from Google Play Console
    const transaction = await NativePurchases.purchaseProduct({
    productIdentifier: 'com.example.premium.monthly',
    planIdentifier: monthlyPlanId, // REQUIRED for Android subscriptions, ignored on iOS
    productType: PURCHASE_TYPE.SUBS,
    quantity: 1,
    });
    console.log('Transaction ID', transaction.transactionId);
    await NativePurchases.restorePurchases();
    • Buat produk dalam aplikasi dan langganan di App Store Connect.
    • Gunakan StoreKit Local Testing atau Sandbox tester untuk QA.
    • Tidak perlu mengedit manifest. Pastikan produk Anda disetujui.
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,
}),
});
}
}
PilihanPlatformDeskripsi
productIdentifieriOS + AndroidKode SKU/ID Produk yang terkonfigurasi di App Store Connect / Google Play Console.
productTypeHanya AndroidPURCHASE_TYPE.INAPP atau PURCHASE_TYPE.SUBS. Defaultnya adalah INAPP. Selalu ditetapkan menjadi SUBS untuk langganan.
planIdentifierLangganan AndroidID Rencana Dasar dari Google Play Console. Diperlukan untuk langganan, diabaikan pada iOS dan pembelian dalam aplikasi.
billingPlanTypeLangganan iOSRencana pembayaran StoreKit untuk pembelian. Gunakan 'monthly' untuk tagihan bulanan dengan komitmen 12 bulan ketika product.pricingTerms mengungkapkan pilihan tersebut.
quantityiOSHanya untuk pembelian dalam aplikasi, default ke 1. Android selalu membeli item satu.
appAccountTokeniOS + AndroidUUID/nilai string yang terkait dengan pembelian pengguna. Diperlukan untuk UUID pada iOS; Android menerima string yang diobfuskan hingga 64 karakter.
isConsumableAndroidDitetapkan ke true untuk mengonsumsi token secara otomatis setelah memberikan hak untuk konsumables. Default ke false.

Gunakan getPurchases() untuk tampilan lintas platform dari setiap transaksi yang dilaporkan oleh toko-toko:

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);
}
});
  • iOS: Langganan termasuk isActive, expirationDate, willCancel, dan dukungan penggunaan aplikasi dalam aplikasi dengan StoreKit 2. Penggunaan aplikasi dalam aplikasi memerlukan validasi bukti penerimaan server.
  • Android: isActive/expirationDate tidak diisi; hubungi pengembang Google Play Developer API untuk status yang otoritatif. purchaseToken harus diisi purchaseState dapat diisi PURCHASED dan isAcknowledged harus ada true.
  • isBillingSupported() – periksa ketersediaan StoreKit / Google Play.
  • getProduct() / getProducts() – ambil harga, judul lokal, deskripsi, tawaran intro, dan istilah harga iOS yang didukung.
  • purchaseProduct() – mulai alur pembelian StoreKit 2 atau Billing klien, termasuk rencana pembayaran bulanan iOS.
  • restorePurchases() – ulangi pembelian sejarah dan sinkron ke perangkat saat ini.
  • getPurchases() – daftar semua transaksi iOS atau pembelian Play Billing.
  • manageSubscriptions() – buka antarmuka manajemen langganan native.
  • addListener('transactionUpdated') – tangani transaksi StoreKit 2 yang menunggu ketika aplikasi Anda dimulai (hanya iOS).

Praktik terbaik

Praktik terbaik
  1. Tampilkan harga toko – Apple memerlukan menampilkan product.title dan product.priceString; tidak pernah mengkodekan secara keras.
  2. Pakai appAccountToken – secara deterministik generate UUID (v5) dari ID pengguna Anda untuk menghubungkan pembelian ke akun.
  3. Validasi di server – kirim receipt (iOS) / purchaseToken (Android) ke backend Anda untuk verifikasi.
  4. Tangani kesalahan dengan sopan – periksa pembatalan pengguna, gagal jaringan, dan lingkungan pembayaran yang tidak didukung.
  5. Test secara menyeluruh – ikuti panduan sandbox iOS dan panduan sandbox Android Tawarkan pengembalian dan manajemen.
  6. – tambahkan tombol UI yang terhubung ke dan langkah-langkah keuangan berikutnya restorePurchases() Bagian berjudul “Langkah-langkah Keuangan Berikutnya” manageSubscriptions().

Test thoroughly Pedoman Pendapatan Untuk merencanakan funnel pembayaran pertama: skop produk, Aplikasi Penelusuran, harga, penempatan paywall, analisis, dan umpan balik pengurangan.

Produk tidak terbuka

  • Pastikan ID Paket / ID Aplikasi sesuai dengan konfigurasi toko.
  • Konfirmasi bahwa ID produk aktif dan disetujui (App Store) atau diaktifkan (Google Play).
  • Tunggu beberapa jam setelah membuat produk; penyebaran toko tidak instan.

Pembelian dibatalkan atau terjebak

  • Pengguna dapat membatalkan di tengah alur; tutup panggilan dengan try/catch dan permukaan pesan kesalahan yang ramah.
  • Untuk Android, pastikan akun uji instal aplikasi dari Play Store (track internal) sehingga Billing berfungsi.
  • Periksa logcat/Xcode untuk kesalahan billing ketika menjalankan pada perangkat.

Status langganan salah

  • Gunakan getPurchases() untuk membandingkan data toko dengan cache hak istimewa lokal Anda.
  • Pada Android, selalu tanyakan ke Google Play Developer API dengan purchaseToken untuk mendapatkan tanggal kedaluwarsa atau status pengembalian uang.
  • Pada iOS, periksa isActive/expirationDate dan validasi tagihan untuk mendeteksi pengembalian uang atau pembatalan.

Jika Anda menggunakan Getting Started To merencanakan persetujuan toko dan distribusi, hubungkannya dengan Menggunakan @capgo/native-purchases Untuk kemampuan asli dalam Menggunakan @capgo/native-purchases, @capgo/capacitor-in-app-review Untuk detail implementasi dalam @capgo/capacitor-in-app-review, Menggunakan @capgo/capacitor-in-app-review Untuk kemampuan asli dalam Menggunakan @capgo/capacitor-in-app-review, @capgo/capacitor-native-market Untuk detail implementasi dalam @capgo/capacitor-native-market, dan Menggunakan @capgo/capacitor-native-market Untuk kemampuan asli dalam Menggunakan @capgo/capacitor-native-market.