> ## 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.

# Bezahlvorgang

> Bestellungen verarbeiten und Kunden zum gehosteten Checkout weiterleiten

## Übersicht

Die Funktion `checkout()` erstellt eine Bestellung aus dem aktuellen Warenkorb und leitet den Kunden automatisch zur gehosteten Checkout-Seite von Komerza weiter, um die Zahlung abzuschließen.

<Note>
  Die Checkout-Funktion validiert den Warenkorb, erstellt eine Bestellung und
  **leitet automatisch** zur Zahlungsseite weiter. Keine manuelle
  Weiterleitungsverarbeitung erforderlich.
</Note>

## Grundlegende Verwendung

```javascript theme={null}
const response = await komerza.checkout(emailAddress, couponCode);
```

### Parameter

<ParamField path="emailAddress" type="string" required>
  E-Mail-Adresse des Kunden für die Bestellung. Muss ein gültiges E-Mail-Format
  sein.
</ParamField>

<ParamField path="couponCode" type="string">
  Optionaler Coupon-/Rabattcode für die Bestellung. Muss 3-32 Zeichen lang sein,
  wenn angegeben.
</ParamField>

### Rückgabe

Gibt ein Promise zurück, das zu `ApiResponse<Order>` aufgelöst wird:

```typescript theme={null}
interface ApiResponse<Order> {
  success: boolean; // Ob die Bestellung erstellt wurde
  message?: string; // Fehlermeldung bei Misserfolg
  invalidFields?: Array<{
    // Validierungsfehler falls vorhanden
    fieldName: string;
    reason: string;
  }>;
  data?: Order; // Bestelldetails bei Erfolg
}
```

<Note>
  Wenn `success` `true` ist, leitet der Browser automatisch zur Checkout-Seite
  weiter. Die Antwort ist hauptsächlich für die Fehlerbehandlung nützlich.
</Note>

## Validierung

Die Checkout-Funktion führt vor der Bestellerstellung eine Validierung durch:

**Warenkorb-Validierung:**

* Warenkorb darf nicht leer sein
* Alle Artikel müssen gültige Produkt- und Varianten-IDs haben

**E-Mail-Validierung:**

* Muss ein gültiges E-Mail-Format sein

**Coupon-Validierung (falls angegeben):**

* Muss mindestens 3 Zeichen lang sein
* Darf 32 Zeichen nicht überschreiten

## Einfaches Beispiel

```javascript theme={null}
// Checkout-Button-Handler
async function handleCheckout() {
  const email = document.getElementById("email").value;
  const coupon = document.getElementById("coupon").value;

  try {
    const response = await komerza.checkout(email, coupon);

    // Wird nur ausgeführt, wenn der Checkout fehlschlug (keine Weiterleitung)
    if (!response.success) {
      alert(response.message || "Checkout fehlgeschlagen");
    }
  } catch (error) {
    console.error("Checkout-Fehler:", error);
    alert("Beim Checkout ist ein Fehler aufgetreten");
  }
}
```

## Vollständiges Beispiel mit Validierung

```html theme={null}
<!DOCTYPE html>
<html>
  <head>
    <title>Bezahlen</title>
    <script src="https://cdn.komerza.com/komerza.min.js"></script>
    <style>
      .error {
        color: red;
        font-size: 14px;
      }
      .field-error {
        border-color: red;
      }
    </style>
  </head>
  <body>
    <div id="checkout-form">
      <h2>Bezahlen</h2>

      <div id="cart-summary"></div>

      <form onsubmit="handleCheckout(event)">
        <div>
          <label for="email">E-Mail-Adresse *</label>
          <input
            type="email"
            id="email"
            required
            placeholder="ihre@email.com"
          />
          <div id="email-error" class="error"></div>
        </div>

        <div>
          <label for="coupon">Gutscheincode (optional)</label>
          <input
            type="text"
            id="coupon"
            placeholder="Gutscheincode eingeben"
            minlength="3"
            maxlength="32"
          />
          <div id="coupon-error" class="error"></div>
        </div>

        <button type="submit" id="checkout-btn">Kauf abschließen</button>
      </form>
    </div>

    <script>
      // Initialisierung
      komerza.init("your-store-id");

      // Warenkorbzusammenfassung anzeigen
      function updateCartSummary() {
        const basket = komerza.getBasket();
        const count = komerza.getBasketItemCount();

        if (count === 0) {
          document.getElementById("cart-summary").innerHTML = `
          <p class="error">Ihr Warenkorb ist leer</p>
        `;
          document.getElementById("checkout-btn").disabled = true;
          return;
        }

        document.getElementById("cart-summary").innerHTML = `
        <p>${count} Artikel im Warenkorb</p>
      `;
      }

      // Checkout verarbeiten
      async function handleCheckout(event) {
        event.preventDefault();

        // Vorherige Fehler löschen
        document.getElementById("email-error").textContent = "";
        document.getElementById("coupon-error").textContent = "";
        document.getElementById("email").classList.remove("field-error");
        document.getElementById("coupon").classList.remove("field-error");

        const email = document.getElementById("email").value.trim();
        const coupon = document.getElementById("coupon").value.trim();

        // Grundlegende clientseitige Validierung
        if (!email) {
          document.getElementById("email-error").textContent =
            "E-Mail ist erforderlich";
          return;
        }

        // Schaltfläche deaktivieren und Ladeindikator anzeigen
        const btn = document.getElementById("checkout-btn");
        const originalText = btn.textContent;
        btn.disabled = true;
        btn.textContent = "Wird verarbeitet...";

        try {
          // Sicherung vor dem Checkout erstellen
          komerza.createBasketBackup();

          // Checkout versuchen
          const response = await komerza.checkout(email, coupon || undefined);

          // Wenn wir hier ankommen, ist der Checkout fehlgeschlagen (keine Weiterleitung)
          if (!response.success) {
            // Validierungsfehler behandeln
            if (response.invalidFields) {
              response.invalidFields.forEach((field) => {
                const errorEl = document.getElementById(
                  `${field.fieldName}-error`,
                );
                const inputEl = document.getElementById(field.fieldName);

                if (errorEl) errorEl.textContent = field.reason;
                if (inputEl) inputEl.classList.add("field-error");
              });
            } else {
              // Allgemeiner Fehler
              alert(
                response.message ||
                  "Checkout fehlgeschlagen. Bitte versuchen Sie es erneut.",
              );
            }

            // Warenkorb aus Sicherung wiederherstellen
            komerza.restoreBasketFromBackup();
          }
        } catch (error) {
          console.error("Checkout-Fehler:", error);
          alert(
            "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es erneut.",
          );

          // Warenkorb aus Sicherung wiederherstellen
          komerza.restoreBasketFromBackup();
        } finally {
          // Schaltfläche wieder aktivieren
          btn.disabled = false;
          btn.textContent = originalText;
        }
      }

      // Anzeige initialisieren
      updateCartSummary();
    </script>
  </body>
</html>
```

## Fehlerbehandlung

Häufige Fehlerszenarien und deren Behandlung:

### Leerer Warenkorb

```javascript theme={null}
const response = await komerza.checkout(email);

if (!response.success && response.message === "Basket is empty") {
  alert("Bitte legen Sie Artikel in den Warenkorb, bevor Sie zur Kasse gehen");
}
```

### Validierungsfehler

```javascript theme={null}
const response = await komerza.checkout(email, coupon);

if (!response.success && response.invalidFields) {
  response.invalidFields.forEach((field) => {
    console.log(`${field.fieldName}: ${field.reason}`);
    // Fehler neben dem zugehörigen Formularfeld anzeigen
  });
}
```

### Allgemeine Fehler

```javascript theme={null}
try {
  await komerza.checkout(email, coupon);
} catch (error) {
  // Netzwerkfehler oder andere Ausnahme
  console.error("Checkout fehlgeschlagen:", error);
  alert(
    "Checkout konnte nicht abgeschlossen werden. Überprüfen Sie Ihre Verbindung.",
  );
}
```
