Allgemein
Da es zur Programmierung von Registrierkassen gemäß der Registrierkassensicherheitsverordnung (RKSV) in PHP fast keine brauchbare Dokumentation und sehr wenige Beispiele gibt, habe ich mir gedacht, auf meinem Blog konkrete Informationen dazu bereitzustellen.
Ich werde daher nach und nach Code-Beispiele und Funktionen präsentieren, die man 1:1 wiederverwenden kann.
Hier sind alle bisher zum Thema verfassten Beiträge:
- AES256_ENCODE()
- BASE64_DECODE_URL()
- BASE64_ENCODE_URL()
- Belege-Prüftool
- CHAINVALUE_HASH()
- DEP-Export
- Payload
Funktionsweise
Um einen Beleg zu signieren, muss zuerst der aktuelle Umsatz aus der Kasse geladen und mit AES256_ENCODE() verschlüsselt werden. Dann muss die Payload gebildet werden, welche an die jeweilige API (zB die von A-Trust) gesendet wird. Sie gibt den JWS-String zurück („eyJhbGciOiJFUzI1NiJ9.xxx.aaa“). Falls kein gültiger Wert zurückgegeben wird, muss dieser JWS-String mit BASE64_ENCODE_URL() nachgebildet werden. Mit dem JWS-String muss zum in weiterer Folge der Verkettungswert mit CHAINVALUE_HASH() gehasht werden. Am Schluss muss auch noch der dritte Teil des JWS-Strings mit BASE64_DECODE_URL() und BASE64_ENCODE() aufbereitet werden, um auf dem Beleg gemeinsam mit der Payload, die an die API gesendet wurde, als QR-Code abgebildet zu werden. Ob die Registrierkasse richtig funktioniert, kann man insbesondere durch den DEP-Export der Registrierkassendaten und das Einspielen dieser in das Belege-Prüftool des Bundesministeriums für Finanzen prüfen. Der letzte Teil des QR-Codes wird mit dem Tool nicht validiert. Daher unbedingt darauf achten, dass am ende der Payload nach dem letzten „_“ ein gültiger Base-64-String ist. Wenn er so ähnlich aussieht, wie der letzte Teil des JWS-Strings, ist er gültig (siehe Beispiel in BASE64_DECODE()).