---
title: "Installationslänkar och djuplänkar | Tajo"
description: "Generera installations-URL:er för appdistribution och djuplänkar för att navigera användare till specifika appvyer"
url: https://tajo.io/se/docs/stripe-apps/install-links/
markdown: https://tajo.io/se/docs/stripe-apps/install-links.md
lang: sv-SE
author: "Set Noa"
author_url: https://tajo.io/se/set-noa/
robots: noindex
---

Ansök om tidig åtkomst

Ange ditt förnamn och din e-postadress på jobbet. Vi skickar en länk för att bekräfta din begäran om åtkomst till Tajo.

# Installationslänkar och djuplänkar

[Set Noa](https://tajo.io/se/set-noa/)

Installationslänkar låter dig distribuera din Stripe-app utanför marknadsplatsen, medan djuplänkar navigerar användare direkt till specifika vyer i din installerade app. Båda är viktiga för smidig onboarding och integrationsflöden.

Caution

**Status: planerad, inte byggd.** Tajo har ingen Stripe-app, så inget i det här avsnittet kan installeras i dag. App-ID:n, URL:er och inloggningsuppgifter på den här sidan är illustrativa platshållare, inte skarpa endpoints.

## Installationslänkar

Installationslänkar tillhandahåller en direkt URL som handlare kan använda för att installera din app. När en användare klickar på en installationslänk hanterar Stripe installationsflödet och omdirigerar sedan tillbaka till din angivna URI.

### Förutsättningar

Konfigurera `allowed_redirect_uris` i ditt appmanifest innan du använder installationslänkar:

```json
{
  "id": "com.tajo.brevo-integration",
  "allowed_redirect_uris": [
    "https://tajo.io/stripe/callback",
    "https://tajo.io/stripe/oauth/complete"
  ]
}
```

### Format för installationslänk

```
https://marketplace.stripe.com/oauth/v2/authorize?client_id=APP_ID&redirect_uri=REDIRECT_URI&state=STATE_VALUE
```

| Parameter | Obligatorisk | Beskrivning |
| --- | --- | --- |
| `client_id` | Ja | Ditt app-ID (t.ex. `com.tajo.brevo-integration`) |
| `redirect_uri` | Ja | Måste matcha en av dina `allowed_redirect_uris` |
| `state` | Rekommenderas | Slumpmässig sträng för CSRF-skydd |

### Omdirigeringsparametrar

Efter en lyckad installation omdirigerar Stripe användaren till din `redirect_uri` med dessa frågeparametrar:

| Parameter | Beskrivning |
| --- | --- |
| `user_id` | Stripe-användar-ID för det installerande kontot |
| `account_id` | Stripe-konto-ID (t.ex. `acct_xxxxx`) |
| `state` | Det `state`-värde du angav (för CSRF-verifiering) |
| `install_signature` | HMAC-signatur för att verifiera att installationen är legitim |

Exempel på omdirigerings-URL:

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

### CSRF-skydd

Använd alltid `state`-parametern för att förhindra cross-site request forgery-attacker:

```javascript
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');
};
```

### Signaturverifiering

Verifiera `install_signature` med din apps signeringshemlighet:

```javascript
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

Använd alltid `crypto.timingSafeEqual` för signatursignaturjämförelse för att förhindra timing-attacker. Använd aldrig enkel stränglikhet (`===`).

### Signeringshemlighet

Din apps signeringshemlighet finns i Stripe Dashboard under appens inställningar. Använd den för att:

- Verifiera installationssignaturer från omdirigeringsåterrop
- Validera webhook-nyttolaster från Stripe
- Autentisera förfrågningar mellan din backend och Stripe

Lagra signeringshemligheten på ett säkert sätt:

```bash
# Set as environment variable
export STRIPE_APP_SIGNING_SECRET="whsec_xxxxx"
```

Hårdkoda aldrig signeringshemligheter i din källkod eller commit:a dem till versionshantering.

## Djuplänkar

Djuplänkar navigerar användare direkt till en specifik vy i din installerade Stripe-app. Använd dem för att dirigera användare från extern kommunikation (e-post, notifikationer, supportsidor) till relevant appkontext.

### URL-format för djuplänk

```
https://dashboard.stripe.com/MODE/acct_ID/PAGE?apps[APP_ID][TARGET]=VIEWPORT_ID
```

| Komponent | Beskrivning | Exempel |
| --- | --- | --- |
| `MODE` | `live` eller `test` | `live` |
| `acct_ID` | Mål-Stripe-konto-ID | `acct_1234567890` |
| `PAGE` | Dashboardsökvägssida | `customers/cus_xxxxx` |
| `APP_ID` | Ditt app-ID | `com.tajo.brevo-integration` |
| `TARGET` | `drawer` eller `modal` | `drawer` |
| `VIEWPORT_ID` | Viewporten som ska öppnas | `stripe.dashboard.customer.detail` |

### Drawer kontra modal-mål

| Mål | Beteende | Användningsfall |
| --- | --- | --- |
| `drawer` | Öppnar appen i sidopanelen (drawer) | Standard appinteraktion, kontext vid sidan av sidan |
| `modal` | Öppnar appen i en helskärmsmodal-overlay | Fokuserade arbetsflöden, onboarding, komplexa formulär |

### Djuplänksexempel

#### Öppna kunddetaljvy i drawer

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

#### Öppna inställningar i modal

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

#### Öppna onboardingflöde

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

#### Öppna betalningsdetaljvy i testläge

```
https://dashboard.stripe.com/test/acct_xxxxx/payments/pi_xxxxx
  ?apps[com.tajo.brevo-integration][drawer]=stripe.dashboard.payment.detail
```

### Generera djuplänkar programmatiskt

```javascript
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',
});
```

### Använda djuplänkar i kommunikation

Djuplänkar är särskilt användbara i:

- **E-postnotifikationer**: “Visa Brevo-synkroniseringsstatus för den här kunden”
- **Supportsvar**: “Klicka här för att kontrollera dina integrationsinställningar”
- **Onboarding-e-post**: “Slutför din Brevo-konfiguration”
- **Felalertar**: “Granska synkroniseringsproblemet för kund X”

```html
<!-- 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>
```

## Kombinera installationslänkar och djuplänkar

För bästa onboardingupplevelse, kombinera installationslänkar med djuplänkar efter installation:

1. Användaren klickar på en **installationslänk** från din webbplats eller e-post
2. Användaren installerar appen och omdirigeras till din callback-URL
3. Din callback behandlar installationen och omdirigerar användaren till en **djuplänk** som öppnar onboarding-viewporten

```javascript
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

Testa alltid installationslänkar och djuplänkar i både live- och testläge för att säkerställa att de fungerar korrekt i alla miljöer.
