Instalační a hluboké odkazy
Instalační odkazy Vám umožňují distribuovat Vaši Stripe App mimo marketplace, zatímco hluboké odkazy navigují uživatele přímo do konkrétních pohledů v rámci nainstalované aplikace. Obojí je nezbytné pro plynulý onboarding a integrační toky.
Instalační odkazy
Instalační odkazy poskytují přímou URL, kterou obchodníci mohou použít k instalaci Vaší aplikace. Když uživatel klikne na instalační odkaz, Stripe provede instalační tok a poté ho přesměruje zpět na Vámi zadanou URI.
Předpoklady
Před použitím instalačních odkazů nakonfigurujte allowed_redirect_uris v manifestu aplikace:
{ "id": "com.tajo.brevo-integration", "allowed_redirect_uris": [ "https://tajo.io/stripe/callback", "https://tajo.io/stripe/oauth/complete" ]}Formát instalačního odkazu
https://marketplace.stripe.com/oauth/v2/authorize?client_id=APP_ID&redirect_uri=REDIRECT_URI&state=STATE_VALUE| Parametr | Povinný | Popis |
|---|---|---|
client_id | Ano | ID Vaší aplikace (např. com.tajo.brevo-integration) |
redirect_uri | Ano | Musí odpovídat jedné z hodnot allowed_redirect_uris |
state | Doporučeno | Náhodný řetězec pro ochranu před CSRF |
Parametry přesměrování
Po úspěšné instalaci Stripe přesměruje uživatele na Vaši redirect_uri s těmito parametry dotazu:
| Parametr | Popis |
|---|---|
user_id | Stripe ID uživatele instalujícího účtu |
account_id | ID účtu Stripe (např. acct_xxxxx) |
state | Hodnota state, kterou jste poskytli (pro ověření CSRF) |
install_signature | Podpis HMAC pro ověření, že je instalace legitimní |
Příklad URL přesměrování:
https://tajo.io/stripe/callback ?user_id=usr_xxxxx &account_id=acct_xxxxx &state=abc123random &install_signature=sig_xxxxxOchrana před CSRF
Vždy používejte parametr state, abyste zabránili útokům typu cross-site request forgery:
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 = async (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');};Ověření podpisu
Ověřte install_signature pomocí podpisového tajemství Vaší aplikace:
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
Pro porovnání podpisů vždy používejte crypto.timingSafeEqual, abyste zabránili časovacím útokům. Nikdy nepoužívejte prosté porovnání řetězců (===).
Podpisové tajemství
Podpisové tajemství Vaší aplikace najdete ve Stripe Dashboardu v nastavení aplikace. Použijte ho k tomu, abyste:
- ověřili instalační podpisy z callbacků přesměrování
- validovali payloady webhooků od Stripe
- autentizovali požadavky mezi Vaším backendem a Stripe
Podpisové tajemství ukládejte bezpečně:
# Set as environment variableexport STRIPE_APP_SIGNING_SECRET="whsec_xxxxx"Podpisová tajemství nikdy nezapisujte natvrdo do zdrojového kódu ani je necommitujte do správy verzí.
Hluboké odkazy
Hluboké odkazy navigují uživatele přímo do konkrétního pohledu v rámci nainstalované Stripe App. Použijte je k nasměrování uživatelů z externí komunikace (e-maily, notifikace, stránky podpory) do relevantního kontextu aplikace.
Formát URL hlubokého odkazu
https://dashboard.stripe.com/MODE/acct_ID/PAGE?apps[APP_ID][TARGET]=VIEWPORT_ID| Součást | Popis | Příklad |
|---|---|---|
MODE | live nebo test | live |
acct_ID | ID cílového účtu Stripe | acct_1234567890 |
PAGE | Cesta ke stránce dashboardu | customers/cus_xxxxx |
APP_ID | ID Vaší aplikace | com.tajo.brevo-integration |
TARGET | drawer nebo modal | drawer |
VIEWPORT_ID | Viewport, který se má otevřít | stripe.dashboard.customer.detail |
Cíl drawer versus modal
| Cíl | Chování | Případ použití |
|---|---|---|
drawer | Otevře aplikaci v bočním panelu (drawer) | Výchozí interakce s aplikací, kontext vedle stránky |
modal | Otevře aplikaci v celoobrazovkové modální vrstvě | Soustředěné pracovní postupy, onboarding, složité formuláře |
Příklady hlubokých odkazů
Otevření detailu zákazníka v bočním panelu drawer
https://dashboard.stripe.com/live/acct_xxxxx/customers/cus_xxxxx ?apps[com.tajo.brevo-integration][drawer]=stripe.dashboard.customer.detailOtevření nastavení v modálním okně
https://dashboard.stripe.com/live/acct_xxxxx/settings ?apps[com.tajo.brevo-integration][modal]=stripe.dashboard.settingsOtevření onboardingového toku
https://dashboard.stripe.com/live/acct_xxxxx/dashboard ?apps[com.tajo.brevo-integration][modal]=stripe.dashboard.onboardingOtevření detailu platby v testovacím režimu
https://dashboard.stripe.com/test/acct_xxxxx/payments/pi_xxxxx ?apps[com.tajo.brevo-integration][drawer]=stripe.dashboard.payment.detailGenerování hlubokých odkazů programově
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',});Použití hlubokých odkazů v komunikaci
Hluboké odkazy jsou obzvlášť užitečné v těchto případech:
- E-mailové notifikace: „Zobrazit stav synchronizace s Brevo pro tohoto zákazníka”
- Odpovědi podpory: „Kliknutím sem zkontrolujete nastavení své integrace”
- Onboardingové e-maily: „Dokončete své nastavení Brevo”
- Upozornění na chyby: „Zkontrolujte problém se synchronizací u zákazníka X”
<!-- Example in an email template --><a href="https://dashboard.stripe.com/live/acct_xxxxx/customers/cus_xxxxx?apps[com.tajo.brevo-integration][drawer]=stripe.dashboard.customer.detail"> View Brevo Profile in Stripe</a>Kombinace instalačních a hlubokých odkazů
Nejlepšího onboardingu dosáhnete kombinací instalačních odkazů s hlubokými odkazy po instalaci:
- Uživatel klikne na instalační odkaz na Vašem webu nebo v e-mailu
- Uživatel nainstaluje aplikaci a je přesměrován na Vaši callback URL
- Váš callback zpracuje instalaci a přesměruje uživatele na hluboký odkaz, který otevře onboardingový viewport
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
Instalační i hluboké odkazy vždy otestujte v živém i testovacím režimu, abyste zajistili jejich správnou funkci ve všech prostředích.