# Shopware 6

Das punchout.dev-Plugin für Shopware 6.7 installieren und konfigurieren, den Setup-Selbsttest machen und einen fehlenden Warenkorb-Marker oder einen gescheiterten Login beheben.

URL: https://punchout.dev/de/docs/plugins/shopware/

Das punchout.dev-Plugin für Shopware 6.7 gibt das Script-Tag aus, markiert die Warenkorbseite für punchout.dev und meldet Punchout-Einkäufer in ihrem Kundenkonto an.

## Voraussetzungen

| Voraussetzung | Wert |
| --- | --- |
| Shopware | 6.7 (`>=6.7 <6.8`) |
| PHP-Erweiterungen | `sodium`, `json` |
| Plugin | `PunchoutDev`, Version 2.0.1 oder neuer |
| Download | `PunchoutDev-<version>.zip` aus dem Tab **Einbindung** des Shops im Portal (Shopsystem: Shopware) |

## Installieren

### In der Administration

1. Laden Sie das Plugin im Tab **Einbindung** des Portals herunter.
2. Laden Sie die Zip-Datei in der Shopware-Administration in der Erweiterungsverwaltung unter **Erweiterungen** hoch.
3. Installieren und aktivieren Sie **punchout.dev**.

### Auf der Kommandozeile

Entpacken Sie die Zip-Datei nach `custom/plugins`. Sie enthält einen Ordner, das Plugin landet also in `custom/plugins/PunchoutDev`. Führen Sie dann aus:

```bash
bin/console plugin:refresh
bin/console plugin:install --activate PunchoutDev
bin/console cache:clear
```

`plugin:install` führt die Migration des Plugins aus. Sie legt die Tabelle an, mit der das Plugin jedes Login-Token nur einmal annimmt. Ohne diese Tabelle schlägt jeder Auto-Login fehl, und der Einkäufer kauft als Gast ein.

## Konfigurieren

Öffnen Sie in der Administration **Erweiterungen** und wählen Sie beim Eintrag **punchout.dev** die Aktion **Konfigurieren**. Jede Einstellung lässt sich je Verkaufskanal setzen.

### Karte „Snippet“

| Einstellung | Wert |
| --- | --- |
| Snippet einbinden | An (Standard). Bei Aus wird gar kein Script-Tag ausgegeben. |
| Snippet-URL | `https://js.punchout.dev/pob.js`, aus dem Tab Einbindung des Portals. Bleibt das Feld leer, wird nichts ausgegeben. |
| API-Basis-URL (optional) | Leer lassen. |

### Karte „Auto-Login“

| Einstellung | Wert |
| --- | --- |
| Auto-Login aktivieren | An (Standard). |
| Shop-ID | Die **Shop-ID** aus dem Tab Einbindung des Portals. |
| Public-Key-Zeilen | Jede Zeile aus dem Tab Auto-Login des Portals, Abschnitt **Öffentliche Schlüssel**, eine je Zeile. Zeilen, die mit `#` beginnen, und leere Zeilen werden ignoriert. |

:::caution
Die **Shop-ID** steht in der Karte Auto-Login, aber auch das Script-Tag braucht sie: Das Plugin gibt sie als `data-shop-id` aus. Tragen Sie sie auch dann ein, wenn Sie Auto-Login nicht nutzen. Ohne sie gibt das Plugin kein Script-Tag aus.
:::

Dieselben Werte auf der Kommandozeile:

```bash
bin/console system:config:set PunchoutDev.config.snippetUrl https://js.punchout.dev/pob.js
bin/console system:config:set PunchoutDev.config.tenantId pob_live_…
bin/console system:config:set PunchoutDev.config.publicKeys "k1=…"
bin/console cache:clear
```

Das Plugin gibt dieses Tag auf jeder Storefront-Seite im Block `base_body_script` aus:

```html
<script async src="https://js.punchout.dev/pob.js" data-shop-id="pob_live_…"></script>
```

## Was das Plugin markiert

Auf der Warenkorbseite umschließt das Plugin den Twig-Block `page_checkout_cart_product_table` mit `<div data-punchout-cart>`. Dieser Block rendert die Tabelle der Positionen und sonst nichts: Die Bestellübersicht, das Formular für Aktionscodes und der Checkout-Button bleiben außerhalb. Das Plugin gibt den Marker auch aus, wenn **Snippet einbinden** aus ist. Für sich allein bewirkt der Marker nichts.

## Auto-Login

Der Login-Endpunkt des Plugins ist `GET /punchout-dev/login?token=…`. Richten Sie die Portalseite im Tab **Auto-Login** des Shops ein:

| Portalfeld | Wert |
| --- | --- |
| Adapter | Shopware |
| Login-Pfad | `/punchout-dev/login` für einen Shop direkt auf der Domain. Ein Shop in einem Unterverzeichnis stellt dessen Pfad voran, zum Beispiel `/shop/public/punchout-dev/login`. |
| Kundenreferenz | Kunden-ID, Kundennummer oder E-Mail-Adresse. Unter Shopware funktionieren alle drei. |

Tragen Sie dann im Tab **Einkäufer** für jeden Einkäufer-Zugang die **Shop-Kundenreferenz** ein: die Kunden-ID, die Kundennummer oder die E-Mail-Adresse des Kunden, je nach Auswahl oben.

Nach der Anmeldung leitet das Plugin unverändert auf den Landing-Pfad weiter und setzt den Basispfad des Shops nicht davor. Liegt der Shop in einem Unterverzeichnis, muss der **Landing-Pfad** im Tab Allgemein das Unterverzeichnis enthalten, zum Beispiel `/shop/public/checkout/cart`.

Das Plugin meldet einen Kunden nur an, wenn genau ein aktiver Kunde passt. Gastkonten passen nie, und ein Kunde, der an einen anderen Verkaufskanal gebunden ist, passt ebenfalls nicht. Die Kunden-ID funktioniert mit und ohne Bindestriche. Der vollständige Ablauf steht auf der Seite [Auto-Login](https://punchout.dev/de/docs/plugins/auto-login/).

## Setup-Selbsttest

1. Erzeugen Sie im Tab **Einrichtung** des Shops im Portal einen Setup-Link (standardmäßig 60 Minuten gültig).
2. Legen Sie 2 oder 3 verschiedene Produkte in den Warenkorb.
3. Öffnen Sie die Warenkorbseite mit dem Setup-Link.

Ist das Plugin aktiv, zeigt das Panel schon vor dem Klick „Shop-Plugin erkannt — der Warenkorb ist bereits markiert.“ Klicken Sie auf **Warenkorb erkennen**; das Ergebnis nennt die Quelle **Shop-Plugin**. Bestätigen Sie mit **Ja, passt**. Damit ist belegt, dass der Marker auf der Seite steht und das Tag mit der richtigen Shop-ID läuft, und der Schritt **Warenkorb erkannt** im Portal ist erledigt. Für den Warenkorb wird sonst nichts gespeichert, denn punchout.dev liest den Marker bei jedem Punchout neu.

## Aktualisieren

Laden Sie die neue Zip-Datei aus dem Tab Einbindung herunter, entpacken Sie sie über `custom/plugins/PunchoutDev` und führen Sie dann aus:

```bash
bin/console plugin:refresh
bin/console plugin:update PunchoutDev
bin/console cache:clear
```

### Umstieg von PunchoutNinja 1.x

Für Shopware ist Version 2.0.0 ein neues Plugin: Deinstallieren Sie `PunchoutNinja` und löschen Sie seinen Ordner, bevor Sie `PunchoutDev` installieren. Betreiben Sie nie beide. Es wird nichts übernommen: Tragen Sie beide Karten neu ein und ändern Sie den **Login-Pfad** im Tab Auto-Login des Portals auf `/punchout-dev/login`.

## Fehlersuche

| Symptom | Ursache | Lösung |
| --- | --- | --- |
| Kein `pob.js`-Tag im Seitenquelltext | **Snippet einbinden** ist aus, oder **Snippet-URL** oder **Shop-ID** ist für diesen Verkaufskanal leer | Schalten Sie **Snippet einbinden** ein und tragen Sie beide Werte ein, dann `bin/console cache:clear` |
| Das Setup-Panel meldet **Voreinstellung** oder **Automatisch erkannt** statt **Shop-Plugin** | Der Marker kommt nicht auf der Seite an: Das Theme überschreibt `page_checkout_cart_product_table`, ohne `parent()` aufzurufen, oder der Storefront-Cache ist veraltet | Rufen Sie im Block des Themes `parent()` auf, dann `bin/console cache:clear` |
| Jeder Login wird mit dem Grund `replay` abgelehnt | Die Tabelle des Plugins für verwendete Login-Tokens fehlt | `bin/console plugin:update PunchoutDev` |
| Jeder Login wird mit dem Grund `expired` abgelehnt | Die Uhr des Shops geht vor | Synchronisieren Sie die Serveruhr |
| Der Einkäufer landet auf einer 404-Seite | Der **Login-Pfad** im Portal passt nicht zur Route, oft nach dem Umstieg von 1.x | Setzen Sie ihn auf `/punchout-dev/login`, gegebenenfalls mit dem Präfix des Unterverzeichnisses |
| Auto-Login bewirkt nichts, der Einkäufer kauft als Gast ein | Auto-Login ist im Portal an, aber im Plugin ist **Auto-Login aktivieren** aus, oder **Shop-ID** / **Public-Key-Zeilen** sind leer (Grund `disabled` oder `not_configured`). Das Plugin leitet ohne Anmeldung auf die Landing-Seite weiter. | Füllen Sie die Karte Auto-Login aus, oder schalten Sie Auto-Login im Tab Auto-Login des Portals aus |

:::note
War Auto-Login im Plugin ausgeschaltet oder nicht eingerichtet, leitete Plugin 2.0.0 auf `/` statt auf die Landing-Seite weiter, und der Punchout ging verloren. Aktualisieren Sie auf 2.0.1 oder neuer.
:::

Das Plugin schreibt je abgelehntem Login-Token eine Warnung mit einem Ablehnungsgrund ins Shopware-Log. Das Token und den Kunden protokolliert es nie. Die Ablehnungsgründe stehen auf der Seite [Auto-Login](https://punchout.dev/de/docs/plugins/auto-login/).

Mehr unter [Fehlersuche](https://punchout.dev/de/docs/troubleshooting/).

## Vollständige README

Die englische README des Plugins beschreibt die Prüfungen des Tokens, die Sicherheitshinweise und den Selbsttest für die Entwicklung: [README des Shopware-Plugins](https://punchout.dev/de/docs/plugins/shopware/readme/).
