Изисквания за качество при преглед на приложение
Stripe преглежда всяко приложение, подадено в marketplace, спрямо изчерпателен набор от изисквания за качество. Ако разбирате тези стандарти още преди разработката, ще спестите време и ще намалите броя на итерациите при прегледа.
Общ преглед
Прегледът на Stripe App оценява приложението Ви в шест ключови области:
- Прозрачно ценообразуване, ясна комуникация на разходите
- Функционалност на приложението, надеждност и пълнота
- Стандарти за разработчици, качество на кода и използване на API
- Качество на UX, стандарти за потребителския интерфейс и преживяването
- Сигурност, защита на данните и сигурни практики
- Правно съответствие, изисквания за поверителност и регулаторни изисквания
Прозрачно ценообразуване
Приложението Ви трябва да съобщава ясно всички разходи на потребителите:
- Оповестяване на цените: всички цени трябва да са посочени предварително в обявата в marketplace
- Без скрити такси: потребителите не трябва да срещат неочаквани такси след инсталирането
- Условия на пробния период: ако предлагате пробен период, посочете ясно продължителността му и какво се случва след края му
- Процеси на надграждане: всички подкани за допълнителна продажба или надграждане трябва да са ненатрапчиви и явно незадължителни
- Валута: показвайте цените в местната валута на потребителя, когато това е възможно
Caution
Приложения, които прикриват цените или таксуват потребителите без ясно съгласие, се отхвърлят незабавно.
Форматиране на дата и час
Всички дати и часове, показвани в приложението Ви, трябва да следват конвенциите на Stripe Dashboard:
- Използвайте локала на потребителя за форматиране на датите, когато е наличен
- Показвайте часовете в местната часова зона на потребителя
- Използвайте относителни времеви означения за скорошни събития (например „преди 2 часа”)
- Използвайте абсолютни времеви означения с пълна дата и час за по-стари събития
- Следвайте ISO 8601 за всички полета за дати, които се изпращат към 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"Настройки на приложението
Ако приложението Ви изисква конфигуриране:
- Осигурете отделен изглед за настройки, достъпен от viewport-а на приложението
- Попълвайте предварително разумни стойности по подразбиране, където това е възможно
- Валидирайте всички въведени от потребителя данни с ясни съобщения за грешка
- Позволявайте на потребителите да променят настройките, без да преинсталират приложението
- Запазвайте настройките между сесиите чрез Stripe Secret Store API
Поддръжка на sandbox
Приложението Ви трябва да работи правилно в режима sandbox (тестов режим) на Stripe:
- Съвместимост с тестовия режим: всички функции трябва да работят в тестов режим
- Тестови данни: използвайте реалистични тестови данни, които демонстрират функционалността на приложението
- Без реални данни в sandbox: никога не разкривайте продукционни данни в тестов режим
- Коректно поведение: ако дадена функция не е достъпна в sandbox, покажете ясно съобщение с обяснение защо
- Задайте
sandbox_install_compatible: trueвъв Вашия манифест
{ "sandbox_install_compatible": true}Функционалност на приложението
Надеждност
- Приложението не трябва да се срива или блокира при нормална употреба
- Всички рекламирани функции трябва да работят както е описано
- Мрежовите грешки трябва да се обработват коректно, с възможност за повторен опит
- Приложението трябва да остава отзивчиво по време на фонови операции
Пълнота
- Без заместващо съдържание, функции „очаквайте скоро” или счупени връзки
- Всички елементи на интерфейса трябва да са функционални, без неработещи бутони или неактивни контроли
- Помощните текстове и връзките към документацията трябва да водят до валидни страници
- Деинсталирането трябва да премахне изцяло всички данни на приложението и webhooks
Производителност
- Интерфейсът трябва да се визуализира до 3 секунди при стандартна връзка
- Фоновите операции по синхронизация не трябва да блокират интерфейса
- Големите набори от данни трябва да използват странициране или отложено зареждане
- Свеждайте API извикванията до минимум, за да избегнете ограничаване на честотата
Стандарти за разработчици
Използване на API
- Използвайте най-новата стабилна версия на Stripe API
- Следвайте добрите практики на Stripe API за странициране, обработка на грешки и идемпотентност
- Не превишавайте лимитите на заявките, реализирайте експоненциално изчакване при повторни опити
- Използвайте webhooks за обновявания, задвижвани от събития, вместо периодични проверки
Качество на кода
- Без грешки или предупреждения в конзолата при продукционните компилации
- Премахнете цялото дебъг логване преди подаването
- Обработвайте всички гранични случаи (празни състояния, липсващи данни, мрежови откази)
- Следвайте моделите от библиотеката с компоненти на Stripe за последователен интерфейс
Версиониране
- Използвайте семантично версиониране (MAJOR.MINOR.PATCH)
- Документирайте несъвместимите промени в актуализациите на версиите
- Поддържайте обратна съвместимост, където това е възможно
Качество на UX
Реклама
- Без реклами: приложението Ви не трябва да показва реклами от какъвто и да е вид
- Без кръстосана промоция: не рекламирайте други продукти или услуги в интерфейса на приложението
- Брандирано съдържание: показвайте само собствената си бранд идентичност, а не марки на трети страни (с изключение на партньори по интеграцията като Brevo)
Език и съдържание
- Последователен език: използвайте последователна терминология в цялото приложение
- Професионален тон: придържайте се към професионалния и стегнат стил на комуникация на Stripe Dashboard
- Без жаргон: избягвайте технически жаргон, който търговците може да не разбират
- Проверка на правописа: уверете се, че целият текст е без правописни и граматически грешки
- Само на английски: целият текст към потребителя в приложенията за marketplace трябва да е на английски
Диалози за потвърждение
Изисквайте потвърждение от потребителя при деструктивни или значими действия:
// 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(); }};Действия, които изискват потвърждение:
- Прекъсване на връзката с интеграции
- Изтриване на синхронизирани данни
- Промяна на настройки, които влияят върху потока от данни
- Връщане на конфигурацията към стойностите по подразбиране
Състояния при зареждане
Винаги показвайте индикатори за зареждане при асинхронни операции:
// 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} />;};Изисквания:
- Показвайте spinner или skeleton екрани по време на зареждането на данни
- Деактивирайте бутоните по време на изпращане на формуляр
- Показвайте индикатори за напредък при продължителни операции
- Никога не показвайте празен екран по време на зареждане
Съобщения за грешки
Предоставяйте ясни съобщения за грешки, по които потребителят може да действа:
// 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."Насоки за съобщенията за грешки:
- Обяснете какво се е случило на разбираем език
- Предложете конкретно действие, с което потребителят може да разреши проблема
- Осигурете начин за повторен опит на неуспешната операция
- Записвайте подробна информация за грешката за отстраняване на проблеми (без да я показвате на потребителите)
- Включвайте кодове на грешките за справка от поддръжката, когато това е приложимо
Сигурност
Secret Store API
Използвайте Secret Store API на Stripe за съхранението на всички чувствителни данни:
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;};Никога не съхранявайте чувствителни данни в:
- Локално или сесийно хранилище
- Бисквитки
- URL параметри
- Твърдо зададени стойности в изходния код
- Конфигурационни файлове в чист текст
Криптография
- Без собствена криптография: не реализирайте собствени алгоритми за шифроване
- Използвайте вградените примитиви за сигурност на Stripe (Secret Store, подписващи секрети)
- Използвайте HTTPS за всички външни API извиквания
- Проверявайте всички подписи на webhooks преди обработка
Работа с данните
- Заявявайте само разрешенията, от които приложението Ви действително се нуждае
- Не съхранявайте данни от Stripe извън необходимото за функционалността
- Въведете политики за съхранение на данните, съгласувани с политиката Ви за поверителност
- Осигурете механизъм, чрез който потребителите да заявят изтриване на данните си
Правно съответствие
Политика за поверителност
Приложението Ви трябва да има публично достъпна политика за поверителност, която обхваща:
- Какви данни събира приложението Ви от Stripe
- Как се съхраняват, обработват и споделят данните
- Политиките за съхранение и изтриване на данните
- Правата на потребителите по отношение на техните данни
- Информация за контакт при запитвания относно поверителността
- Съответствието с приложимите регулации (GDPR, CCPA и други)
Общи условия
- Осигурете ясни общи условия за приложението си
- Не включвайте условия, които противоречат на Общите условия на Stripe
- Посочете ясно всички ограничения при използването
Регулаторно съответствие
- Спазвайте всички приложими регулации за защита на данните
- Сключете подходящи споразумения за обработка на данни
- Поддържайте заявките за преносимост и изтриване на данни
- Поддържайте одитни логове за достъпа до данните и тяхната обработка
Срокове на процеса по преглед
| Етап | Продължителност |
|---|---|
| Първоначално подаване | 5-10 работни дни |
| Преглед на корекциите | 3-7 работни дни |
| Финално одобрение | 1-2 работни дни |
| Публикуване | Веднага след одобрението |
Tip
Отстранете всички забележки от прегледа в една корекция, за да избегнете няколко цикъла на преглед. Екипът на Stripe предоставя конкретна и приложима обратна връзка за всеки открит проблем.
Чести причини за отхвърляне
- Липсваща обработка на грешки, приложението се срива при мрежови грешки или неочаквани данни
- Недостатъчни състояния при зареждане, празни екрани при извличането на данни
- Неясно ценообразуване, цените не са напълно оповестени в обявата
- Прекомерни разрешения, заявяване на разрешения, които приложението не използва
- Неработещ режим sandbox, приложението не работи в тестов режим
- Проблеми със сигурността, съхраняване на секрети извън Secret Store API
- Липсваща политика за поверителност, няма достъпен URL на политиката за поверителност
- Непълна функционалност, функции „очаквайте скоро” или заместващо съдържание