Persyaratan Kualitas Tinjauan Aplikasi
Stripe meninjau setiap aplikasi yang dikirimkan ke marketplace berdasarkan seperangkat persyaratan kualitas yang menyeluruh. Memahami standar ini sebelum pengembangan menghemat waktu dan mengurangi jumlah iterasi tinjauan.
Ikhtisar
Tinjauan Stripe App menilai aplikasi Anda pada enam area utama:
- Harga yang transparan, komunikasi biaya yang jelas
- Fungsionalitas aplikasi, keandalan dan kelengkapan
- Standar pengembang, kualitas kode dan penggunaan API
- Kualitas UX, standar antarmuka dan pengalaman pengguna
- Keamanan, perlindungan data dan praktik yang aman
- Kepatuhan hukum, persyaratan privasi dan regulasi
Harga yang transparan
Aplikasi Anda harus mengomunikasikan seluruh biaya kepada pengguna dengan jelas:
- Pengungkapan harga: Semua harga harus dinyatakan di awal pada halaman marketplace
- Tanpa biaya tersembunyi: Pengguna tidak boleh menemui tagihan tak terduga setelah pemasangan
- Ketentuan uji coba: Jika menawarkan uji coba, nyatakan durasinya dengan jelas dan apa yang terjadi setelah berakhir
- Alur upgrade: Setiap ajakan upsell atau upgrade harus tidak mengganggu dan jelas bersifat opsional
- Mata uang: Tampilkan harga dalam mata uang lokal pengguna bila memungkinkan
Caution
Aplikasi yang menyamarkan harga atau menagih pengguna tanpa persetujuan yang jelas akan langsung ditolak.
Format tanggal dan waktu
Semua tanggal dan waktu yang ditampilkan di aplikasi Anda harus mengikuti konvensi Stripe Dashboard:
- Gunakan locale pengguna untuk format tanggal bila tersedia
- Tampilkan waktu dalam zona waktu lokal pengguna
- Gunakan stempel waktu relatif untuk peristiwa terkini (misalnya, “2 hours ago”)
- Gunakan stempel waktu absolut untuk peristiwa lama, lengkap dengan tanggal dan jam
- Ikuti ISO 8601 untuk setiap field tanggal yang menghadap API
// Good: Use Stripe's date formatting utilitiesimport { formatDate, formatRelativeTime } from '@stripe/ui-extension-sdk/utils';
const formattedDate = formatDate(timestamp); // Locale-awareconst relativeTime = formatRelativeTime(timestamp); // "2 hours ago"Pengaturan aplikasi
Jika aplikasi Anda memerlukan konfigurasi:
- Sediakan tampilan Settings khusus yang dapat diakses dari viewport aplikasi
- Isi terlebih dahulu nilai default yang masuk akal bila memungkinkan
- Validasi seluruh input pengguna disertai pesan kesalahan yang jelas
- Izinkan pengguna memperbarui pengaturan tanpa memasang ulang aplikasi
- Simpan pengaturan lintas sesi menggunakan Stripe Secret Store API
Dukungan sandbox
Aplikasi Anda harus berfungsi dengan benar dalam mode sandbox (uji) Stripe:
- Kompatibilitas mode uji: Semua fitur harus berfungsi dalam mode uji
- Data uji: Gunakan data uji realistis yang memperlihatkan fungsionalitas aplikasi
- Tanpa data live di sandbox: Jangan pernah menampilkan data produksi dalam mode uji
- Penanganan yang baik: Jika suatu fitur tidak tersedia di sandbox, tampilkan pesan jelas yang menjelaskan alasannya
- Setel
sandbox_install_compatible: truepada manifest Anda
{ "sandbox_install_compatible": true}Fungsionalitas aplikasi
Keandalan
- Aplikasi tidak boleh mogok atau membeku selama penggunaan normal
- Semua fitur yang diiklankan harus bekerja sesuai deskripsi
- Kesalahan jaringan harus ditangani dengan baik disertai opsi coba ulang
- Aplikasi harus tetap responsif selama operasi di latar belakang
Kelengkapan
- Tanpa konten placeholder, fitur “coming soon”, atau tautan rusak
- Semua elemen UI harus berfungsi, tanpa tombol mati atau kontrol nonaktif
- Teks bantuan dan tautan dokumentasi harus mengarah ke halaman yang valid
- Pencopotan pemasangan harus menghapus seluruh data dan Webhook aplikasi secara bersih
Performa
- UI harus tampil dalam waktu 3 detik pada koneksi standar
- Operasi sinkronisasi latar belakang tidak boleh memblokir UI
- Kumpulan data besar harus menggunakan paginasi atau lazy loading
- Minimalkan panggilan API untuk menghindari pembatasan laju
Standar pengembang
Penggunaan API
- Gunakan versi stabil terbaru dari Stripe API
- Ikuti praktik terbaik Stripe API untuk paginasi, penanganan kesalahan, dan idempotensi
- Jangan melampaui batas laju, terapkan exponential backoff untuk percobaan ulang
- Gunakan Webhook untuk pembaruan berbasis event alih-alih polling
Kualitas kode
- Tanpa kesalahan atau peringatan console pada build produksi
- Hapus seluruh logging debug sebelum pengiriman
- Tangani semua kasus tepi (empty state, data hilang, kegagalan jaringan)
- Ikuti pola pustaka komponen Stripe demi UI yang konsisten
Versioning
- Gunakan semantic versioning (MAJOR.MINOR.PATCH)
- Dokumentasikan perubahan yang merusak kompatibilitas pada pembaruan versi
- Pertahankan kompatibilitas mundur bila memungkinkan
Kualitas UX
Iklan
- Tanpa iklan: Aplikasi Anda tidak boleh menampilkan iklan dalam bentuk apa pun
- Tanpa promosi silang: Jangan mempromosikan produk atau layanan lain di dalam UI aplikasi
- Konten bermerek: Tampilkan hanya identitas merek Anda sendiri, bukan merek pihak ketiga (kecuali mitra integrasi seperti Brevo)
Bahasa dan konten
- Bahasa yang konsisten: Gunakan terminologi yang konsisten di seluruh aplikasi
- Nada profesional: Selaraskan dengan gaya komunikasi Stripe Dashboard yang profesional dan ringkas
- Tanpa jargon: Hindari jargon teknis yang mungkin tidak dipahami merchant
- Periksa ejaan: Pastikan seluruh teks bebas dari kesalahan ejaan dan tata bahasa
- Hanya bahasa Inggris: Semua teks yang dilihat pengguna harus dalam bahasa Inggris untuk aplikasi marketplace
Dialog konfirmasi
Minta konfirmasi pengguna untuk tindakan yang merusak atau signifikan:
// Good: Confirm before destructive actionsconst handleDisconnect = async () => { const confirmed = await showConfirmation({ title: 'Disconnect Brevo Integration', message: 'This will stop syncing customer data to Brevo. You can reconnect at any time.', confirmLabel: 'Disconnect', cancelLabel: 'Cancel', destructive: true, });
if (confirmed) { await disconnectIntegration(); }};Tindakan yang memerlukan konfirmasi:
- Memutuskan integrasi
- Menghapus data yang tersinkronisasi
- Mengubah pengaturan yang memengaruhi aliran data
- Mengembalikan konfigurasi ke nilai default
Status pemuatan
Selalu tampilkan indikator pemuatan untuk operasi asinkron:
// Good: Show loading state during data fetchconst CustomerSyncStatus = () => { const { data, isLoading, error } = useSyncStatus();
if (isLoading) { return <Spinner label="Loading sync status..." />; }
if (error) { return <Banner type="critical" title="Failed to load sync status"> {error.message} </Banner>; }
return <SyncStatusDisplay data={data} />;};Persyaratan:
- Tampilkan spinner atau skeleton screen selama pemuatan data
- Nonaktifkan tombol selama pengiriman formulir
- Tampilkan indikator progres untuk operasi yang berjalan lama
- Jangan pernah menampilkan layar kosong saat memuat
Pesan kesalahan
Sediakan pesan kesalahan yang jelas dan dapat ditindaklanjuti:
// Bad: Generic error"Something went wrong"
// Good: Specific and actionable"Unable to sync customer data to Brevo. Please verify your Brevo API keyin Settings and try again."Panduan pesan kesalahan:
- Jelaskan apa yang terjadi dengan bahasa yang sederhana
- Sarankan tindakan spesifik yang dapat dilakukan pengguna untuk menyelesaikannya
- Sediakan cara untuk mencoba ulang operasi yang gagal
- Catat informasi kesalahan yang rinci untuk debugging (tidak ditampilkan kepada pengguna)
- Sertakan kode kesalahan sebagai rujukan dukungan bila relevan
Keamanan
Secret Store API
Gunakan Secret Store API dari Stripe untuk seluruh penyimpanan data sensitif:
import { createHttpClient, STRIPE_API_KEY } from '@stripe/ui-extension-sdk/http_client';
// Good: Store secrets using the Secret Store APIconst storeBrevoApiKey = async (apiKey: string) => { const stripe = createHttpClient(STRIPE_API_KEY); await stripe.apps.secrets.create({ name: 'brevo_api_key', payload: apiKey, scope: { type: 'account' }, });};
// Good: Retrieve secrets from the Secret Storeconst getBrevoApiKey = async () => { const stripe = createHttpClient(STRIPE_API_KEY); const secret = await stripe.apps.secrets.find({ name: 'brevo_api_key', scope: { type: 'account' }, }); return secret.payload;};Jangan pernah menyimpan data sensitif di:
- Local storage atau session storage
- Cookie
- Parameter URL
- Nilai yang di-hardcode dalam kode sumber
- File konfigurasi teks biasa
Kriptografi
- Tanpa kriptografi buatan sendiri: Jangan menerapkan algoritma enkripsi Anda sendiri
- Gunakan primitif keamanan bawaan Stripe (Secret Store, signing secret)
- Gunakan HTTPS untuk semua panggilan API eksternal
- Validasi semua tanda tangan Webhook sebelum diproses
Penanganan data
- Minta hanya izin yang benar-benar dibutuhkan aplikasi Anda
- Jangan menyimpan data Stripe di luar yang diperlukan untuk fungsionalitas
- Terapkan kebijakan retensi data yang selaras dengan kebijakan privasi Anda
- Sediakan mekanisme bagi pengguna untuk meminta penghapusan data
Kepatuhan hukum
Kebijakan privasi
Aplikasi Anda harus memiliki kebijakan privasi yang dapat diakses publik dan mencakup:
- Data apa yang dikumpulkan aplikasi Anda dari Stripe
- Bagaimana data disimpan, diproses, dan dibagikan
- Kebijakan retensi dan penghapusan data
- Hak pengguna atas data mereka
- Informasi kontak untuk pertanyaan seputar privasi
- Kepatuhan terhadap regulasi yang berlaku (GDPR, CCPA, dan lainnya)
Ketentuan layanan
- Sediakan ketentuan layanan yang jelas untuk aplikasi Anda
- Jangan menyertakan ketentuan yang bertentangan dengan Ketentuan Layanan Stripe
- Nyatakan dengan jelas setiap batasan atau pembatasan penggunaan
Kepatuhan regulasi
- Patuhi seluruh regulasi perlindungan data yang berlaku
- Terapkan perjanjian pemrosesan data yang sesuai
- Dukung permintaan portabilitas dan penghapusan data
- Pelihara log audit untuk akses dan pemrosesan data
Linimasa proses tinjauan
| Tahap | Durasi |
|---|---|
| Pengiriman awal | 5-10 hari kerja |
| Tinjauan revisi | 3-7 hari kerja |
| Persetujuan akhir | 1-2 hari kerja |
| Publikasi | Segera setelah disetujui |
Tip
Tangani seluruh masukan tinjauan dalam satu revisi agar tidak terjadi banyak siklus tinjauan. Tim Stripe memberikan masukan yang spesifik dan dapat ditindaklanjuti untuk setiap masalah yang ditemukan.
Alasan penolakan yang umum
- Penanganan kesalahan yang hilang, aplikasi mogok saat terjadi kesalahan jaringan atau data tak terduga
- Status pemuatan yang kurang, layar kosong saat pengambilan data
- Harga yang tidak jelas, harga tidak diungkapkan sepenuhnya di halaman marketplace
- Izin berlebihan, meminta izin yang tidak dibutuhkan aplikasi
- Mode sandbox rusak, aplikasi tidak berfungsi dalam mode uji
- Masalah keamanan, menyimpan secret di luar Secret Store API
- Kebijakan privasi tidak ada, tidak ada URL kebijakan privasi yang dapat diakses
- Fungsionalitas tidak lengkap, fitur “coming soon” atau konten placeholder