Bed om tidlig adgang til Tajo

Indtast dit fornavn og en e-mailadresse eller et telefonnummer. Vi kontakter dig med oplysninger om adgang til Tajo.

Installationslinks og dybe links

Installationslinks lader dig distribuere din Stripe App uden om marketplace, mens dybe links sender brugerne direkte til bestemte visninger i den app, de har installeret. Begge dele er afgørende for et glidende onboarding- og integrationsforløb.

Installationslinks giver en direkte URL, som forhandlerne kan bruge til at installere din app. Når en bruger klikker på et installationslink, håndterer Stripe installationsforløbet og sender derefter brugeren tilbage til den URI, du har angivet.

Forudsætninger

Før du bruger installationslinks, skal du konfigurere allowed_redirect_uris i dit app-manifest:

{
"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
ParameterPåkrævetBeskrivelse
client_idJaDit app-ID (f.eks. com.tajo.brevo-integration)
redirect_uriJaSkal matche en af dine allowed_redirect_uris
stateAnbefaletTilfældig streng til CSRF-beskyttelse

Redirect-parametre

Når installationen er gennemført, sender Stripe brugeren videre til din redirect_uri med disse forespørgselsparametre:

ParameterBeskrivelse
user_idStripe-bruger-ID’et på den konto, der installerer
account_idStripe-konto-ID’et (f.eks. acct_xxxxx)
stateDen state-værdi, du angav (til CSRF-kontrol)
install_signatureHMAC-signatur, der bekræfter, at installationen er ægte

Eksempel på en redirect-URL:

https://tajo.io/stripe/callback
?user_id=usr_xxxxx
&account_id=acct_xxxxx
&state=abc123random
&install_signature=sig_xxxxx

CSRF-beskyttelse

Brug altid state-parameteren for at forhindre cross-site request forgery-angreb:

import crypto from 'crypto';
// Generate a random state value and store it in the session
const 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 callback
const 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');
};

Verificering af signaturen

Verificer install_signature med din apps signeringsnøgle:

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

Brug altid crypto.timingSafeEqual til at sammenligne signaturer, så du undgår timingangreb. Brug aldrig simpel strengsammenligning (===).

Signeringsnøglen

Din apps signeringsnøgle finder du i Stripe Dashboard under din apps indstillinger. Brug den til at:

  • Verificere installationssignaturer fra redirect-callbacks
  • Validere webhook-payloads fra Stripe
  • Godkende forespørgsler mellem din backend og Stripe

Opbevar signeringsnøglen sikkert:

Terminal window
# Set as environment variable
export STRIPE_APP_SIGNING_SECRET="whsec_xxxxx"

Skriv aldrig signeringsnøgler direkte i din kildekode, og commit dem aldrig til versionsstyring.

Dybe links sender brugerne direkte til en bestemt visning i den Stripe App, de har installeret. Brug dem til at føre brugerne fra ekstern kommunikation (e-mails, notifikationer, supportsider) til den relevante del af appen.

https://dashboard.stripe.com/MODE/acct_ID/PAGE?apps[APP_ID][TARGET]=VIEWPORT_ID
KomponentBeskrivelseEksempel
MODElive eller testlive
acct_IDStripe-konto-ID’et, du vil rammeacct_1234567890
PAGEStien til siden i Dashboardcustomers/cus_xxxxx
APP_IDDin apps IDcom.tajo.brevo-integration
TARGETdrawer eller modaldrawer
VIEWPORT_IDDen viewport, der skal åbnesstripe.dashboard.customer.detail

Drawer eller modal som mål

MålAdfærdAnvendelse
drawerÅbner appen i sidepanelet (drawer)Almindelig brug af appen, kontekst ved siden af siden
modalÅbner appen som et overlay i fuld skærmFokuserede arbejdsgange, onboarding, komplekse formularer

Åbn kundedetaljer i en drawer

https://dashboard.stripe.com/live/acct_xxxxx/customers/cus_xxxxx
?apps[com.tajo.brevo-integration][drawer]=stripe.dashboard.customer.detail

Åbn indstillinger i en modal

https://dashboard.stripe.com/live/acct_xxxxx/settings
?apps[com.tajo.brevo-integration][modal]=stripe.dashboard.settings

Åbn onboarding-forløbet

https://dashboard.stripe.com/live/acct_xxxxx/dashboard
?apps[com.tajo.brevo-integration][modal]=stripe.dashboard.onboarding

Åbn betalingsdetaljer i testtilstand

https://dashboard.stripe.com/test/acct_xxxxx/payments/pi_xxxxx
?apps[com.tajo.brevo-integration][drawer]=stripe.dashboard.payment.detail
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 profile
const customerLink = generateDeepLink({
accountId: 'acct_xxxxx',
page: 'customers/cus_xxxxx',
viewport: 'stripe.dashboard.customer.detail',
});
// Generate a link to app settings
const settingsLink = generateDeepLink({
accountId: 'acct_xxxxx',
page: 'settings',
viewport: 'stripe.dashboard.settings',
target: 'modal',
});

Dybe links er især nyttige i:

  • E-mailnotifikationer: “Se Brevo-synkroniseringens status for denne kunde”
  • Supportsvar: “Klik her for at tjekke dine integrationsindstillinger”
  • Onboarding-e-mails: “Færdiggør din Brevo-opsætning”
  • Fejlalarmer: “Gennemgå synkroniseringsproblemet for kunde 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>

Du får det bedste onboarding-forløb ved at kombinere installationslinks med dybe links efter installationen:

  1. Brugeren klikker på et installationslink fra dit website eller din e-mail
  2. Brugeren installerer appen og sendes videre til din callback-URL
  3. Din callback behandler installationen og sender brugeren videre til et dybt link, der åbner onboarding-viewporten
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

Test altid installationslinks og dybe links i både live- og testtilstand, så du er sikker på, at de virker i alle miljøer.

Bed om tidlig adgang til Tajo

Indtast dit fornavn og en e-mailadresse eller et telefonnummer. Vi kontakter dig med oplysninger om adgang til Tajo.

automatisk genkendelse
AI-assistent

Hej! Spørg mig om dokumentationen.