Zahtevi kvaliteta pri pregledu aplikacije
Stripe pregleda svaku aplikaciju prijavljenu za marketplace prema sveobuhvatnom skupu zahteva kvaliteta. Ako ove standarde razumete pre razvoja, uštedećete vreme i smanjiti broj krugova pregleda.
Pregled
Pregled Stripe App ocenjuje vašu aplikaciju kroz šest ključnih oblasti:
- Transparentne cene, jasno saopštavanje troškova
- Funkcionalnost aplikacije, pouzdanost i potpunost
- Standardi za programere, kvalitet koda i upotreba API-ja
- Kvalitet UX-a, standardi korisničkog interfejsa i iskustva
- Bezbednost, zaštita podataka i bezbedne prakse
- Pravna usklađenost, zahtevi privatnosti i regulative
Transparentne cene
Vaša aplikacija mora jasno da saopšti sve troškove korisnicima:
- Objavljivanje cena: sve cene moraju biti navedene unapred u marketplace opisu
- Bez skrivenih naknada: korisnici ne smeju da naiđu na neočekivane troškove nakon instalacije
- Uslovi probnog perioda: ako nudite probni period, jasno navedite koliko traje i šta se dešava kada se završi
- Tokovi nadogradnje: svaki upit za dodatnu prodaju ili nadogradnju mora biti nenametljiv i jasno opcion
- Valuta: prikazujte cene u lokalnoj valuti korisnika kad god je to moguće
Caution
Aplikacije koje prikrivaju cene ili naplaćuju korisnicima bez jasnog pristanka biće odmah odbijene.
Formatiranje datuma i vremena
Svi datumi i vremena prikazani u vašoj aplikaciji moraju da prate konvencije Stripe Dashboard-a:
- Koristite lokalizaciju korisnika za formatiranje datuma kada je dostupna
- Prikazujte vremena u lokalnoj vremenskoj zoni korisnika
- Koristite relativne vremenske oznake za skorašnje događaje (npr. „pre 2 sata”)
- Koristite apsolutne vremenske oznake sa punim datumom i vremenom za starije događaje
- Pratite ISO 8601 za sva polja sa datumom koja idu ka API-ju
// 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"Podešavanja aplikacije
Ako vaša aplikacija zahteva konfigurisanje:
- Obezbedite poseban pogled sa podešavanjima dostupan iz viewport-a aplikacije
- Popunite razumne podrazumevane vrednosti kad god je to moguće
- Proveravajte sve korisničke unose uz jasne poruke o greškama
- Omogućite korisnicima da menjaju podešavanja bez ponovne instalacije aplikacije
- Trajno čuvajte podešavanja između sesija pomoću Stripe Secret Store API-ja
Podrška za sandbox
Vaša aplikacija mora ispravno da radi u Stripe sandbox (test) režimu:
- Kompatibilnost sa test režimom: sve funkcije moraju da rade u test režimu
- Test podaci: koristite realistične test podatke koji pokazuju funkcionalnost aplikacije
- Bez live podataka u sandbox-u: nikada ne izlažite produkcione podatke u test režimu
- Elegantno rešavanje: ako neka funkcija nije dostupna u sandbox-u, prikažite jasnu poruku sa objašnjenjem
- Postavite
sandbox_install_compatible: trueu svom manifestu
{ "sandbox_install_compatible": true}Funkcionalnost aplikacije
Pouzdanost
- Aplikacija ne sme da se ruši ni da se zamrzava tokom uobičajene upotrebe
- Sve oglašene funkcije moraju da rade kako je opisano
- Mrežne greške moraju da se obrađuju elegantno, uz mogućnost ponovnog pokušaja
- Aplikacija mora da ostane responzivna tokom operacija u pozadini
Potpunost
- Bez sadržaja koji je samo popuna, funkcija sa oznakom „uskoro” i pokvarenih veza
- Svi elementi interfejsa moraju biti funkcionalni, bez mrtvih dugmadi i neaktivnih kontrola
- Tekstovi pomoći i veze ka dokumentaciji moraju da vode na važeće stranice
- Deinstalacija mora u potpunosti da ukloni sve podatke aplikacije i webhook-ove
Performanse
- Interfejs mora da se prikaže u roku od 3 sekunde na standardnoj vezi
- Sinhronizacija u pozadini ne sme da blokira interfejs
- Veliki skupovi podataka moraju da koriste paginaciju ili odloženo učitavanje
- Svedite API pozive na najmanju meru da biste izbegli ograničenje broja zahteva
Standardi za programere
Upotreba API-ja
- Koristite najnoviju stabilnu verziju Stripe API-ja
- Pratite najbolje prakse Stripe API-ja za paginaciju, obradu grešaka i idempotentnost
- Ne prekoračujte ograničenja broja zahteva, primenite eksponencijalno odlaganje za ponovne pokušaje
- Koristite webhook-ove za ažuriranja vođena događajima umesto stalnog ispitivanja
Kvalitet koda
- Bez grešaka i upozorenja u konzoli u produkcionim buildovima
- Uklonite sve debug zapise pre prijave
- Obradite sve granične slučajeve (prazna stanja, nedostajući podaci, mrežni prekidi)
- Pratite obrasce Stripe biblioteke komponenti radi doslednog interfejsa
Verzionisanje
- Koristite semantičko verzionisanje (MAJOR.MINOR.PATCH)
- Dokumentujte promene koje narušavaju kompatibilnost u ažuriranjima verzija
- Održavajte kompatibilnost unazad kad god je moguće
Kvalitet UX-a
Oglašavanje
- Bez reklama: vaša aplikacija ne sme da prikazuje reklame bilo koje vrste
- Bez unakrsne promocije: ne promovišite druge proizvode ili usluge unutar interfejsa aplikacije
- Brendirani sadržaj: prikazujte samo sopstveni brend, ne i brendove trećih strana (osim integracionih partnera kao što je Brevo)
Jezik i sadržaj
- Dosledan jezik: koristite doslednu terminologiju u celoj aplikaciji
- Profesionalan ton: uskladite se sa profesionalnim i sažetim stilom komunikacije Stripe Dashboard-a
- Bez žargona: izbegavajte tehnički žargon koji trgovci možda neće razumeti
- Provera pravopisa: postarajte se da sav tekst bude bez pravopisnih i gramatičkih grešaka
- Samo engleski: sav tekst vidljiv korisnicima mora biti na engleskom za marketplace aplikacije
Dijalozi za potvrdu
Tražite potvrdu korisnika za destruktivne ili značajne akcije:
// 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(); }};Akcije koje zahtevaju potvrdu:
- Prekidanje veze sa integracijama
- Brisanje sinhronizovanih podataka
- Promena podešavanja koja utiču na tok podataka
- Vraćanje konfiguracije na podrazumevane vrednosti
Stanja učitavanja
Uvek prikazujte indikatore učitavanja za asinhrone operacije:
// 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} />;};Zahtevi:
- Prikazujte spinere ili skeletne ekrane tokom učitavanja podataka
- Onemogućite dugmad tokom slanja formulara
- Prikazujte indikatore napretka za dugotrajne operacije
- Nikada ne prikazujte prazan ekran tokom učitavanja
Poruke o greškama
Obezbedite jasne poruke o greškama koje vode ka rešenju:
// 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."Smernice za poruke o greškama:
- Objasnite šta se dogodilo jednostavnim jezikom
- Predložite konkretnu akciju kojom korisnik može da reši problem
- Obezbedite način da se neuspela operacija ponovi
- Beležite detaljne informacije o grešci radi otklanjanja problema (koje se ne prikazuju korisnicima)
- Navedite kodove grešaka radi lakše podrške kada je to primenljivo
Bezbednost
Secret Store API
Koristite Stripe Secret Store API za čuvanje svih osetljivih podataka:
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;};Osetljive podatke nikada ne čuvajte u:
- Local storage ili session storage
- Kolačićima
- URL parametrima
- Vrednostima upisanim direktno u izvorni kod
- Konfiguracionim fajlovima u čistom tekstu
Kriptografija
- Bez sopstvene kriptografije: ne implementirajte sopstvene algoritme za šifrovanje
- Koristite ugrađene bezbednosne mehanizme platforme Stripe (Secret Store, tajne za potpisivanje)
- Koristite HTTPS za sve pozive spoljnih API-ja
- Proverite sve webhook potpise pre obrade
Rukovanje podacima
- Tražite samo dozvole koje su vašoj aplikaciji zaista potrebne
- Ne čuvajte Stripe podatke izvan onoga što je neophodno za funkcionisanje
- Primenite politike čuvanja podataka usklađene sa svojom politikom privatnosti
- Obezbedite mehanizam preko kojeg korisnici mogu da zatraže brisanje podataka
Pravna usklađenost
Politika privatnosti
Vaša aplikacija mora da ima javno dostupnu politiku privatnosti koja obuhvata:
- Koje podatke vaša aplikacija prikuplja iz platforme Stripe
- Kako se podaci čuvaju, obrađuju i dele
- Politike čuvanja i brisanja podataka
- Prava korisnika u vezi sa njihovim podacima
- Kontakt podatke za upite o privatnosti
- Usklađenost sa važećim propisima (GDPR, CCPA i drugi)
Uslovi korišćenja
- Obezbedite jasne uslove korišćenja za svoju aplikaciju
- Ne uključujte odredbe koje su u sukobu sa Stripe uslovima korišćenja
- Jasno navedite sva ograničenja upotrebe
Regulatorna usklađenost
- Uskladite se sa svim važećim propisima o zaštiti podataka
- Sklopite odgovarajuće ugovore o obradi podataka
- Podržite zahteve za prenosivost i brisanje podataka
- Vodite revizijske zapise o pristupu podacima i njihovoj obradi
Vremenski okvir procesa pregleda
| Faza | Trajanje |
|---|---|
| Prva prijava | 5-10 radnih dana |
| Pregled izmena | 3-7 radnih dana |
| Konačno odobrenje | 1-2 radna dana |
| Objavljivanje | Odmah nakon odobrenja |
Tip
Odgovorite na sve primedbe iz pregleda u jednoj izmeni kako biste izbegli više krugova pregleda. Stripe tim daje konkretne i primenljive povratne informacije za svaki uočeni problem.
Uobičajeni razlozi za odbijanje
- Nedostaje obrada grešaka, aplikacija se ruši pri mrežnim greškama ili neočekivanim podacima
- Nedovoljna stanja učitavanja, prazni ekrani tokom preuzimanja podataka
- Nejasne cene, cene nisu u potpunosti objavljene u opisu
- Prekomerne dozvole, traže se dozvole koje aplikaciji nisu potrebne
- Neispravan sandbox režim, aplikacija ne radi u test režimu
- Bezbednosni problemi, čuvanje tajni izvan Secret Store API-ja
- Nedostaje politika privatnosti, nema dostupnog URL-a politike privatnosti
- Nepotpuna funkcionalnost, funkcije sa oznakom „uskoro” ili sadržaj koji je samo popuna