Ссылки установки и глубокие ссылки
Ссылки установки позволяют распространять Stripe App за пределами маркетплейса, а глубокие ссылки переводят пользователей непосредственно к конкретным представлениям в установленном приложении. Оба инструмента необходимы для плавного онбординга.
Ссылки установки
Ссылки установки предоставляют прямой URL, по которому продавцы могут установить ваше приложение.
Предварительные требования
Настройте allowed_redirect_uris в манифесте приложения:
{ "id": "com.tajo.brevo-integration", "allowed_redirect_uris": [ "https://tajo.io/stripe/callback", "https://tajo.io/stripe/oauth/complete" ]}Формат ссылки установки
https://marketplace.stripe.com/oauth/v2/authorize?client_id=APP_ID&redirect_uri=REDIRECT_URI&state=STATE_VALUE| Параметр | Обязательно | Описание |
|---|---|---|
client_id | Да | ID вашего приложения (например, com.tajo.brevo-integration) |
redirect_uri | Да | Должен совпадать с одним из allowed_redirect_uris |
state | Рекомендуется | Случайная строка для защиты от CSRF |
Параметры перенаправления
После успешной установки Stripe перенаправляет пользователя на redirect_uri со следующими параметрами:
| Параметр | Описание |
|---|---|
user_id | ID пользователя Stripe устанавливающего аккаунта |
account_id | ID аккаунта Stripe (например, acct_xxxxx) |
state | Указанное вами значение state |
install_signature | HMAC-подпись для проверки легитимности установки |
Защита от CSRF
import crypto from 'crypto';
// Generate a random state value and store it in the sessionconst generateInstallLink = (req, res) => { const state = crypto.randomBytes(32).toString('hex');
// Store state in session for later verification req.session.stripeInstallState = state;
const installUrl = new URL('https://marketplace.stripe.com/oauth/v2/authorize'); installUrl.searchParams.set('client_id', 'com.tajo.brevo-integration'); installUrl.searchParams.set('redirect_uri', 'https://tajo.io/stripe/callback'); installUrl.searchParams.set('state', state);
res.redirect(installUrl.toString());};
// Handle the redirect callbackconst handleInstallCallback = (req, res) => { const { state, user_id, account_id, install_signature } = req.query;
// Verify state matches what we stored if (state !== req.session.stripeInstallState) { return res.status(403).json({ error: 'Invalid state parameter' }); }
// Clear the stored state delete req.session.stripeInstallState;
// Verify the install signature if (!verifyInstallSignature(install_signature, account_id)) { return res.status(403).json({ error: 'Invalid install signature' }); }
// Process the successful installation await processInstallation(user_id, account_id);
res.redirect('/dashboard/stripe-connected');};Проверка подписи
import crypto from 'crypto';
const verifyInstallSignature = (signature, accountId) => { const signingSecret = process.env.STRIPE_APP_SIGNING_SECRET;
const expectedSignature = crypto .createHmac('sha256', signingSecret) .update(accountId) .digest('hex');
return crypto.timingSafeEqual( Buffer.from(signature), Buffer.from(expectedSignature) );};Caution
Всегда используйте crypto.timingSafeEqual для сравнения подписей, чтобы предотвратить атаки по времени. Никогда не используйте простое сравнение строк (===).
Глубокие ссылки
Глубокие ссылки перенаправляют пользователей непосредственно к конкретному представлению в установленном Stripe App.
Формат URL глубокой ссылки
https://dashboard.stripe.com/MODE/acct_ID/PAGE?apps[APP_ID][TARGET]=VIEWPORT_ID| Компонент | Описание | Пример |
|---|---|---|
MODE | live или test | live |
acct_ID | ID целевого аккаунта Stripe | acct_1234567890 |
PAGE | Путь страницы Dashboard | customers/cus_xxxxx |
APP_ID | ID вашего приложения | com.tajo.brevo-integration |
TARGET | drawer или modal | drawer |
VIEWPORT_ID | Открываемый вьюпорт | stripe.dashboard.customer.detail |
Drawer vs Modal
| Target | Поведение | Сценарий использования |
|---|---|---|
drawer | Открывает приложение в боковой панели | Стандартное взаимодействие рядом со страницей |
modal | Открывает приложение в полноэкранном модальном окне | Сфокусированные рабочие процессы, онбординг, сложные формы |
Примеры глубоких ссылок
Открыть представление детали покупателя
https://dashboard.stripe.com/live/acct_xxxxx/customers/cus_xxxxx ?apps[com.tajo.brevo-integration][drawer]=stripe.dashboard.customer.detailОткрыть настройки в модальном окне
https://dashboard.stripe.com/live/acct_xxxxx/settings ?apps[com.tajo.brevo-integration][modal]=stripe.dashboard.settingsОткрыть поток онбординга
https://dashboard.stripe.com/live/acct_xxxxx/dashboard ?apps[com.tajo.brevo-integration][modal]=stripe.dashboard.onboardingПрограммная генерация глубоких ссылок
const generateDeepLink = ({ accountId, mode = 'live', page, appId = 'com.tajo.brevo-integration', target = 'drawer', viewport,}) => { const baseUrl = `https://dashboard.stripe.com/${mode}/${accountId}/${page}`; const params = new URLSearchParams(); params.set(`apps[${appId}][${target}]`, viewport);
return `${baseUrl}?${params.toString()}`;};
// Generate a link to view a customer's Brevo profileconst customerLink = generateDeepLink({ accountId: 'acct_xxxxx', page: 'customers/cus_xxxxx', viewport: 'stripe.dashboard.customer.detail',});
// Generate a link to app settingsconst settingsLink = generateDeepLink({ accountId: 'acct_xxxxx', page: 'settings', viewport: 'stripe.dashboard.settings', target: 'modal',});Использование глубоких ссылок в коммуникациях
Глубокие ссылки особенно полезны в:
- Email-уведомлениях: “Просмотрите статус синхронизации Brevo для этого покупателя”
- Ответах поддержки: “Нажмите здесь для проверки настроек интеграции”
- Письмах онбординга: “Завершите настройку Brevo”
Объединение ссылок установки и глубоких ссылок
Для лучшего опыта онбординга объедините ссылки установки с глубокими ссылками:
const handleInstallCallback = async (req, res) => { const { account_id, install_signature, state } = req.query;
// Verify state and signature // ... (verification code)
// Process installation await processInstallation(account_id);
// Redirect to the app's onboarding view via deep link const onboardingLink = generateDeepLink({ accountId: account_id, page: 'dashboard', viewport: 'stripe.dashboard.onboarding', target: 'modal', });
res.redirect(onboardingLink);};Tip
Всегда тестируйте ссылки установки и глубокие ссылки в живом и тестовом режимах.