Schnittstelle

JSONServerAPI

Der Dienst nimmt HTTP-Anfragen entgegen, prüft Authentisierung und Nutzdaten und leitet aktive Endpunkte an die Portalum-Verarbeitung weiter.

JSONServerAPICashDeskTechnikerEntwickler

Verarbeitungsablauf

  1. jsaService.ctl übernimmt HTTP-Methode, Endpunkt, Header und Body.
  2. OPTIONS, APITEST, KEEPALIVE und AUTHINFO werden als technische Serviceaufrufe behandelt.
  3. Für Fachaufrufe werden API-Key und/oder Basic Authentication entsprechend der Konfiguration geprüft.
  4. Endpunkt, Inhaltslänge und JSON-Struktur werden validiert.
  5. frmJsaMain.frm ordnet den großgeschriebenen Endpunkt dem aktiven Handler zu.
  6. Der Handler prüft fachliche Pflichtfelder, führt die Portalum-Funktion aus und erzeugt JSON.
Geltungsbereich: Routinen mit _old oder einem Versionspräfix sind keine aktiven Endpunkte. Maßgeblich ist das Routing in frmJsaMain.frm.

Technische Aufrufe und Authentisierung

AufrufAntwortZweck
OPTIONSCORS-/Preflight-AntwortBeantwortet die technische Voranfrage eines Clients.
APITESTHTTP 222Prüft Dienst, Routing und technische Erreichbarkeit.
KEEPALIVEHTTP 206 ohne BodyBestätigt die Erreichbarkeit mit minimaler Nutzlast.
GET AUTHINFOAuthentisierungshinweisLiefert Informationen zur erwarteten Authentisierung.

Diese technischen Aufrufe werden vor der Fachauthentisierung behandelt. Fachaufrufe können den Header X-API-Key und/oder den HTTP-Header Authorization: Basic … benötigen. Zugangsdaten und Schlüssel dürfen weder in URLs noch in allgemein zugänglichen Protokollen stehen.

Aktive Fachendpunkte

EndpunktZweckZentrale Eingabe
DBINFODatenbank- und Programmversionenkeine fachlichen Felder
READERLISTReader, Passage, Standort und Zonenkeine fachlichen Felder
PASSAGENLISTPassagen mit Richtung und Standortkeine fachlichen Felder
SESSIONSTARTNeue Verkaufssitzung startenDevice.ID, Device.Name
SESSIONINFOSitzung prüfen und Status meldenGerät und SessionID
SESSIONENDSitzung auswerten oder abschließenSessionID, Closing
ARTIKELLISTVerkäufliche Artikel liefernSessionID, optionale Filter
CARDINFOTicket-/Karteninformation prüfenOID, Barcode oder RFID
VALUECARDINFOWertkarte und Guthaben lesenOID oder CardCode
VALUECARDCHANGEWertkarte laden oder entladenSitzung, Karte, Charge/Discharge
EXECUTESALEArtikel verkaufen, Tickets und Beleg erzeugenSitzung, Items, Zahlung
STOCKCHANGEKassenbestand verändernSitzung, Typ und Betrag

Gemeinsame Datenkonventionen

Werte

  • Geldbeträge werden in JSON als ganzzahlige Centwerte übertragen.
  • Datum und Uhrzeit werden als ISO-Werte ausgegeben.
  • Beleg-Rohdaten werden Base64-codiert geliefert.
  • OID-Felder enthalten interne Portalum-Objektkennungen.

Anfragen

  • Endpunktnamen werden ohne Beachtung der Groß-/Kleinschreibung verarbeitet.
  • Alternative Identifikatoren sind als „genau einer von“ zu verstehen.
  • Pflichtfelder werden vor einer Buchung validiert.
  • Die angegebene Inhaltslänge muss zum Request-Body passen.

Sitzungen

SESSIONSTART

RichtungFeldBedeutung
RequestDevice.IDKennung des aufrufenden Geräts.
RequestDevice.NameBezeichnung des Geräts.
RequestStockOptionaler Anfangsbestand in Cent.
ResponseSession.ID, Session.StartKennung und Startzeit der Sitzung.
ResponseUser.ID, User.NameZugeordneter Portalum-Benutzer.
ResponseStation.ID, Station.NameZugeordnete Verkaufsstation.
{
  "Device": { "ID": "POS-01", "Name": "Webkasse Eingang" },
  "Stock": 25000
}

SESSIONINFO

RichtungFelderBedeutung
RequestDeviceID, DeviceName, SessionIDGerät und zu prüfende Sitzung.
RequestStock, Status, InfoOptionale Bestands- und Statusmeldung des Clients.
ResponseOpenZeigt, ob die Sitzung geöffnet ist.
ResponseSession.EndEnde einer geschlossenen Sitzung.
ResponseStation.*, Session.*, User.*Detaildaten einer offenen Sitzung.

SESSIONEND

RichtungFeldBedeutung
RequestSessionIDZu beendende beziehungsweise auszuwertende Sitzung.
RequestClosingBei true wird die Sitzung abgeschlossen.
RequestStockBei Abschluss übermittelter Endbestand in Cent.
ResponseTurnoverCashBarumsatz in Cent.
ResponseTurnoverElectronicElektronischer Umsatz in Cent.
ResponseClosedBestätigung des Sitzungsabschlusses.
ResponseDebugInfoOptionale technische Zusatzinformation.

Datenbank, Reader, Passagen und Artikel

DBINFO

Die Antwort enthält DB.UUID, DB.Type, DB.Name, DB.Version, DLL Version und App Version. Damit kann ein Client Zielsystem und kompatible Versionen protokollieren.

READERLIST

Jeder Eintrag enthält OID, Name, Passage (Name, OID), Standort (name, OID), Ausgangs- und Zielzone (Zone.From.*, Zone.To.*), Typ (Type.ID, Type.Name) und Reader.

PASSAGENLIST

Jede Passage liefert OID, Caption, Number, Standort (Location.ID, Location.Name) sowie Ausgangs- und Zielzone (FromZone.*, ToZone.*).

ARTIKELLIST

RichtungFelderBedeutung
RequestSessionIDAktive Verkaufssitzung.
RequestOnlyOrderman, OnlyExternOptionale, gegenseitig ausschließende Artikelfilter.
ResponseOID, Caption, ArticleNo, EANCodeIdentifikation und Bezeichnung.
ResponsePrice, Group, ShortCodePreis in Cent und Verkaufszuordnung.
ResponseInfos, AdditionalZusatzinformationen des Artikels.
ResponseTicket.Title1, Ticket.Title2, Ticket.AdvertisementTickettexte.
ResponseIndex.Export, Index.IndividualTechnische Indexwerte.
ResponsePersonalizationrequired oder no.

Ticket- und Wertkarteninformationen

CARDINFO

Die Anfrage muss genau einen geeigneten Identifikator enthalten: OID, Barcode oder RFID. Transaction steuert optional die transaktionsbezogene Behandlung.

GruppeResponsefelder
IdentifikationOID, RFID, Barcode, Referenz
Kunde und HerkunftCustomerOID, Customer, Origin
TicketType, TypeInfo, Title, Artikel, Preis, Tages Aufschlag
GültigkeitValidFrom, ValidTo, Valid, Disabled, Canceled, Blocked
Veranstaltung/SitzOrt, Block, Reihe, Sitz, Tarif und Saisonfelder
ZutrittRecht, Points, IsRFID, CancellationCode, Production

Wird keine Karte gefunden, enthält die Antwort ein entsprechendes Info-Feld.

VALUECARDINFO

Die Anfrage identifiziert die Wertkarte über OID oder CardCode. Die Antwort enthält OID, CardCode, Kunde (Customer.OID, Customer.Name), Title, Value.Min, Value.Max, Credit, AccountNumber, Discounts, IsRFID und Blocked. Bei unbekannter Karte wird Info: Not Found geliefert.

VALUECARDCHANGE

RichtungFelderBedeutung
RequestSessionIDAktive Verkaufssitzung.
RequestOID oder CardCodeGenau eine Wertkartenkennung.
RequestCharge oder DischargeGenau eine Änderung, als Centwert.
RequestPaymentMethod, PaymentCardNumberZahlungsart und gegebenenfalls Kartennummer.
ResponseWertkartendaten, Charge/DischargeAktualisierter Stand und ausgeführte Änderung.
ResponseReceipt.Number, Receipt.Raw, Receipt.RawQRCodeBelegnummer, Base64-Beleg und QR-Daten.

Der Handler prüft Mindest-/Höchstwerte, Sperren und den zulässigen Kredit, bevor er die Buchung ausführt.

Verkauf und Bestand

EXECUTESALE

RichtungFelderBedeutung
RequestSessionIDAktive Verkaufssitzung.
RequestItems[].OID, Items[].Amount, Items[].PriceArtikel, Menge und Preis in Cent.
RequestPaymentValue, PaymentMethodZahlbetrag in Cent und Zahlungsart.
RequestPaymentCardType, PaymentCardName, PaymentCardNumberOptionale Angaben einer Kartenzahlung.
ResponseTickets[].OID, Referenz, BarcodeErzeugte Tickets.
ResponseReceipt.Number, Receipt.Raw, Receipt.RawQRCodeBelegnummer, Base64-Beleg und QR-Daten.
ResponseBonPrinter, TicketPrinterFür Beleg und Tickets vorgesehene Drucker.
{
  "SessionID": 4711,
  "Items": [
    { "OID": 1001, "Amount": 2, "Price": 1250 }
  ],
  "PaymentValue": 2500,
  "PaymentMethod": "CASH"
}

STOCKCHANGE

Die Anfrage enthält SessionID, Type und Amount in Cent. Die Antwort liefert Success, Session.ID, Session.Name, Type, Amount und Info.

Antwort- und Fehlerbehandlung

SituationTypische Antwort
Authentisierung fehlt oder ist ungültigHTTP 401 mit einem Servicefehler unter error.
Endpunkt fehltHTTP 400 mit verständlicher Meldung.
Inhaltslänge passt nichtHTTP 400; Request wird nicht an den Fachhandler übergeben.
Endpunkt ist unbekanntHTTP 404 aus dem aktiven Router.
Fachfeld fehlt oder ist ungültigStruktur mit Code, Message, Number, Description und Source.
{
  "Code": 406,
  "Message": "Fachliche Prüfung fehlgeschlagen",
  "Number": 0,
  "Description": "Beschreibung der Ursache",
  "Source": "RequestExecuteSale"
}
{
  "error": {
    "code": 401,
    "message": "Authentisierung erforderlich"
  }
}

Clients müssen deshalb sowohl HTTP-Statuscodes als auch beide JSON-Fehlerformen auswerten. Ein HTTP-Erfolg allein bestätigt noch keine erfolgreiche Fachbuchung.

Technische Prüfung

  1. Mit APITEST die Erreichbarkeit des Diensts prüfen.
  2. Mit AUTHINFO die erwartete Authentisierung ermitteln.
  3. Header, Endpunkt, Content-Type und Inhaltslänge protokollieren, sensible Werte dabei maskieren.
  4. Eine Sitzung starten und die zurückgegebene Session.ID für nachfolgende Aufrufe verwenden.
  5. Beträge als Centwerte senden und Base64-Belege vor der Nutzung dekodieren.
  6. Sitzungen kontrolliert mit SESSIONEND abschließen.

Quellfundstellen

DateiVerantwortung
Frontends\Portalum\JsonServerAPI\jsaService.ctlHTTP-Kommunikation, technische Endpunkte, CORS, Authentisierung und Vorprüfung.
Frontends\Portalum\JsonServerAPI\frmJsaMain.frmAktives Routing und fachliche Request-Handler.
Frontends\Portalum\JsonServerAPI\ProcessJsonData.clsJSON-Verarbeitung und fachliche Hilfsfunktionen.
Frontends\Portalum\JsonServerAPI\clsRequest.clsAnfrageobjekt, Header und Nutzdaten.