Požiadavky na kvalitu pri kontrole aplikácie
Stripe posudzuje každú aplikáciu odoslanú na marketplace podľa komplexného súboru požiadaviek na kvalitu. Ak tieto štandardy poznáte už pred vývojom, ušetríte čas a znížite počet kôl kontroly.
Prehľad
Kontrola Stripe App hodnotí Vašu aplikáciu v šiestich kľúčových oblastiach:
- Transparentné ceny, jasná komunikácia nákladov
- Funkčnosť aplikácie, spoľahlivosť a úplnosť
- Vývojárske štandardy, kvalita kódu a používanie API
- Kvalita UX, štandardy používateľského rozhrania a používateľskej skúsenosti
- Bezpečnosť, ochrana dát a bezpečné postupy
- Právny súlad, požiadavky na ochranu súkromia a reguláciu
Transparentné ceny
Vaša aplikácia musí používateľom jasne komunikovať všetky náklady:
- Zverejnenie cien: všetky ceny musia byť vopred uvedené v zázname na marketplace
- Žiadne skryté poplatky: používatelia sa po inštalácii nesmú stretnúť s neočakávanými poplatkami
- Podmienky skúšobnej verzie: ak ponúkate skúšobnú verziu, jasne uveďte jej trvanie a to, čo nastane po jej skončení
- Prechod na vyšší plán: akékoľvek ponuky upsellu alebo prechodu na vyšší plán musia byť nenásilné a zjavne dobrovoľné
- Mena: ceny podľa možnosti zobrazujte v lokálnej mene používateľa
Caution
Aplikácie, ktoré zahmlievajú ceny alebo účtujú používateľom bez jasného súhlasu, budú okamžite zamietnuté.
Formátovanie dátumu a času
Všetky dátumy a časy zobrazené vo Vašej aplikácii musia dodržiavať konvencie Stripe Dashboardu:
- Ak je to možné, formátujte dátum podľa jazykového nastavenia používateľa
- Časy zobrazujte v miestnom časovom pásme používateľa
- Pri nedávnych udalostiach používajte relatívne časové údaje (napríklad “2 hours ago”)
- Pri starších udalostiach používajte absolútne časové údaje s celým dátumom a časom
- Pri dátumových poliach smerujúcich do API dodržiavajte ISO 8601
// 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"Nastavenia aplikácie
Ak Vaša aplikácia vyžaduje konfiguráciu:
- Poskytnite samostatné zobrazenie nastavení dostupné z viewportu aplikácie
- Kde je to možné, predvyplňte rozumné predvolené hodnoty
- Overujte všetky vstupy od používateľa a zobrazujte zrozumiteľné chybové hlásenia
- Umožnite používateľom meniť nastavenia bez preinštalovania aplikácie
- Nastavenia uchovávajte naprieč reláciami pomocou Stripe Secret Store API
Podpora sandboxu
Vaša aplikácia musí správne fungovať v sandboxovom (testovacom) režime Stripe:
- Kompatibilita s testovacím režimom: všetky funkcie musia fungovať v testovacom režime
- Testovacie dáta: používajte realistické testovacie dáta, ktoré predvedú funkčnosť aplikácie
- Žiadne ostré dáta v sandboxe: nikdy nesprístupňujte produkčné dáta v testovacom režime
- Korektné spracovanie: ak niektorá funkcia nie je v sandboxe dostupná, zobrazte jasné vysvetlenie prečo
- V manifeste nastavte
sandbox_install_compatible: true
{ "sandbox_install_compatible": true}Funkčnosť aplikácie
Spoľahlivosť
- Aplikácia nesmie pri bežnom používaní padať ani zamŕzať
- Všetky propagované funkcie musia fungovať tak, ako sú opísané
- Sieťové chyby musia byť spracované korektne s možnosťou opakovania
- Aplikácia musí zostať responzívna počas operácií na pozadí
Úplnosť
- Žiadny zástupný obsah, funkcie s označením “coming soon” ani nefunkčné odkazy
- Všetky prvky UI musia byť funkčné, žiadne mŕtve tlačidlá ani neaktívne ovládacie prvky
- Pomocné texty a odkazy na dokumentáciu musia viesť na platné stránky
- Odinštalovanie musí čisto odstrániť všetky dáta aplikácie aj webhooky
Výkon
- UI sa musí na štandardnom pripojení vykresliť do 3 sekúnd
- Synchronizácia na pozadí nesmie blokovať UI
- Veľké množstvá dát musia využívať stránkovanie alebo lenivé načítavanie
- Minimalizujte počet volaní API, aby ste nenarazili na limity požiadaviek
Vývojárske štandardy
Používanie API
- Používajte najnovšiu stabilnú verziu Stripe API
- Dodržiavajte osvedčené postupy Stripe API pre stránkovanie, spracovanie chýb a idempotenciu
- Neprekračujte limity požiadaviek, pri opakovaniach implementujte exponenciálne predlžovanie odstupu
- Na aktualizácie riadené udalosťami používajte webhooky namiesto opakovaného dopytovania
Kvalita kódu
- Žiadne chyby ani upozornenia v konzole v produkčných zostaveniach
- Pred odoslaním odstráňte všetko ladiace logovanie
- Ošetrite všetky hraničné prípady (prázdne stavy, chýbajúce dáta, výpadky siete)
- Kvôli konzistentnému UI dodržiavajte vzory z knižnice komponentov Stripe
Verzovanie
- Používajte sémantické verzovanie (MAJOR.MINOR.PATCH)
- Pri aktualizáciách verzií zdokumentujte nekompatibilné zmeny
- Kde je to možné, zachovajte spätnú kompatibilitu
Kvalita UX
Reklama
- Žiadne reklamy: Vaša aplikácia nesmie zobrazovať žiadne reklamy
- Žiadna krížová propagácia: v rozhraní aplikácie nepropagujte iné produkty ani služby
- Značkový obsah: zobrazujte iba vlastnú identitu značky, nie značky tretích strán (s výnimkou integračných partnerov, ako je Brevo)
Jazyk a obsah
- Konzistentný jazyk: v celej aplikácii používajte jednotnú terminológiu
- Profesionálny tón: držte sa profesionálneho a stručného štýlu komunikácie Stripe Dashboardu
- Žiadny žargón: vyhýbajte sa technickému žargónu, ktorému obchodníci nemusia rozumieť
- Kontrola pravopisu: uistite sa, že všetky texty neobsahujú pravopisné ani gramatické chyby
- Iba angličtina: všetky texty pre používateľa musia byť pri aplikáciách na marketplace v angličtine
Potvrdzovacie dialógy
Pri deštruktívnych alebo závažných akciách vyžadujte potvrdenie od používateľa:
// 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(); }};Akcie, ktoré vyžadujú potvrdenie:
- Odpojenie integrácií
- Odstránenie synchronizovaných dát
- Zmena nastavení, ktoré ovplyvňujú tok dát
- Obnovenie konfigurácie na predvolené hodnoty
Stavy načítavania
Pri asynchrónnych operáciách vždy zobrazujte indikátory načítavania:
// 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} />;};Požiadavky:
- Počas načítavania dát zobrazujte spinnery alebo skeletonové obrazovky
- Počas odosielania formulára deaktivujte tlačidlá
- Pri dlho bežiacich operáciách zobrazujte indikátory priebehu
- Počas načítavania nikdy nezobrazujte prázdnu obrazovku
Chybové hlásenia
Poskytujte jasné chybové hlásenia, s ktorými sa dá niečo urobiť:
// 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."Pravidlá pre chybové hlásenia:
- Zrozumiteľným jazykom vysvetlite, čo sa stalo
- Navrhnite konkrétny krok, ktorým používateľ problém vyrieši
- Poskytnite spôsob, ako zlyhanú operáciu zopakovať
- Podrobné informácie o chybe logujte na ladenie (používateľom sa nezobrazujú)
- Ak to dáva zmysel, uvádzajte kódy chýb pre potreby podpory
Bezpečnosť
Secret Store API
Na ukladanie všetkých citlivých dát používajte Stripe Secret Store API:
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;};Citlivé dáta nikdy neukladajte do:
- Lokálneho úložiska ani úložiska relácie
- Cookies
- Parametrov URL
- Napevno zapísaných hodnôt v zdrojovom kóde
- Konfiguračných súborov v čistom texte
Kryptografia
- Žiadna vlastná kryptografia: neimplementujte vlastné šifrovacie algoritmy
- Používajte vstavané bezpečnostné prvky Stripe (Secret Store, podpisové kľúče)
- Pri všetkých volaniach externých API používajte HTTPS
- Pred spracovaním overte všetky podpisy webhookov
Práca s dátami
- Žiadajte iba tie oprávnenia, ktoré Vaša aplikácia naozaj potrebuje
- Neukladajte dáta zo Stripe nad rámec toho, čo je pre funkčnosť nevyhnutné
- Zaveďte pravidlá uchovávania dát v súlade so svojimi zásadami ochrany osobných údajov
- Poskytnite používateľom spôsob, ako požiadať o vymazanie dát
Právny súlad
Zásady ochrany osobných údajov
Vaša aplikácia musí mať verejne dostupné zásady ochrany osobných údajov, ktoré pokrývajú:
- Aké dáta Vaša aplikácia zbiera zo Stripe
- Ako sa dáta ukladajú, spracúvajú a zdieľajú
- Pravidlá uchovávania a mazania dát
- Práva používateľov vo vzťahu k ich dátam
- Kontaktné údaje pre otázky týkajúce sa ochrany súkromia
- Súlad s platnými predpismi (GDPR, CCPA a podobne)
Obchodné podmienky
- Poskytnite pre svoju aplikáciu jasné obchodné podmienky
- Neuvádzajte podmienky, ktoré sú v rozpore s obchodnými podmienkami Stripe
- Jasne uveďte všetky obmedzenia používania
Regulačný súlad
- Dodržiavajte všetky platné predpisy o ochrane osobných údajov
- Zaveďte primerané zmluvy o spracúvaní údajov
- Podporte prenositeľnosť údajov a žiadosti o ich vymazanie
- Veďte auditné záznamy o prístupe k dátam a ich spracúvaní
Časový priebeh kontroly
| Fáza | Trvanie |
|---|---|
| Prvotné odoslanie | 5 až 10 pracovných dní |
| Kontrola revízie | 3 až 7 pracovných dní |
| Záverečné schválenie | 1 až 2 pracovné dni |
| Publikovanie | Okamžite po schválení |
Tip
Vyriešte všetku spätnú väzbu z kontroly v jednej revízii, aby ste sa vyhli viacerým kolám. Tím Stripe poskytuje ku každému nájdenému problému konkrétnu spätnú väzbu, s ktorou sa dá pracovať.
Bežné dôvody zamietnutia
- Chýbajúce spracovanie chýb, aplikácia padá pri sieťových chybách alebo neočakávaných dátach
- Nedostatočné stavy načítavania, prázdne obrazovky počas načítavania dát
- Nejasné ceny, ceny nie sú v zázname plne zverejnené
- Nadmerné oprávnenia, žiadanie oprávnení, ktoré aplikácia nepotrebuje
- Nefunkčný sandboxový režim, aplikácia nefunguje v testovacom režime
- Bezpečnostné problémy, ukladanie tajných kľúčov mimo Secret Store API
- Chýbajúce zásady ochrany osobných údajov, žiadna dostupná URL so zásadami
- Neúplná funkčnosť, funkcie s označením “coming soon” alebo zástupný obsah