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

# Bestelldetails anzeigen ohne Login

> Gastbestellern den Zugriff auf ihre Bestelldaten und die Retourenanmeldung ermöglichen, abgesichert über zwei Nummern und Google reCAPTCHA v3.

Ein Gastbesteller hat kein Kundenkonto. Wenn er seine Bestellung nachsehen, eine Retoure anmelden oder einen Retourenaufkleber erzeugen will, gibt es für ihn keinen Login, hinter dem seine Daten lägen.

Diese Funktion schafft dafür einen eigenen Weg: Der Käufer weist sich mit zwei Nummern aus seiner Bestellung aus, beispielsweise Rechnungs- und Kundennummer, und der Shop holt die Bestelldaten aus der Warenwirtschaft. Ein Google reCAPTCHA hält dabei automatisierte Zugriffe fern.

![Retouren Portal](https://mintcdn.com/websaleag-44ee7ea6/1eGKRe68jdkjqhBR/images/retouren-portal.jpg?fit=max\&auto=format\&n=1eGKRe68jdkjqhBR\&q=85\&s=6c272d52693ef64ca557c70989c8fba4)

> [!WARNING]
>
> Diese Funktion wurde für die Retouren-Plattform entwickelt, und zwar speziell für das Warenwirtschaftssystem **VS/4 der D\&G** im Zusammenspiel mit der WWS-Infodatenschnittstelle. Die Prüfsummen der beiden Nummern sind fest auf dieses System zugeschnitten. Wenn Sie eine andere Warenwirtschaft einsetzen, sprechen Sie Ihren Ansprechpartner bei der WEBSALE AG an, bevor Sie mit der Einrichtung beginnen.

Wegweiser: [WWS-Infodatenschnittstelle verwenden](https://dokumentation.websale.de/v8s/externe-dienste/wws-infodatenschnittstelle.md)

## Wie die Absicherung funktioniert

Der Zugang steht auf drei Prüfungen, die nacheinander bestehen werden müssen.

| Prüfung | Wogegen sie schützt |
| - | - |
| Beide Nummern sind eingegeben | leere Anfragen |
| Beide Nummern haben eine gültige Prüfsumme | geratene oder vertippte Nummern |
| Das reCAPTCHA wurde bestanden | automatisiertes Durchprobieren |

> [!WARNING]
>
> Zwei Nummern sind kein Passwort. Wer die Rechnung eines anderen Käufers in der Hand hält, kommt damit an dessen Bestelldaten. Das reCAPTCHA verhindert das massenhafte Durchprobieren, nicht den gezielten Zugriff durch eine Person. Geben Sie auf dieser Seite deshalb nur aus, was der Käufer für Retoure und Nachverfolgung wirklich braucht, und keine Daten darüber hinaus.

## Schritt 1: reCAPTCHA v3 einrichten

Registrieren Sie Ihre Domain bei Google reCAPTCHA v3 und tragen Sie die beiden Schlüssel in die `shop.config` ein.

```ini theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<ReCaptchaV3>
   SiteKey            = xxxxxxxxxxxxxxxxxx
   SecretKey          = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
   APIUrl             = https://www.google.com/recaptcha/api.js
   VerifyUrl          = https://www.google.com/recaptcha/api/siteverify
   MinimumScoreToPass = 0.5
</ReCaptchaV3>
```

| Parameter | Bedeutung |
| - | - |
| `SiteKey` | der Websiteschlüssel von Google, steht im Seitenquelltext |
| `SecretKey` | der geheime Schlüssel von Google, bleibt auf dem Server |
| `APIUrl` | die Adresse des reCAPTCHA-Skripts |
| `VerifyUrl` | die Adresse, an die der Shop das Prüfergebnis meldet |
| `MinimumScoreToPass` | der Mindestwert, ab dem ein Besucher als Mensch gilt. Voreinstellung ist `0.5` |

reCAPTCHA v3 zeigt dem Besucher keine Aufgabe, sondern liefert einen Wert zwischen `0` und `1`. Nahe `0` bedeutet wahrscheinlich ein Bot, nahe `1` wahrscheinlich ein Mensch. Über `MinimumScoreToPass` stellen Sie ein, wo Sie die Grenze ziehen. Höhere Werte sperren mehr Bots aus, aber auch mehr echte Käufer.

> [!WARNING]
>
> Der Shop lässt einen Besucher durch, wenn sein Wert **größer** als die Grenze ist. Bei `MinimumScoreToPass = 0.5` scheitert ein Wert von genau `0.5`. Wenn Sie die Grenze feinjustieren, rechnen Sie mit dieser Kante.
>
> Der `SecretKey` gehört ausschließlich in die Shopkonfiguration. Es gibt bewusst kein Tag, mit dem er sich im Template ausgeben ließe. Setzen Sie ihn nirgends in eine Seite.

Referenz: [Konfiguration ReCaptchaV3](https://dokumentation.websale.de/v8s/referenz/konfigurationen/konfiguration-currency-dat.md)

## Schritt 2: Das Formular anlegen

Legen Sie ein neues Template in Ihrem Templateverzeichnis an, beispielsweise `tpl_retoure.htm`. Es enthält das Eingabeformular und ruft sich selbst wieder auf.

Die beiden Nummern werden als One-Time-Parameter übergeben, hier `otporder` und `otpnumber`. Das versteckte Feld `ws_recaptchav3_token` nimmt das Token auf, das das reCAPTCHA-Skript später einträgt.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<form action="~FORM-Template(tpl_retoure.htm)~">
   <input name="otporder" value="" placeholder="Rechnungsnummer">
   <input name="otpnumber" value="" placeholder="Kundennummer">
   <input type="hidden" name="ws_recaptchav3_token">
   <input type="submit" value="Bestellung suchen">
</form>
```

Referenz: [FORM-Template()](https://dokumentation.websale.de/v8s/referenz/tags/form-formulare.md#formulare-fur-beliebige-templates)

## Schritt 3: Das reCAPTCHA-Skript einbinden

Das Skript holt sich von Google ein Token und schreibt es in das versteckte Feld. Es gehört in den `body` des Templates.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<script src="~RECAPTCHAV3-APIUrl~?render=~RECAPTCHAV3-SiteKey~"></script>
<script>
   grecaptcha.ready(function() {
      grecaptcha.execute('~RECAPTCHAV3-SiteKey~', {
         action: 'retoure'
      }).then(function(token){
         $("[name='ws_recaptchav3_token']").val(token);
      });
   });
</script>
```

Der Wert bei `action` ist ein frei gewählter Name für diesen Vorgang. Er taucht in Ihrer reCAPTCHA-Auswertung bei Google auf. Wählen Sie etwas Sprechendes wie `retoure`, dann können Sie später erkennen, von welcher Seite die Anfragen kamen.

> [!WARNING]
>
> Das Beispiel setzt das Token mit jQuery. Ohne eingebundene jQuery-Bibliothek bleibt das Feld leer, das reCAPTCHA schlägt fehl, und der Käufer bekommt seine Bestellung nicht zu sehen. Binden Sie entweder die WEBSALE JavaScript-Bibliothek ein oder ersetzen Sie die Zeile durch reines JavaScript.

Referenz: [RECAPTCHAV3-APIUrl](https://dokumentation.websale.de/v8s/referenz/tags/recaptchav3-google-recaptcha.md#das-skript-von-google-laden) · [RECAPTCHAV3-SiteKey](https://dokumentation.websale.de/v8s/referenz/tags/recaptchav3-google-recaptcha.md#das-skript-von-google-laden)

## Schritt 4: Prüfen und die Bestelldaten holen

Dieser Block ist das Herzstück. Er arbeitet von außen nach innen: erst die Eingaben, dann die Prüfsummen, dann das reCAPTCHA, und erst ganz innen der Aufruf der Warenwirtschaft.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{WS-OTPorder}
   {WS-OTPnumber}

      ~DC-FPorderNumber_set($WS-OTPorder$)~
      ~DC-FPuserNumber_set($WS-OTPnumber$)~

      {DC-FPorderNumber_verifyChecksum(DuG-ReNr)}
         {DC-FPuserNumber_verifyChecksum(DuG-AdrNr)}
            {RECAPTCHAV3-PassedAlways}

               {DC-WSTagParameter-prepare}
                  ~WS-OnlineERPGuestLink($WS-OTPnumber$,$WS-OTPorder$0000,1)~
               {/DC-WSTagParameter-prepare}
               ~WS-ExternInclude($DC-WSTagParameter-use$)~

            {/RECAPTCHAV3-PassedAlways}
         {/DC-FPuserNumber_verifyChecksum(DuG-AdrNr)}
      {/DC-FPorderNumber_verifyChecksum(DuG-ReNr)}

   {/WS-OTPnumber}
{/WS-OTPorder}
```

| Ebene | Aufgabe |
| - | - |
| `WS-OTPorder` und `WS-OTPnumber` | Beide Eingabefelder sind gefüllt |
| `DC-FPorderNumber_set` und `DC-FPuserNumber_set` | Die beiden Werte werden in Fließkomma-Variablen übernommen |
| `DC-FPorderNumber_verifyChecksum(DuG-ReNr)` | Die Rechnungsnummer hat eine gültige D\&G-Prüfsumme |
| `DC-FPuserNumber_verifyChecksum(DuG-AdrNr)` | Die Kundennummer hat eine gültige D\&G-Prüfsumme |
| `RECAPTCHAV3-PassedAlways` | Das reCAPTCHA wurde bestanden |
| `DC-WSTagParameter-prepare` | Bereitet den Aufruf vor, weil ein Tag nicht direkt als Parameter eines anderen Tags stehen kann |
| `WS-ExternInclude()` | Ruft die WWS-Infodatenschnittstelle auf und bindet deren Ausgabe ein |

> [!WARNING]
>
> An die Rechnungsnummer wird `0000` angehängt. Das ist ein fester Bestandteil der Rechnungsnummer bei D\&G und kein Platzhalter. Lassen Sie es stehen.
>
> `verifyChecksum` kennt genau zwei Prüfarten: `DuG-ReNr` für die Rechnungsnummer und `DuG-AdrNr` für die Kundennummer. Jeder andere Wert lässt die Prüfung stillschweigend scheitern, ohne Fehlermeldung. Achten Sie auch auf die Groß- und Kleinschreibung der beiden Namen und darauf, sie nicht zu vertauschen.

Referenz: WS-OTPX · [DC-FPX\_set()](https://dokumentation.websale.de/v8s/referenz/tags/dc/parameter.md#die-tags-im-uberblick) · [DC-FPX\_verifyChecksum()](https://dokumentation.websale.de/v8s/referenz/tags/dc/parameter.md#die-tags-im-uberblick) · [RECAPTCHAV3-PassedAlways](https://dokumentation.websale.de/v8s/referenz/tags/recaptchav3-google-recaptcha.md#das-ergebnis-abfragen) · [DC-WSTagParameter-prepare](https://dokumentation.websale.de/v8s/referenz/tags/dc/vergleiche.md#die-tags-im-uberblick) · [DC-WSTagParameter-use](https://dokumentation.websale.de/v8s/referenz/tags/dc/vergleiche.md#die-tags-im-uberblick) · [WS-OnlineERPGuestLink()](https://dokumentation.websale.de/v8s/referenz/tags/ws/merkzettel-vergleich-upload-und-externe-dienste.md#die-tags-im-uberblick) · [WS-ExternInclude()](https://dokumentation.websale.de/v8s/referenz/tags/ws/merkzettel-vergleich-upload-und-externe-dienste.md)

### Einmal pro Sitzung oder bei jedem Aufruf prüfen

Für die reCAPTCHA-Prüfung stehen zwei Tags bereit. Sie unterscheiden sich darin, wie oft geprüft wird.

| Tag | Prüfung |
| - | - |
| `RECAPTCHAV3-PassedAlways` | bei jedem Aufruf der Seite erneut |
| `RECAPTCHAV3-PassedOnce` | einmalig je Sitzung, danach gilt das Ergebnis weiter |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{RECAPTCHAV3-PassedOnce}
   {DC-WSTagParameter-prepare}
      ~WS-OnlineERPGuestLink($WS-OTPnumber$,$WS-OTPorder$0000,1)~
   {/DC-WSTagParameter-prepare}
   ~WS-ExternInclude($DC-WSTagParameter-use$)~
{/RECAPTCHAV3-PassedOnce}
```

`PassedOnce` ist bequemer für den Käufer, der seine Bestellung mehrfach aufruft oder zwischen Übersicht und Retourenschein wechselt. `PassedAlways` ist die strengere Wahl. Bei einer Seite, die fremde Bestelldaten zeigt, spricht einiges für die strengere.

Referenz: [RECAPTCHAV3-PassedOnce](https://dokumentation.websale.de/v8s/referenz/tags/recaptchav3-google-recaptcha.md#das-ergebnis-abfragen)

## Schritt 5: Die Prüfung sichtbar machen (optional)

Für die Fehlersuche lässt sich ausgeben, wie die reCAPTCHA-Prüfung ausgegangen ist und was Google geantwortet hat.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{ST-TestMode}
   Code: ~RECAPTCHAV3-LastResponseCode~<br>
   <textarea>~RECAPTCHAV3-LastPlainResponse~</textarea>
{/ST-TestMode}
```

| Tag | Liefert |
| - | - |
| `RECAPTCHAV3-LastResponseCode` | den Code der letzten Prüfung. `0` bedeutet bestanden |
| `RECAPTCHAV3-LastPlainResponse` | die unveränderte Antwort von Google |

> [!WARNING]
>
> Beide Tags beziehen sich auf die **letzte** Prüfung. Sie liefern erst dann etwas, wenn `RECAPTCHAV3-PassedAlways` oder `RECAPTCHAV3-PassedOnce` im Template bereits durchlaufen wurde. Setzen Sie diesen Block deshalb hinter den Prüfblock aus Schritt 4, nicht davor.
>
> `ST-TestMode` sorgt dafür, dass die Ausgabe nur im Testmodus erscheint. Lassen Sie diese Klammerung stehen. Die Antwort von Google enthält Angaben, die auf einer öffentlich erreichbaren Seite nichts zu suchen haben.

Referenz: [ST-TestMode](https://dokumentation.websale.de/v8s/referenz/tags/st/seitenzustand-und-navigation.md) · [RECAPTCHAV3-LastResponseCode](https://dokumentation.websale.de/v8s/referenz/tags/recaptchav3-google-recaptcha.md#die-tags-im-uberblick) · [RECAPTCHAV3-LastPlainResponse](https://dokumentation.websale.de/v8s/referenz/tags/recaptchav3-google-recaptcha.md#die-tags-im-uberblick)

## Verwandte Themen

* Wegweiser: [WWS-Infodatenschnittstelle verwenden](https://dokumentation.websale.de/v8s/externe-dienste/wws-infodatenschnittstelle.md)
* Wegweiser: [Externe Includes](https://dokumentation.websale.de/v8s/externe-dienste/externe-inhalte-einbinden.md)
* Wegweiser: [Kundenkonto](https://dokumentation.websale.de/v8s/zahlungsarten-anlegen/kundenkonto.md), für den Zugang angemeldeter Käufer


## Related topics

- [DC- (Freie Parameter und Session-Parameter)](https://dokumentation.websale.de/v8s/referenz/tags/dc/parameter.md)
- [PDF-Anhang der Bestelldetails](https://dokumentation.websale.de/v8s/bestelluebersicht-bestelleingangsbestaetigung/pdf-anhang-der-bestelldetails.md)
- [$wsOrderHistory - Bestellhistorie](https://dokumentation.websale.de/frontend/referenz/module/wsorderhistory.md)
- [Kategorie anzeigen](https://dokumentation.websale.de/v8s/kategorien/kategorie-anzeigen.md)
- [Gruppierungsprodukte anzeigen](https://dokumentation.websale.de/v8s/produkte/gruppierungsprodukte-anzeigen.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.