Требования к качеству при проверке приложения
Stripe проверяет каждое приложение, отправленное на маркетплейс, по комплексному набору требований к качеству. Понимание этих стандартов до начала разработки экономит время и снижает количество итераций.
Обзор
Проверка Stripe App оценивает приложение по шести ключевым областям:
- Прозрачное ценообразование, Чёткое информирование о стоимости
- Функциональность приложения, Надёжность и полнота
- Стандарты разработчика, Качество кода и использование API
- Качество UX, Стандарты пользовательского интерфейса
- Безопасность, Защита данных и безопасные практики
- Правовое соответствие, Конфиденциальность и нормативные требования
Прозрачное ценообразование
Ваше приложение должно чётко сообщать пользователям обо всех затратах:
- Раскрытие цен: Все цены должны быть указаны заранее в листинге
- Никаких скрытых платежей: Пользователи не должны сталкиваться с неожиданными расходами после установки
- Условия пробного периода: При наличии пробного периода чётко укажите его продолжительность
- Потоки обновления: Предложения апгрейда должны быть ненавязчивыми и явно опциональными
- Валюта: По возможности отображайте цены в локальной валюте пользователя
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"Настройки приложения
Если ваше приложение требует настройки:
- Предоставьте отдельное представление Настроек, доступное из вьюпорта приложения
- По возможности заполняйте разумными значениями по умолчанию
- Валидируйте все вводимые данные с понятными сообщениями об ошибках
- Позволяйте обновлять настройки без переустановки приложения
- Сохраняйте настройки между сессиями с помощью Stripe Secret Store API
Поддержка Sandbox
Ваше приложение должно корректно работать в sandbox-режиме Stripe:
- Совместимость с тестовым режимом: Все функции должны работать в тестовом режиме
- Тестовые данные: Используйте реалистичные тестовые данные
- Graceful handling: Если функция недоступна в sandbox, отображайте чёткое сообщение
- Установите
sandbox_install_compatible: trueв манифесте
{ "sandbox_install_compatible": true}Функциональность приложения
Надёжность
- Приложение не должно падать или зависать при нормальном использовании
- Все рекламируемые функции должны работать как описано
- Сетевые ошибки должны обрабатываться корректно с возможностью повтора
- Приложение должно оставаться отзывчивым во время фоновых операций
Полнота
- Никаких заглушек, функций “coming soon” или неработающих ссылок
- Все элементы UI должны быть функциональными
- Тексты подсказок и ссылки на документацию должны вести на действующие страницы
- Деинсталляция должна полностью удалять все данные приложения и вебхуки
Производительность
- UI должен рендериться в течение 3 секунд на стандартном соединении
- Фоновые операции синхронизации не должны блокировать UI
- Большие наборы данных должны использовать пагинацию
- Минимизируйте вызовы API для избежания ограничений по частоте запросов
Стандарты разработчика
Использование API
- Используйте последнюю стабильную версию Stripe API
- Следуйте лучшим практикам Stripe API для пагинации, обработки ошибок и идемпотентности
- Не превышайте лимиты частоты запросов, реализуйте экспоненциальную задержку при повторах
- Используйте вебхуки для обновлений на основе событий вместо опроса
Качество кода
- Никаких ошибок или предупреждений в консоли в production-сборках
- Удалите все отладочные логи перед отправкой
- Обрабатывайте все граничные случаи (пустые состояния, отсутствующие данные, сетевые сбои)
- Следуйте паттернам библиотеки компонентов Stripe
Качество UX
Реклама
- Никакой рекламы: В приложении не должно быть рекламы
- Никакого кросс-продвижения: Не продвигайте другие продукты в UI
- Только ваш бренд: Только ваши бренд-идентичности (кроме интеграционных партнёров, таких как Brevo)
Язык и контент
- Единообразие языка: Используйте единую терминологию
- Профессиональный тон: Соответствуйте профессиональному стилю Stripe Dashboard
- Только английский: Весь текст интерфейса должен быть на английском
Диалоги подтверждения
Требуйте подтверждение пользователя для деструктивных или значимых действий:
// 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} />;};Сообщения об ошибках
Предоставляйте понятные, действенные сообщения об ошибках:
// 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
Используйте 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' }, });};Никогда не храните конфиденциальные данные в:
- Локальном хранилище или session storage
- Cookies
- URL-параметрах
- Захардкоженных значениях в исходном коде
- Файлах конфигурации в открытом виде
Криптография
- Никакой собственной криптографии: Не реализуйте собственные алгоритмы шифрования
- Используйте встроенные примитивы безопасности Stripe (Secret Store, signing secrets)
- Используйте HTTPS для всех внешних вызовов API
- Валидируйте все подписи вебхуков перед обработкой
Правовое соответствие
Политика конфиденциальности
Приложение должно иметь публично доступную политику конфиденциальности, охватывающую:
- Какие данные из Stripe собирает приложение
- Как данные хранятся, обрабатываются и передаются
- Политику хранения и удаления данных
- Права пользователей в отношении их данных
- Соответствие применимым нормативам (GDPR, CCPA и т.д.)
Сроки процесса проверки
| Стадия | Продолжительность |
|---|---|
| Первичная подача | 5-10 рабочих дней |
| Проверка доработок | 3-7 рабочих дней |
| Финальное одобрение | 1-2 рабочих дня |
| Публикация | Немедленно после одобрения |
Tip
Устраняйте все замечания по проверке в одной доработке, чтобы избежать множественных циклов проверки. Команда Stripe предоставляет конкретные, действенные отзывы по каждой найденной проблеме.
Распространённые причины отклонения
- Отсутствие обработки ошибок, Приложение падает при сетевых ошибках
- Недостаточные состояния загрузки, Пустые экраны при загрузке данных
- Неясное ценообразование, Цены не полностью раскрыты в листинге
- Избыточные разрешения, Запрос разрешений, не используемых приложением
- Нерабочий sandbox-режим, Приложение не работает в тестовом режиме
- Проблемы безопасности, Хранение secrets вне Secret Store API
- Отсутствие политики конфиденциальности, Нет доступного URL политики конфиденциальности
- Неполная функциональность, Функции “coming soon” или контент-заглушки