Anleitungen

WooCommerce

ErprobtPlugins → Installieren → Plugin hochladen

Läuft in einem Shop, den wir selbst betreiben, und die ganze Kette ist von aussen nachgemessen — vom Warenkorb bis zum signierten Anfrageobjekt an die Wallet. Wenn etwas klemmt, klemmt es an Ihrem Aufbau, nicht am Paket.

Als Datei: readme.txt · PRUEFPLAN.md

Einbau

EdelVerify — Altersprüfung mit der E-ID

Contributors: edelbyte Tags: woocommerce, alterspruefung, age-verification, e-id, swiyu Requires at least: 6.4 Tested up to: 7.0 Requires PHP: 8.1 Stable tag: 1.1.1 License: GPL-2.0-or-later License URI: https://www.gnu.org/licenses/gpl-2.0.html

Sperrt den Checkout für altersbeschränkte Produkte, bis das Alter über die staatliche Schweizer E-ID bestätigt wurde. Die Grenze ist je Kategorie einstellbar — 16 oder 18.

Beschreibung

Ihre Kundschaft bestätigt das Alter in der swiyu-App des Bundes. Übermittelt wird eine einzige Angabe: Grenze erfüllt, ja oder nein. Kein Name, kein Geburtsdatum, keine Ausweiskopie — es gibt in Ihrem Shop also auch nichts, was Sie speichern, schützen oder löschen müssten.

Die Grenze bestimmen Sie: 16 oder 18, je Kategorie, mit einer Vorgabe für den ganzen Shop. Bier ab 16 neben Spirituosen ab 18 ist damit ein Eintrag und kein zweiter Shop. Liegt Gemischtes im Warenkorb, gilt die strengste Grenze.

Der Riegel sitzt auf dem Server. Alles, was im Browser zu sehen ist, ist Anzeige: Wer das Prüffenster mit den Entwicklerwerkzeugen wegräumt, kommt trotzdem nicht an der Bestellung vorbei. Das Plugin hängt an beiden Kassenwegen — am klassischen Checkout und am Block-Checkout, den WooCommerce heute standardmässig ausliefert.

Ist EdelVerify nicht erreichbar, wird die Bestellung abgewiesen, nicht durchgelassen. Bei einer Altersprüfung ist die sichere Richtung die unbequeme.

Was Sie brauchen

  • Das Plugin-Archiv: https://verify.edelbyte.ch/v1/woocommerce/edelverify-plugin.zip
  • Ein Schlüsselpaar von uns — einen öffentlichen (pk_test_…) und einen geheimen (sk_test_…). Wie Sie es bekommen, steht gleich darunter.
  • WooCommerce
  • Kundschaft mit der swiyu-App und einer E-ID (für den Testbetrieb nicht nötig)

Woher Sie die Schlüssel bekommen

Einen Selbstbedienungszugang gibt es heute nicht. Es gibt kein Anmeldeformular, in dem Sie sich selbst ein Konto anlegen und Schlüssel abholen; wir legen Ihren Shop von Hand an und schicken Ihnen das Paar.

Der Weg dorthin ist ein kurzes Gespräch:

  • Warteliste: https://verify.edelbyte.ch/#warteliste
  • E-Mail: info@edelbyte.ch
  • Telefon: 044 500 25 04

Sagen Sie uns dabei gleich die Adressen Ihres Shops (mit und ohne www, dazu Ihr Testsystem) und die Altersgrenze, die Ihre Ware verlangt. Beides tragen wir ein — auch das ist heute nichts, was Sie selbst einstellen können.

Was es kostet

Heute nichts, weil heute nichts verkauft wird. Es gibt keinen Preis, kein Abo und keine Rechnung: Wir nennen keinen Betrag, den wir nicht halten können, solange die produktive E-ID nicht steht. Was es gibt, ist die Warteliste, ein Pilotgespräch und Testschlüssel zum Bauen. Über Konditionen sprechen wir, bevor Sie scharf schalten — nicht danach.

Stand

EdelVerify läuft zurzeit gegen die Testumgebung des Bundes. Vorführen und einbauen geht jederzeit; für echte Kundschaft fehlt die produktive Umgebung, die der Bund noch nicht geöffnet hat.

Installation

  1. Archiv herunterladen: https://verify.edelbyte.ch/v1/woocommerce/edelverify-plugin.zip Dann Plugins → Installieren → Plugin hochladen, diese Datei wählen, installieren und aktivieren.
  2. WooCommerce → Einstellungen → EdelVerify öffnen.
  3. Öffentlichen und geheimen Schlüssel eintragen — das Paar, das wir Ihnen geschickt haben (siehe «Woher Sie die Schlüssel bekommen»). Fangen Sie mit den Testschlüsseln an: pk_test_… und sk_test_….
  4. Unter Altersgrenze (Vorgabe) wählen, was gilt, wo keine Kategorie etwas anderes sagt. Ab Werk 18.
  5. Unter Betroffene Kategorien die Slugs der altersbeschränkten Warengruppen eintragen, mit Komma getrennt, zum Beispiel vape,tabak,spirituosen. Bleibt das Feld leer, wird der ganze Shop geprüft — für einen Laden, der auch Zubehör ohne Altersgrenze führt, ist das meist zu weit.

Den Slug einer Kategorie finden Sie unter Produkte → Kategorien in der Spalte «Slug» (ältere deutsche Installationen nennen sie «Titelform»). Es ist derselbe Text, der in der Adresse der Kategorieseite steht: .../produkt-kategorie/vape/vape. Nehmen Sie ihn genau so, wie er dort steht — nicht den angezeigten Namen: «Vape & Zubehör» ist kein Slug, und ein Slug, den es nicht gibt, trifft nie etwas.

Eine eigene Grenze hängen Sie mit Doppelpunkt an den Slug:

bier:16,wein:16,spirituosen:18,vape

Ein Slug ohne Zusatz bekommt die Vorgabe aus Schritt 4. Ein Zusatz, den es nicht gibt (:17), wird auf 18 angehoben und ins WooCommerce-Log geschrieben — nie auf 16 gesenkt.

  1. Uns die Adressen Ihres Shops melden, damit wir sie als erlaubte Herkunft hinterlegen (info@edelbyte.ch). Das ist kein Feld im Plugin: Die Liste liegt bei uns, und solange für Ihren Shop keine Adresse darin steht, darf jede beliebige Seite Prüfungen auf Ihren öffentlichen Schlüssel starten. Vor dem Kundenbetrieb gehört sie deshalb gefüllt.
  2. Verbindung prüfen anklicken. Der Test sagt Ihnen in vier Zeilen, ob der Dienst erreichbar ist, ob beide Schlüssel angenommen werden, welche Grenzen gelten und ob Ihre Adresse als Herkunft freigegeben ist.
  3. Probekauf machen — bitte wirklich. Der beiliegende PRUEFPLAN.md führt Sie in zehn Minuten durch alles, was zählt: die gesperrte Kasse ohne Nachweis, die vollständige Prüfung bis zur durchgegangenen Bestellung, die Ablehnung einer zu jungen Person, die beiden Grenzen 16 und 18 und das Verhalten bei einer Störung. Ein Einbau, den niemand nachgemessen hat, ist eine Vermutung.

Wichtig zu Schritt 6 und 7: Der öffentliche Schlüssel darf nur von den Adressen aus Prüfungen starten, die bei uns hinterlegt sind. Läuft Ihr Shop unter mehreren Adressen — mit und ohne www, dazu eine Testumgebung — gehören alle dort hinein, sonst schlägt die Prüfung genau auf einer davon fehl.

Testbetrieb ohne Wallet

Die produktive E-ID des Bundes startet voraussichtlich Ende 2026. Bis dahin hat Ihre Kundschaft nichts vorzuzeigen — bauen und prüfen lässt sich trotzdem heute, mit den Testschlüsseln.

Ein Schlüssel, der mit pk_test_ beziehungsweise sk_test_ beginnt, spricht den Prüfdienst des Bundes gar nicht erst an. Die Prüfung steht vier Sekunden auf PENDING — damit die Abfrage im Shop wirklich einmal durchläuft — und geht dann durch. Im Shop sehen Sie damit den vollständigen Ablauf bis zur abgeschickten Bestellung, ohne dass jemand eine Wallet zückt.

Zwei Dinge, die Sie dabei wissen müssen:

  • Ohne weitere Angabe nimmt eine Testprüfung immer den glücklichen Ausgang. Der Fall, den Ihr Shop am seltensten sieht und am dringendsten können muss, ist der andere: zu jung. Ihn bestellen Sie mit test_outcome — im Shop selbst gibt es dafür kein Feld, wohl aber in Abschnitt 5 des beiliegenden PRUEFPLAN.md, samt fertigem curl-Aufruf.
  • Test- und Livebetrieb berühren sich nie. Ein Nachweis aus dem Testbetrieb lässt sich mit einem Live-Schlüssel nicht einlösen und umgekehrt. Entschieden wird das ausschliesslich am Schlüssel. Am Tag der Umstellung tauschen Sie zwei Zeichenfolgen aus, sonst nichts.

Die vollständige technische Anleitung — Schnittstelle, Fehlerschlüssel, Webhook, Testausgänge — steht unter https://verify.edelbyte.ch/entwickler

Häufige Fragen

Sieht mein Shop das Geburtsdatum?

Nein. Die Wallet gibt ausschliesslich die Angabe frei, ob die verlangte Grenze erfüllt ist. Weder Ihr Shop noch EdelVerify erfährt Name, Geburtsdatum oder Ausweisnummer.

Welche Altersgrenzen gibt es?

16 und 18. Mehr belegt die staatliche E-ID nicht. Ein Feld, in das man 21 eintragen könnte, ohne dass es wirkt, wäre schlimmer als keines.

Wie wirkt sich ein gemischter Warenkorb aus?

Es gilt die strengste Grenze. Ein Sixpack neben einer Flasche Gin macht den ganzen Warenkorb zu einem 18er-Warenkorb — die Alternative wäre, die Bestellung aufzuteilen, und das kann eine Kasse nicht.

Muss die Kundschaft nach jeder Warenkorbänderung neu prüfen?

Nein, solange die Grenze nicht steigt. Ein Nachweis ab 18 löst auch Ware ab 16 ein. Umgekehrt nicht: Wer sich für Bier ausgewiesen hat und dann eine Flasche Gin dazulegt, wird erneut gefragt.

Wie lange gilt eine bestätigte Prüfung?

So lange, wie es im EdelVerify-Admin für Ihren Shop eingestellt ist, standardmässig dreissig Tage. Danach fragt der Shop erneut. Der Nachweis liegt in der WooCommerce-Sitzung und wird bei jedem Bestellabschluss frisch gegen EdelVerify geprüft — ein zurückgezogener Nachweis fällt damit sofort auf.

Was passiert bei einer Störung?

Die Bestellung wird abgewiesen. Ein Ausfall darf keine ungeprüfte Bestellung durchlassen.

Funktioniert es mit dem Block-Checkout?

Ja. Das Plugin hängt an woocommerce_checkout_process für den klassischen Weg und an den Store-API-Haken für den Block-Checkout. Beide Wege treffen dieselbe Entscheidung an derselben Stelle im Code.

Und wenn jemand die Store-API direkt anspricht?

Dann greift derselbe Riegel. Das ist genau der Fall, für den die serverseitige Prüfung da ist.

Ich baue eine eigene Oberfläche. Woran erkenne ich die Schranke?

Am Feld extensions.edelverify in den Antworten von /wp-json/wc/store/v1/cart und /wp-json/wc/store/v1/checkout:

"extensions": { "edelverify": { "pruefung_noetig": true, "grenze": 16, "erfuellt": false } }

grenze ist die echte Grenze dieses Warenkorbs — bei gemischtem Inhalt die strengste, bei leerem Warenkorb die Vorgabe des Shops.

Damit lässt sich die Prüfung anbieten, sobald der erste altersbeschränkte Artikel im Warenkorb liegt — und nicht erst, wenn die Kundschaft die ganze Adresse eingetippt hat und die Bestellung mit einem 409 abgewiesen wird.

Drei Angaben, mehr steht dort nicht: keine Kennung, kein Nachweis, kein Nonce. Diese Antwort ist für jeden lesbar, der den Warenkorb-Token hat.

erfuellt ist Anzeige, nicht Erlaubnis. Wer den Wert im Browser umbiegt, biegt seine eigene Bildschirmanzeige um; die Bestellung wird trotzdem am Server geprüft.

Changelog

1.1.1

  • Nach bestandener Prüfung steht in Warenkorb und Kasse eine grüne Zeile «Alter bestätigt: über 16/18» — vorher lud die Kasse neu und zeigte nichts
  • Anleitung ergänzt: Bezugsort des Archivs, Weg zu den Schlüsseln, wo die Kategorie-Slugs stehen, die Meldung der erlaubten Herkunft, der Testbetrieb und der Probekauf zum Schluss

1.1.0

  • Altersgrenze einstellbar: 16 oder 18, je Kategorie, mit Vorgabe für den Shop
  • Bei gemischtem Warenkorb gilt die strengste Grenze
  • Der Beleg an der Bestellung hält die tatsächlich geprüfte Grenze fest
  • extensions.edelverify.grenze meldet die echte Grenze statt pauschal 18
  • Ein Shop, der nichts umstellt, prüft unverändert alles gegen 18

1.0.0

  • Riegel für klassischen Checkout und Block-Checkout
  • Einstellungsseite unter WooCommerce → Einstellungen → EdelVerify
  • Verbindungstest für Erreichbarkeit, beide Schlüssel und Herkunft
  • Hinweis im Backend, solange die Schlüssel fehlen

Prüfplan

Damit nehmen Sie den Einbau selbst ab, ohne uns zu fragen. Geht ein Punkt nicht durch, schicken Sie ihn uns mit der Nummer — dann wissen wir sofort, wo wir suchen.

Prüfplan — EdelVerify für WooCommerce

Diese Datei beantwortet eine einzige Frage: Woran erkennen Sie, dass der Riegel wirklich hält?

Die Einbauanleitung steht in readme.txt. Sie führt bis dahin, dass alles eingerichtet *aussieht*. Das genügt bei einer Altersprüfung nicht — eine abgeschaltete Schranke sieht auf der Bestellseite genauso aus wie eine funktionierende, solange niemand das Alter bestätigt hat und trotzdem bestellt.

Wer die Punkte 1 bis 7 abgearbeitet hat, hat es gemessen und muss es nicht mehr glauben. Rechnen Sie mit einer knappen Stunde.

Neu: die Altersgrenze ist einstellbar. 16 oder 18, je Kategorie, mit einer Vorgabe für den ganzen Shop. Ein Shop, der nichts umstellt, prüft weiterhin alles gegen 18 — Punkt 5 misst genau das nach. Wer Bier ab 16 und Spirituosen ab 18 verkauft, arbeitet zusätzlich Punkt 6 ab; dort steckt der einzige wirklich neue Fehler, den man machen kann.


0. Was Sie brauchen

  • Einen Shop, in dem eine Testbestellung nicht stört — ein Staging-System oder ein frisch aufgesetzter Shop. Punkt 3 legt Bestellungen an.
  • Beide Schlüssel aus dem EdelVerify-Admin unter «Shops». Nehmen Sie die Testschlüssel (pk_test_…, sk_test_…). Damit lässt sich jeder Ausgang auf Bestellung herbeiführen, auch der, den Sie sonst nie zu sehen bekämen.
  • curl und eine Kommandozeile. Der halbe Plan läuft ohne Browser, und das ist Absicht: Wer nur die Oberfläche prüft, prüft genau den Weg, den ein Umgeher nicht nimmt.

Der geheime Schlüssel gehört nicht in eine Chatnachricht, kein Ticket und keinen Screenshot. Er ist der Riegel; wer ihn hat, stellt sich Nachweise selbst aus. Fällt er hinaus, ziehen Sie ihn im EdelVerify-Admin zurück und tragen einen neuen ein — das dauert eine Minute und ist immer die richtige Entscheidung.


1. Installation

Plugins → Installieren → Plugin hochladen → edelverify-plugin.zip → aktivieren
PrüfenErwartet
Plugin-Liste«EdelVerify — Altersprüfung mit der E-ID», aktiv
Oben im BackendGelber Hinweis «Schlüssel fehlen»
WooCommerce → EinstellungenReiter EdelVerify ist da

Der gelbe Hinweis ist kein Schönheitsfehler, sondern die erste bestandene Prüfung: Das Plugin sagt von sich aus, dass es noch nicht arbeiten kann.


2. Konfiguration und Verbindungstest

Unter WooCommerce → Einstellungen → EdelVerify:

FeldWert
Adresse des Diensteshttps://verify.edelbyte.ch
Öffentlicher Schlüsselpk_test_…
Geheimer Schlüsselsk_test_…
Altersgrenze (Vorgabe)ab 18 Jahren — gilt, wo keine Kategorie etwas anderes sagt
Betroffene Kategoriendie Slugs, z. B. vape,tabak,spirituosen

Die Grenze je Kategorie hängen Sie mit Doppelpunkt an den Slug:

bier:16,wein:16,spirituosen:18,vape

Ein Slug ohne Zusatz bekommt die Vorgabe. Damit bleibt jede Einstellung aus der Zeit vor der zweiten Schwelle Zeichen für Zeichen gültig und verhält sich unverändert. Liegt Gemischtes im Warenkorb, gilt die strengste Grenze.

Ein Zusatz, den der Dienst nicht kennt (:17, :achtzehn), wird auf 18 angehoben und ins Log geschrieben — nicht auf 16 gesenkt. Prüfen lässt sich das in Punkt 6.

Speichern, dann Verbindung prüfen. Vier Zeilen müssen grün sein: Erreichbarkeit, beide Schlüssel, Kategorien — und die Grenze, die dort im Klartext steht. Lesen Sie sie: Sie ist die eine Zahl, die im Streitfall zählt, und ein Auswahlfeld liest niemand nach.

Die Herkunft ist der häufigste Stolperstein. Der öffentliche Schlüssel darf nur von Adressen aus Prüfungen starten, die im EdelVerify-Admin hinterlegt sind. Läuft der Shop unter mehreren Adressen — mit und ohne www, dazu ein Staging-System —, gehören alle dorthin. Sonst schlägt die Prüfung genau auf einer davon fehl, und zwar meist auf der, die Sie nicht getestet haben.

Zum Gegenprobieren: Ändern Sie ein Zeichen im geheimen Schlüssel und drücken Sie noch einmal. Der Test muss rot werden. Wird er grün, prüft er nichts.


3. Der Riegel — ohne jede Altersbestätigung

Der wichtigste Abschnitt. Geprüft wird gegen die Store-API, nicht über die Oberfläche: Das ist derselbe Weg, den der Block-Checkout intern nimmt, und gleichzeitig der Weg, den jemand nähme, der die Schranke umgehen will.

Für einen Shop unter https://ihr-shop.example liegt fertig bei:

./scripts/pruefe-shop.sh https://ihr-shop.example

Es misst drei Behauptungen nach:

  1. Ein Artikel ohne Altersgrenze lässt sich bestellen.
  2. Ein altersbeschränkter Artikel wird abgewiesen.
  3. Die Abweisung kommt aus EdelVerify (edelverify_age_required) und nicht zufällig von woanders — einer fehlenden Versandart etwa.

Das Skript legt Bestellungen an (Zahlungsart «Nachnahme»). Führen Sie es nicht gegen einen Shop aus, in dem echte Bestellungen liegen. Es geht auch nicht von den Slugs Ihres Shops aus, sondern von denen des Demo-Shops (zubehoer, liquids) — für den eigenen Shop die beiden Stellen im Skript anpassen.

Der Stand für entkoppelte Oberflächen. Wer eine eigene Storefront, eine App oder eine kopflose Oberfläche baut, muss die Schranke anzeigen können, bevor die Kundschaft die Adresse eingetippt hat. Dafür hängt das Plugin drei Angaben an die Store-API:

curl -s https://ihr-shop.example/wp-json/wc/store/v1/cart -b kekse.txt \
  | python3 -c "import sys,json; print(json.load(sys.stdin).get('extensions',{}).get('edelverify'))"
WarenkorbErwartet
leer{'pruefung_noetig': False, 'grenze': <Vorgabe>, 'erfuellt': True}
Artikel ohne Altersgrenzepruefung_noetig: False
altersbeschränkter Artikel, ungeprüftpruefung_noetig: True, erfuellt: False
derselbe, nach bestandener Prüfungpruefung_noetig: True, erfuellt: True
nur Bier (bier:16)grenze: 16
Bier und Gin (spirituosen:18)grenze: 18 — die strengste gewinnt

grenze ist seit der zweiten Schwelle die echte Grenze dieses Warenkorbs, nicht mehr pauschal 18. Bei leerem Warenkorb steht dort die Vorgabe des Shops: Ein Client soll wissen, womit er zu rechnen hat, bevor die erste Flasche im Korb liegt.

Kommt None zurück, ist das Plugin älter als diese Angabe oder der Block-Support fehlt. Steht dort ein av_… oder eine Kennung, melden Sie es uns — dort gehört nichts hin ausser diesen drei Werten.

Beide Kassenwege einzeln prüfen. WooCommerce liefert heute den Block-Checkout aus, viele Shops laufen noch klassisch, und das Plugin hängt an zwei verschiedenen Haken:

WegHaken im PluginWie prüfen
Block-Checkout / Store-APIwoocommerce_store_api_cart_errorsdas Skript oben
Klassischer Checkoutwoocommerce_checkout_processSeite mit [woocommerce_checkout] aufrufen und von Hand bestellen

Beide müssen abweisen. Greift nur einer, hat der Shop eine Kasse ohne Schloss — und es fällt niemandem auf, weil die andere hält.


4. Eine vollständige Prüfung, von Anfang bis Ende

Testschlüssel sprechen den Prüfdienst des Bundes gar nicht erst an. Sie stehen vier Sekunden auf PENDING — damit die Abfrageschleife wirklich durchläuft — und nehmen dann den Ausgang, den Sie bestellt haben.

  1. Altersbeschränkten Artikel in den Warenkorb legen.
  2. Zur Kasse. Es erscheint der Hinweis mit dem Knopf «Alter bestätigen».
  3. Klicken. Das Fenster geht auf, mit QR-Code.
  4. Nach wenigen Sekunden wird es grün.
  5. Jetzt nicht neu laden, sondern warten, bis die Seite es von sich aus tut.

Punkt 5 ist der Fehler, den fast jede Einbindung einmal macht. «Grün» heisst: die Prüfung ist bestanden. Es heisst nicht, dass Ihr Shop davon weiss — die Rückmeldung an /wp-json/edelverify/v1/confirm läuft in diesem Augenblick erst los. Wer hier neu lädt, bricht sie ab. Der Nachweis wird nur einmal ausgeliefert und ist damit verbrannt: Die Seite kommt mit derselben Schranke zurück, und für die Kundschaft sieht es aus, als hätte die Prüfung nichts bewirkt.

  1. Bestellen. Die Bestellung geht durch.
  2. WooCommerce → Bestellungen: Die Spalte EdelVerify zeigt den Beleg.

Was in der Bestellung stehen muss und was nicht:

FeldInhalt
edelverify_verified1
edelverify_checked_atZeitpunkt
edelverify_min_agedie tatsächlich durchgesetzte Grenze — 16 bei einem Bier-Warenkorb, 18 bei Gin
edelverify_modetest
edelverify_check_refacht Zeichen, zum Wiederfinden im EdelVerify-Admin
der Nachweis selbststeht nirgends — er ist eingelöst, nicht abgelegt

Steht dort ein av_…, ist etwas falsch: Der Nachweis ist ein Inhaberpapier und gilt dreissig Tage. Wer ihn aus dem Bestellexport abschreibt, kauft damit einen Monat lang ohne Prüfung.

Steht in edelverify_min_age pauschal 18, obwohl der Warenkorb nur Bier enthielt, ist der Beleg falsch — dann läuft eine ältere Fassung des Plugins. Der Beleg muss die Grenze festhalten, gegen die wirklich geprüft wurde; das ist der ganze Zweck der Zeile.


5. Der Fall, den Sie am seltensten sehen und am dringendsten können müssen

Ein Shop, der nur den Erfolgsfall geprüft hat, hat die Altersprüfung nicht geprüft. Mit Testschlüsseln lässt sich jeder Ausgang bestellen — dafür sind sie da.

Der Ausgang wird beim Start der Prüfung mitgegeben. Am schnellsten von Hand:

# Prüfung mit dem gewünschten Ausgang beginnen
curl -s -X POST https://verify.edelbyte.ch/api/v1/verifications \
  -H "x-api-key: $SK" -H 'content-type: application/json' \
  -d '{"reference":"pruefplan","test_outcome":"under_18"}'

# vier Sekunden warten, dann den Stand holen
sleep 5
curl -s "https://verify.edelbyte.ch/api/v1/verifications/<id>" -H "x-api-key: $SK"
test_outcomeErwartetWas der Shop tun muss
successSUCCESS, age_ok: true, Nachweis dabeidurchlassen
under_18SUCCESS, age_ok: false, kein Nachweisabweisen
failedFAILED, error_code: test_failedabweisen
expiredEXPIREDabweisen, neu anbieten
ueber_18 (Tippfehler)400 invalid_test_outcome

SUCCESS heisst «die Prüfung ist abgeschlossen», nicht «alt genug». Massgeblich ist age_ok. Eine Einbindung, die nur auf den Status schaut, lässt bei under_18 durch — und merkt es nie, weil dieser Fall im Alltag fast nie vorkommt.

`over_18` ist nicht `age_ok`. Bei einer Prüfung gegen 16 steht in over_18 auch dann false, wenn die Person die Grenze erfüllt — geprüft wurde ja gegen 16, nicht gegen 18. Eine Einbindung, die weiterhin nur over_18 liest, weist damit jede bestandene 16er-Prüfung ab. Im 18er-Betrieb fällt das nie auf, weil dort beide Felder dasselbe sagen. Nachgemessen an der laufenden Anlage: python3 scripts/api-vertragstest.py, Abschnitt 10.

Im Shop durchspielen: Kasse aufrufen, Prüfung starten, und wenn das Fenster rot wird, trotzdem bestellen. Die Bestellung muss abgewiesen werden.


6. Die zweite Schwelle — Bier ab 16, Gin ab 18

Nur nötig, wenn Sie zwei Grenzen führen. Wer alles gegen 18 prüft, überspringt diesen Abschnitt; Punkt 5 hat für ihn bereits alles gemessen.

Tragen Sie unter «Betroffene Kategorien» ein: bier:16,spirituosen:18.

WarenkorbErwartet
nur BierStreifen sagt «über 16», Prüffenster sagt «Über 16 bestätigt»
nur GinStreifen sagt «über 18»
Bier und GinStreifen sagt «über 18» — die strengste Grenze gewinnt
Bier, geprüft, dann Gin dazulegenKasse geht wieder zu

Die letzte Zeile ist die wichtige. Sie misst, ob das Plugin ein «ja» für 16 in einen Warenkorb ab 18 hinüberträgt. So führen Sie sie herbei:

  1. Nur Bier in den Warenkorb, Prüfung bestehen, Kasse ist offen.
  2. Innerhalb von drei Minuten eine Flasche Gin dazulegen.
  3. Zur Kasse. Sie muss zu sein und nach einer neuen Prüfung verlangen.

Drei Minuten, weil das Plugin ein bestandenes Ergebnis so lange zwischenspeichert. Bliebe die Kasse offen, wäre der Zwischenspeicher an die Grenze nicht gebunden — und das Loch wäre exakt drei Minuten breit und für niemanden sichtbar.

  1. Danach die Prüfung wiederholen. Jetzt läuft sie gegen 18 und die Kasse öffnet wieder.
  2. Zum Gegenprobieren die Flasche Gin wieder hinauswerfen: Der Nachweis ab 18 löst auch den Bier-Warenkorb ein, es ist keine neue Prüfung nötig.

Am Bestellbeleg prüfen: edelverify_min_age steht bei der Bier-Bestellung auf 16 und bei der gemischten auf 18. Steht überall 18, hält der Beleg die falsche Grenze fest.

Ohne Browser, direkt gegen die Schnittstelle — dasselbe in drei Aufrufen:

# 16er-Prüfung starten
curl -s -X POST https://verify.edelbyte.ch/api/v1/verifications \
  -H "x-api-key: $SK" -H 'content-type: application/json' \
  -d '{"reference":"pruefplan","min_age":16,"test_outcome":"success"}'

sleep 5
# Stand holen — ACHTUNG: over_18 ist hier false, age_ok ist true
curl -s "https://verify.edelbyte.ch/api/v1/verifications/<id>" -H "x-api-key: $SK"

# Der Nachweis ab 16 löst Ware ab 18 NICHT ein
curl -s -X POST https://verify.edelbyte.ch/api/v1/proofs/verify \
  -H "x-api-key: $SK" -H 'content-type: application/json' \
  -d '{"proof":"av_…","min_age":18}'      # → valid: false
AufrufErwartet
min_age: 16 beim Start201, Antwort trägt min_age: 16
min_age: 17, 21, "18", null, 0400 invalid_min_age
Start ohne min_age201 mit der Vorgabe Ihres Kontos (ab Werk 18)
Nachweis ab 16 → Ware ab 18200 mit valid: false
Nachweis ab 18 → Ware ab 16200 mit valid: true
Einlösen mit min_age: 17200 mit valid: false — hier gibt es kein 4xx

7. Fail-closed — jede Störung endet in einer gesperrten Kasse

Nach jedem Fall die Einstellung wieder zurücksetzen.

FallWie herbeiführenErwartet
Prüfstelle wegAdresse des Dienstes auf https://127.0.0.1:9Kasse zu, Antwort nach ≤ 10 s
Geheimer Schlüssel falschein Zeichen ändernKasse zu
Kein geheimer SchlüsselFeld leerenKasse zu
Öffentlicher Schlüssel falschein Zeichen ändernFenster geht gar nicht erst auf
Herkunft nicht hinterlegtAdresse im EdelVerify-Admin entfernen403 origin_not_allowed, Kasse zu
Nachweis verfälschtin der Sitzung edelverify_proof ein Zeichen ändernKasse zu
Nachweis abgelaufenim EdelVerify-Admin die Gültigkeit auf 0 Tage stellenKasse zu
Schlüssel gewechseltnach bestandener Prüfung sk_ austauschenKasse sofort zu
Prüfung noch offeneine PENDING-Kennung an /wp-json/edelverify/v1/confirm senden422 not_verified
Nachweis schon abgeholtdieselbe Kennung zweimal senden2. Mal 409 proof_consumed
Kategorien leerFeld leerender ganze Shop wird geprüft, gegen die Vorgabe
Unbekannte Grenzebier:17 eintragengilt als 18, Zeile im WooCommerce-Log
Unbekannter Slugbierr:16 eintragenganzer Warenkorb prüfpflichtig, gegen die strengste eingetragene Grenze
Grenze zu schwachmit 16er-Nachweis Gin bestellenKasse zu, auch innerhalb der drei Minuten
Plugin ausdeaktivierenBestellung geht durch, kein Netzaufruf

Die vorletzte Zeile ist kein Fehler, sondern eine Entscheidung: Ein leeres Kategorienfeld heisst «alles prüfen», nicht «nichts prüfen». Für einen Laden, der auch Zubehör ohne Altersgrenze führt, ist das zu weit — deshalb steht es hier, damit es beim Ausprobieren nicht überrascht.

Die Zeile «Schlüssel gewechselt» prüft etwas Feineres: Das Plugin merkt sich das Ergebnis kurz zwischen (edelverify_ok_…, drei Minuten). Wird der Riegel erst nach Ablauf dieser Zeit dicht, gilt der Zwischenspeicher für den falschen Schlüssel — dann muss der Cache-Schlüssel den geheimen Schlüssel einbeziehen. Für die Altersgrenze gilt dasselbe, und die Zeile «Grenze zu schwach» misst es: Der Zwischenspeicher unterscheidet nach verlangter Grenze, sonst öffnete ein «ja» für Bier drei Minuten lang auch den Gin.


8. Was ohne diesen Plan bereits belegt ist

Damit Sie wissen, wo Sie ansetzen und wo nicht:

BehauptungWomit belegt
Jeder angemeldete Haken hat eine Methodepython3 scripts/pakete-pruefen.py woocommerce
Kein Fehlerweg endet in einer Freigabepython3 scripts/pakete-pruefen.py, Abschnitt E
over_18 genügt nirgends allein als Freigabedieselbe Prüfung, Abschnitt J
Die Grenze reist mit — Einlösen, Zwischenspeicher, Vorgabe 18dieselbe Prüfung, Abschnitt K
Die Prüfungen J, K und E schlagen überhaupt noch andieselbe Prüfung, Abschnitt «Selbstprüfung»
Kein geheimer Schlüssel gelangt in den Browserdieselbe Prüfung, Abschnitt F
Alle drei aufgerufenen API-Pfade gibt es wirklichdieselbe Prüfung, Abschnitt G
Die Schnittstelle verhält sich wie beschriebenpython3 scripts/api-vertragstest.py (läuft gegen verify.edelbyte.ch)
16 und 18 verhalten sich wie oben beschriebendieselbe Prüfung, Abschnitt 10
Der Riegel hält im Demo-Shop./scripts/pruefe-shop.sh gegen woocommerce.edelbyte.ch

Was nicht belegt ist und nur dieser Plan klärt: dass es in Ihrem Shop hält — mit Ihrem Theme, Ihren Kategorien, Ihren Zahlungsarten und Ihrem Kassenweg.


9. Was heute noch nicht geht

Damit Sie es hier erfahren und nicht nach der Installation:

  • Zwei Schwellen, nicht mehr. 16 und 18 — das sind die Grenzen, die die staatliche E-ID belegt. Eine 21 gibt es nicht, und ein Feld, in das man sie eintragen könnte, ohne dass sie wirkt, wäre schlimmer als keines.
  • Keine Webhooks. Der Stand wird abgefragt, nicht zugestellt. Prüft die Kundschaft am Handy, während der Rechner-Tab geschlossen ist, erfährt der Shop davon nichts.
  • Ein Nachweis gilt bei einem Shop. Wer mehrere Shops betreibt, braucht je Shop ein eigenes Schlüsselpaar.
  • Noch nicht scharf schalten. Geprüft wird heute gegen die öffentliche Beta des Bundes; dort besitzt nur die Beta-ID einen gültigen Nachweis. Eine richtig gebaute Einbindung blockiert im Zweifel — und blockierte derzeit fast jede Bestellung. Bauen und prüfen Sie mit Testschlüsseln; am Tag der Umstellung tauschen Sie zwei Zeichenfolgen aus, sonst nichts.