====== kassensichv.rest ====== → [[lyx_-_programmiersprache:units:kassensichv|Zurück zur KassenSichV-Übersicht]] Cloud-TSE-Anbindung über HTTPS/REST. Unterstützt Fiskaly, Deutsche Fiskal und kompatible APIs. TLS 1.2 mindestens erzwungen. Automatische Retry-Logik bei Server-Fehlern. API-Key wird nie geloggt. ===== Import ===== import kassensichv.types; import kassensichv.rest; import kassensichv.manager; ===== Erzeugen ===== pub fn TseRestNew(configJson: int64): int64; // configJson: pchar mit JSON-Konfiguration (Pflichtfelder — siehe unten) // Gibt TseManager-Handle zurück (allokiert) // Bei fehlenden Pflichtfeldern: success=0 im ersten TseProcessBeleg (code=400) // Mit TseManagerFree() freigeben ===== Konfiguration ===== Das JSON-Konfigurationsobjekt wird beim Erstellen des Managers übergeben. **Pflichtfelder:** ^ Feld ^ Typ ^ Beschreibung ^ | ''api_url'' | string | Basis-URL der TSE-API ohne trailing Slash | | ''api_key'' | string | Bearer-Token — wird nie geloggt (nur erste 4 Zeichen in Logs) | | ''client_id'' | string | Kassen-ID beim Cloud-Anbieter | **Optionale Felder:** ^ Feld ^ Standard ^ Beschreibung ^ | ''connect_timeout_ms'' | 5000 | TCP-Verbindungs-Timeout in Millisekunden | | ''read_timeout_ms'' | 10000 | Antwort-Timeout (TSE-Signier-Vorgang kann langsam sein) | ===== Beispiel: Fiskaly ===== import kassensichv.types; import kassensichv.rest; import kassensichv.manager; fn main(): int64 { var cfg: pchar := concat( "{\"api_url\":\"https://kassensichv.io/api/v1\","c, "\"api_key\":\"\","c, "\"client_id\":\"KASSE-001\"}"c ); var mgr: int64 := TseRestNew(cfg as int64); var beleg: BelegDaten; beleg.prozessTyp := PROZESSTYP_KASSENBELEG; beleg.kassenNr := "KASSE-001"c; beleg.prozessDaten := "Kaffee;2.50_0.00_0.00_0.00_0.00"c; beleg.umsatz := 250; var sig: int64 := TseProcessBeleg(mgr, addr beleg); var s: SigErgebnis := (sig as *SigErgebnis)^; if s.success == 1 then { PrintLn(s.qrCode as pchar); } else { Print("Fehler: "c); PrintLn(s.errorMsg as pchar); } SigErgebnisFree(sig); TseManagerFree(mgr); return 0; } ===== Retry-Verhalten ===== Bei HTTP 503 oder 504 wiederholt der Provider den Request automatisch mit exponentiellem Backoff: | Versuch | Wartezeit | |---|---| | 1 | sofort | | 2 | 1 Sekunde | | 3 | 2 Sekunden | | nach 3 Versuchen | ''ETseConnectionError'' (code=503) | Bei anderen HTTP-Fehlercodes (400, 401, 404, 500) wird **kein** Retry durchgeführt. ===== TLS-Sicherheit ===== Der REST-Provider erzwingt mindestens **TLS 1.2**. Verbindungen mit älteren Protokollen werden abgelehnt. Dies entspricht der KassenSichV-Anforderung für sichere Kommunikation mit Cloud-TSEs. ===== Unterstützte Provider ===== ^ Anbieter ^ api_url ^ Anmerkung ^ | Fiskaly | ''https://kassensichv.io/api/v1'' | Häufigster Cloud-TSE-Anbieter in DE | | Deutsche Fiskal | ''https://api.fiscal.de/v1'' | BSI-zertifiziert | | Kompatible APIs | beliebig | Müssen das Fiskaly-REST-Schema implementieren | ===== API-Mapping ===== Intern werden folgende REST-Aufrufe verwendet: ^ Operation ^ HTTP-Methode ^ Pfad ^ | ''TseOpenBeleg'' | POST | ''/tx'' | | ''TseUpdateBeleg'' | POST | ''/tx/{transId}'' | | ''TseCloseBeleg'' | POST | ''/tx/{transId}'' (mit state=FINISHED) | | ''TseExportAuditData'' | GET | ''/export/{client_id}'' | | ''TseGetStatus'' | GET | ''/status/{client_id}'' | | ''TseGetSerial'' | GET | ''/tss/{client_id}'' | Alle Requests tragen den ''Authorization: Bearer {api_key}''-Header. Der API-Key erscheint **nie** in Logs. ===== Wechsel zwischen Sandbox und Produktion ===== // Entwicklung / Test gegen Fiskaly-Sandbox var cfgDev: pchar := "{\"api_url\":\"https://kassensichv.io/api/v1\",...}"c; // Produktion var cfgProd: pchar := "{\"api_url\":\"https://kassensichv.io/api/v1\",...}"c; // (gleiche URL, aber mit Produktions-API-Key und tatsächlicher Kassen-ID) Fiskaly unterscheidet Sandbox und Produktion über den API-Key, nicht die URL. Andere Anbieter können separate URLs für Test und Produktion haben. ----- Letzte Aktualisierung: 2026-06-12