Getting Started
Copas prompt pengaturan dengan langkah instalasi dan panduan markdown lengkap untuk plugin ini.
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.
Pemasangan
Bagian berjudul “Pemasangan”Anda dapat menggunakan Pengaturan Bantu AI kami untuk menginstal plugin. Tambahkan Capgo kemampuan ke alat AI Anda menggunakan perintah berikut:
npx skills add https://github.com/Cap-go/capgo-skills --skill capacitor-pluginsLalu 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 ini:
-
Pasang paket ini
Jendela terminal bun add @capgo/native-purchases -
Sinkron dengan proyek native
Jendela terminal bunx cap sync -
Periksa dukungan billing
import { NativePurchases } from '@capgo/native-purchases';const { isBillingSupported } = await NativePurchases.isBillingSupported();if (!isBillingSupported) {throw new Error('Billing is not available on this device');} -
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);}); -
Implementasikan alur pembelian & restorasi
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();- Buat produk dan langganan dalam aplikasi di App Store Connect.
- Gunakan StoreKit Local Testing atau Sandbox tester untuk QA.
- Tidak perlu mengedit manifest. Pastikan produk Anda disetujui.
- Buat produk dan langganan dalam aplikasi di Google Play Console.
- Unggah setidaknya satu build uji internal dan tambahkan tester lisensi.
- Tambahkan izin billing ke
AndroidManifest.xml:
<uses-permission android:name="com.android.vending.BILLING" /> - Buat produk dan langganan dalam aplikasi di App Store Connect.
Contoh pembelian layanan
Bagian berjudul “Contoh Pembelian Layanan”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, }), }); }}Opsi pembelian yang diperlukan
Bagian berjudul “Opsi Pembelian yang Diperlukan”| Opsi | Platform | Deskripsi |
|---|---|---|
productIdentifier | iOS + Android | Kode SKU/ID Produk yang terkonfigurasi di App Store Connect / Google Play Console. |
productType | Hanya Android | PURCHASE_TYPE.INAPP atau PURCHASE_TYPE.SUBS. Defaultnya adalah INAPP. Selalu ditetapkan sebagai SUBS untuk langganan. |
planIdentifier | Langganan Android | ID Rencana Dasar dari Google Play Console. Diperlukan untuk langganan, diabaikan pada iOS dan pembelian dalam aplikasi. |
billingPlanType | Langganan iOS | Rencana pembayaran StoreKit untuk pembelian. Gunakan 'monthly' untuk tagihan bulanan dengan komitmen 12 bulan ketika product.pricingTerms mengekspos opsi tersebut. |
quantity | iOS | Hanya untuk pembelian dalam aplikasi, default ke 1. Android selalu membeli item satu. |
appAccountToken | iOS + Android | UUID/nilai string yang menghubungkan pembelian ke pengguna Anda. Diperlukan untuk UUID di iOS; Android menerima string yang dienkripsi hingga 64 karakter. |
isConsumable | Android | Ditetapkan ke true untuk mengonsumsi token secara otomatis setelah memberikan hak untuk konsumables. Default ke false. |
Mengecek status hak
Bagian berjudul “Mengecek status hak”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); }});Tindakan platform
Judul bagian “Tindakan platform”- iOS: Langganan termasuk
isActive,expirationDate,willCancel, dan dukungan pemantauan StoreKit 2. Pembelian dalam aplikasi memerlukan validasi bukti penerimaan server. - Android:
isActive/expirationDatetidak diisi; hubungi pengembang Google Play Developer API untuk status yang otoritatif.purchaseTokenharus dipenuhi;purchaseStatedapat dipenuhi;PURCHASEDdanisAcknowledgedwajib adatrue.
API referensi cepat
Judul bagian “API referensi cepat”isBillingSupported()– periksa ketersediaan StoreKit / Google Play.getProduct()/getProducts()– ambil harga, judul yang disesuaikan dengan lokasi, 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 pengelolaan langganan native.addListener('transactionUpdated')– tangani transaksi StoreKit 2 yang menunggu ketika aplikasi Anda dimulai (hanya iOS).
Praktik terbaik
Bagian berjudul “Praktik Terbaik”- Tampilkan harga toko – Apple memerlukan menampilkan
product.titledanproduct.priceString; tidak pernah mengkodekan secara keras. - Pakai
appAccountToken– generate UUID (v5) secara deterministik dari ID pengguna untuk menghubungkan pembelian ke akun. - Validasi di server – kirim
receipt(iOS) /purchaseToken(Android) ke backend Anda untuk verifikasi. - Tangani kesalahan dengan sopan – periksa pembatalan pengguna, kegagalan jaringan, dan lingkungan pembayaran yang tidak didukung.
- Test secara menyeluruh – ikuti panduan sandbox iOS dan panduan sandbox Android Tawarkan pengembalian dan manajemen.
- – tambahkan tombol UI yang terhubung ke dan
restorePurchases()Langkah-Langkah Pendapatan SelanjutnyamanageSubscriptions().
Judul bagian “Langkah-Langkah Pendapatan Selanjutnya”
Sesudah alur pembelian berfungsi, gunakan__CAPGO_KEEP_0__ Pedoman Pendapatan Untuk merencanakan funnel pembayaran pertama Anda: skop produk, ASO, harga, penempatan paywall, analisis, dan umpan balik pengurangan.
Pengaturan Masalah
Bab berjudul “Pengaturan Masalah”Produk tidak terbuka
- Pastikan ID bundle / ID aplikasi sesuai dengan konfigurasi toko.
- Konfirmasikan 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/catchdan 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
purchaseTokenuntuk mendapatkan tanggal kedaluwarsa atau status pengembalian uang. - Pada iOS, periksa
isActive/expirationDatedan validasi struk untuk mendeteksi pengembalian uang atau pembatalan.
Teruskan dari Getting Started
Judul bagian “Teruskan dari Getting Started”Jika Anda menggunakan Getting Started untuk 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.