> ## Documentation Index
> Fetch the complete documentation index at: https://docs.komerza.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Embed SDK

> Zintegruj płatności Komerza bezpośrednio na swojej stronie internetowej z naszym lekkim Embed SDK

<img className="block dark:hidden" src="https://mintcdn.com/komerza/8H1g8ttpSLWwGTJO/images/embeds-light.png?fit=max&auto=format&n=8H1g8ttpSLWwGTJO&q=85&s=490cb3faf8eeaada1fbea996fb8df3b2" alt="Komerza Embed SDK w akcji" width="3456" height="1824" data-path="images/embeds-light.png" />

<img className="hidden dark:block" src="https://mintcdn.com/komerza/8H1g8ttpSLWwGTJO/images/embeds-dark.png?fit=max&auto=format&n=8H1g8ttpSLWwGTJO&q=85&s=c458ff48dd8a7aea126d8f47b39f3021" alt="Komerza Embed SDK w akcji" width="3456" height="1824" data-path="images/embeds-dark.png" />

## Przegląd

Komerza Embed SDK umożliwia płynną integrację naszego procesu płatności bezpośrednio na Twojej stronie internetowej. Zamiast przekierowywać klientów na osobną stronę płatności, osadzenie tworzy modalne nakładki, które utrzymują użytkowników na Twojej stronie, zapewniając jednocześnie bezpieczny, zoptymalizowany przepływ płatności.

<Card title="Demo na żywo" icon="laptop-binary" href="https://checkout.komerza.com/embed/demo.html">
  Zobacz Embed SDK w akcji z naszą interaktywną demonstracją
</Card>

<Note>
  Zintegruj również nasz skrypt analityczny, aby przywrócić analizy
  odwiedzających na swojej niestandardowej stronie dla pełnego wglądu w podróż
  klienta.
</Note>

## Funkcje

<CardGroup cols={2}>
  <Card title="Płynna integracja" icon="puzzle-piece">
    Modalna nakładka utrzymuje klientów na Twojej stronie podczas płatności
  </Card>

  {" "}

  <Card title="Lekki" icon="feather">
    Minimalny pakiet JavaScript bez zewnętrznych zależności
  </Card>

  {" "}

  <Card title="Obsługa motywów" icon="palette">
    Jasne, ciemne i automatyczne motywy dopasowane do projektu Twojej strony
  </Card>

  <Card title="Zgodny z CSP" icon="shield">
    Pełne wsparcie polityki bezpieczeństwa treści z integracją nonce
  </Card>
</CardGroup>

## Szybki start

Dodaj następujący skrypt do sekcji `<head>` swojej strony lub przed zamykającym tagiem `</body>`:

```html theme={null}
<script src="https://checkout.komerza.com/embed/embed.iife.js" defer></script>
```

### Metoda 1: Atrybuty danych (zalecana dla prostych przypadków użycia)

Najłatwiejszy sposób dodawania przycisków płatności do Twojej strony. Wystarczy dodać atrybuty danych do dowolnego przycisku lub elementu:

```html theme={null}
<button
  data-kmrza-product-id="YOUR_PRODUCT_ID"
  data-kmrza-variant-id="YOUR_VARIANT_ID"
  data-kmrza-quantity="1"
  data-kmrza-theme="auto"
>
  Kup teraz
</button>

<script src="https://checkout.komerza.com/embed/embed.iife.js" defer></script>
<script>
  // Zainicjuj osadzenie, aby powiązać wszystkie przyciski z atrybutami danych
  document.addEventListener("DOMContentLoaded", () => {
    Komerza.init();
  });
</script>
```

#### Referencja atrybutów danych

| Atrybut                  | Wymagany | Opis                                                        | Przykład                                      |
| ------------------------ | -------- | ----------------------------------------------------------- | --------------------------------------------- |
| `data-kmrza-product-id`  | ✅ Tak    | ID produktu z Komerza                                       | `"0f6294be-25d6-4ced-96df-7d500608c54d"`      |
| `data-kmrza-variant-id`  | ✅ Tak    | ID wariantu z Komerza                                       | `"96f846e5-5f22-46a2-97b3-a1c88f685577"`      |
| `data-kmrza-quantity`    | ❌ Nie    | Ilość do zakupu (domyślnie: 1)                              | `"2"`                                         |
| `data-kmrza-theme`       | ❌ Nie    | Tryb motywu: `light`, `dark` lub `auto` (domyślnie: `auto`) | `"dark"`                                      |
| `data-kmrza-return-url`  | ❌ Nie    | Niestandardowy URL do przekierowania po płatności           | `"https://example.com/dziekujemy"`            |
| `data-kmrza-email`       | ❌ Nie    | Wstępnie wypełnij adres e-mail klienta                      | `"klient@example.com"`                        |
| `data-kmrza-coupon-code` | ❌ Nie    | Wstępnie wypełnij i automatycznie zastosuj kod kuponu       | `"SAVE20"`                                    |
| `data-kmrza-metadata`    | ❌ Nie    | Ciąg JSON niestandardowych metadanych klucz-wartość         | `"{&quot;campaign&quot;:&quot;summer&quot;}"` |

### Metoda 2: API JavaScript (dla zaawansowanych przypadków użycia)

Dla większej kontroli użyj API JavaScript, aby programowo otworzyć płatność:

```html theme={null}
<button id="checkout-btn">Kup teraz</button>

<script src="https://checkout.komerza.com/embed/embed.iife.js" defer></script>
<script>
  document.getElementById("checkout-btn").addEventListener("click", () => {
    Komerza.open({
      items: [
        {
          productId: "YOUR_PRODUCT_ID",
          variantId: "YOUR_VARIANT_ID",
          quantity: 1,
        },
      ],
      theme: "auto", // 'light', 'dark' lub 'auto'
    });
  });
</script>
```

#### Wiele artykułów

Możesz dodać wiele produktów do płatności jednocześnie:

```javascript theme={null}
Komerza.open({
  items: [
    {
      productId: "0f6294be-25d6-4ced-96df-7d500608c54d",
      variantId: "96f846e5-5f22-46a2-97b3-a1c88f685577",
      quantity: 2,
    },
    {
      productId: "54d6adb4-c160-4f73-b9c0-6c16970fff41",
      variantId: "37e70705-c603-4ab2-8a2e-d16e80288c8c",
      quantity: 1,
    },
  ],
  theme: "light",
});
```

## Kompletny przewodnik po implementacji

### Konfiguracja HTML

Oto kompletny przykład strony HTML:

```html theme={null}
<!DOCTYPE html>
<html lang="pl">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Mój Sklep</title>

    <!-- Nagłówek CSP (zalecany) -->
    <meta
      http-equiv="Content-Security-Policy"
      content="frame-src https://checkout.komerza.com; script-src 'self' 'nonce-abc123' https://checkout.komerza.com;"
    />
  </head>
  <body>
    <div class="product-container">
      <h1>Niesamowity produkt</h1>
      <p>Cena: 29,99 zł</p>

      <!-- Twój przycisk zakupu -->
      <button id="buy-now" class="buy-button">Kup teraz</button>
    </div>

    <!-- Komerza Embed SDK -->
    <script
      src="https://checkout.komerza.com/embed/embed.iife.js"
      nonce="abc123"
    ></script>

    <script nonce="abc123">
      // Twój kod integracji tutaj
    </script>
  </body>
</html>
```

### Integracja JavaScript

<Tabs>
  <Tab title="Podstawowa integracja">
    ```javascript theme={null}
    document.addEventListener('DOMContentLoaded', function() {
      KomerzaEmbed.init();
      
      document.getElementById('buy-now').addEventListener('click', function() {
        KomerzaEmbed.open({
          items: [{ productId: 'prod_123', variantId: 'var_456', quantity: 1 }]
        });
      });
    });
    ```
  </Tab>

  <Tab title="Zaawansowana integracja">
    ```javascript theme={null}
    class CheckoutManager {
      constructor() {
        this.isInitialized = false;
        this.init();
      }
      
      init() {
        KomerzaEmbed.init({ nonce: this.getCSPNonce() });
        this.isInitialized = true;
        this.bindEvents();
      }
      
      bindEvents() {
        document.querySelectorAll('[data-buy-button]').forEach(button => {
          button.addEventListener('click', (e) => { e.preventDefault(); this.handlePurchase(button); });
        });
        document.addEventListener('keydown', (e) => { if (e.key === 'Escape') KomerzaEmbed.close(); });
      }
      
      handlePurchase(button) {
        const { productId, variantId } = button.dataset;
        const quantity = parseInt(button.dataset.quantity) || 1;
        if (!productId || !variantId) { console.error('Brak ID produktu lub wariantu'); return; }
        try {
          KomerzaEmbed.open({ items: [{ productId, variantId, quantity }], theme: this.getTheme() });
        } catch (error) {
          console.error('Nie udało się otworzyć płatności:', error);
          window.location.href = `https://checkout.komerza.com/product/${productId}/${variantId}?qty=${quantity}`;
        }
      }
      
      getTheme() { return window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; }
      getCSPNonce() { return document.querySelector('script[nonce]')?.getAttribute('nonce') ?? null; }
    }

    document.addEventListener('DOMContentLoaded', () => new CheckoutManager());
    ```
  </Tab>

  <Tab title="Integracja React">
    ```jsx theme={null}
    import React, { useEffect, useState } from 'react';

    const ProductPage: React.FC = () => {
      const [isEmbedReady, setIsEmbedReady] = useState(false);
      
      useEffect(() => {
        const script = document.createElement('script');
        script.src = 'https://checkout.komerza.com/embed/embed.iife.js';
        script.onload = () => { window.KomerzaEmbed.init(); setIsEmbedReady(true); };
        document.head.appendChild(script);
        return () => document.head.removeChild(script);
      }, []);
      
      const handleBuyClick = () => {
        if (!isEmbedReady) return;
        window.KomerzaEmbed.open({
          items: [{ productId: 'prod_123', variantId: 'var_456', quantity: 1 }],
          theme: 'auto'
        });
      };
      
      return (
        <div className="product-page">
          <h1>Niesamowity produkt</h1>
          <p>Cena: 29,99 zł</p>
          <button onClick={handleBuyClick} disabled={!isEmbedReady} className="buy-button">
            {isEmbedReady ? 'Kup teraz' : 'Ładowanie...'}
          </button>
        </div>
      );
    };

    export default ProductPage;
    ```
  </Tab>
</Tabs>

## Referencja API

### `Komerza.init(options?)`

Inicjalizuje osadzenie i automatycznie wiąże wszystkie elementy z atrybutami `data-kmrza-*`.

```javascript theme={null}
Komerza.init({
  nonce: "TWÓJ_NONCE_CSP", // Opcjonalnie: dla polityki bezpieczeństwa treści
});
```

### `Komerza.open(options)`

Otwiera modalną płatność programowo.

```javascript theme={null}
Komerza.open({
  items: [{ productId: string, variantId: string, quantity?: number }],
  theme?: 'light' | 'dark' | 'auto',
  affiliateCode?: string,
  returnUrl?: string,
  email?: string,
  couponCode?: string,
  metadata?: Record<string, string>
});
```

### `Komerza.close()`

Zamyka modalną płatność programowo.

```javascript theme={null}
Komerza.close();
```

### Integracja Next.js

```jsx theme={null}
// components/CheckoutButton.jsx
"use client";

import Script from "next/script";

export default function CheckoutButton({ productId, variantId, quantity = 1 }) {
  const handleClick = () => {
    if (window.Komerza) {
      window.Komerza.open({ items: [{ productId, variantId, quantity }] });
    }
  };

  return (
    <>
      <Script
        src="https://checkout.komerza.com/embed/embed.iife.js"
        strategy="lazyOnload"
      />
      <button onClick={handleClick}>Kup teraz</button>
    </>
  );
}
```

## Rozwiązywanie problemów

### Płatność nie otwiera się

1. Upewnij się, że skrypt jest załadowany (atrybut `defer` jest zalecany)
2. Sprawdź konsolę przeglądarki pod kątem błędów
3. Zweryfikuj, czy Twoje ID produktu i wariantu są poprawne
4. Jeśli używasz atrybutów danych, upewnij się, że `Komerza.init()` jest wywoływany po załadowaniu DOM

### Modal pojawia się za innymi elementami

Modal używa wysokiego z-index (9999). Jeśli nadal jest za elementami, sprawdź swój CSS pod kątem konkurujących wartości z-index.

## Afiliaci

Komerza Embed SDK obsługuje śledzenie afiliatów od razu po wyjęciu z pudełka. Parametr zapytania `?ref` jest automatycznie obsługiwany, a plik cookie `kmrza_affiliate` jest automatycznie odczytywany.

***

## Polityka bezpieczeństwa treści (CSP)

```http theme={null}
Content-Security-Policy:
  frame-src https://checkout.komerza.com;
  script-src 'self' 'nonce-TWÓJ_NONCE' https://checkout.komerza.com;
  style-src 'self' 'nonce-TWÓJ_NONCE';
```

```javascript theme={null}
KomerzaEmbed.init({ nonce: "TWÓJ_NONCE" });
```

## Najlepsze praktyki

<AccordionGroup>
  <Accordion title="Wydajność">
    * Ładuj skrypt SDK asynchronicznie gdy to możliwe
    * Inicjalizuj SDK wcześnie, ale otwieraj modale tylko przy interakcji użytkownika
    * Implementuj odpowiednie stany ładowania dla przycisków zakupu
  </Accordion>

  {" "}

  <Accordion title="Doświadczenie użytkownika">
    * Zapewniaj wyraźne wskaźniki ładowania - Obsługuj awarie sieci gracefully za
      pomocą URL zastępczych - Wspieraj nawigację klawiaturą (Esc do zamknięcia)
  </Accordion>

  <Accordion title="Bezpieczeństwo">
    * Zawsze używaj nagłówków CSP w produkcji
    * Waliduj ID produktu i wariantu przed otwarciem płatności
    * Nigdy nie ujawniaj wrażliwych danych w kodzie po stronie klienta
  </Accordion>
</AccordionGroup>

## Wsparcie

Potrzebujesz pomocy z integracją?

<CardGroup cols={2}>
  <Card title="Strona demo" icon="laptop-binary" href="https://checkout.komerza.com/embed/demo.html">
    Interaktywna demonstracja z przykładami kodu źródłowego
  </Card>

  <Card title="Wsparcie deweloperów" icon="headset" href="mailto:support@komerza.com?subject=Embed SDK Support">
    Uzyskaj wsparcie techniczne w kwestiach integracji
  </Card>
</CardGroup>
