Wydruk WEB‎ > ‎

JSON Post

W tym dokumencie zamierzam opisać w jaki sposób można użyć serwera wydruku fiskalnego do współpracy z innymi systemami z wykorzystaniem protokołu HTTP i standardu JSON. W takiej sytuacji mamy do czynienia z Serwerem Wydruku Fiskalnego pracującego jako samodzielna aplikacja (najczęściej na jakimś serwerze). Serwer Wydruku Fiskalnego dostępny jest dla aplikacji zewnętrznych jako usługa dostępna poprzez protokół HTTP, pod URLem podobnym do: http://localhost:8080/fps/printSlip.

Wykorzystując standard JSON oraz mechanizm POST protokołu HTTP przekazujemy do Serwera Wydruku Fiskalnego zlecenia wydrukowania paragonów.
Poniżej prezentuję przykładowy kod niezbędny do zlecenia wydrukowania paragonu. Jest to implementacja prostego klienta HTTP, który wykoanuje POST do Serwera Wydruku Fiskalnego:

package name.prokop.bart.fps.server;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import name.prokop.bart.fps.datamodel.Slip;
import org.eclipse.jetty.client.ContentExchange;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.HttpExchange;

public class FiscalPrinterServletDemo {

    public static void main(String... args) throws Exception {
        HttpClient client = new HttpClient();
        client.start();

        HttpExchange httpExchange = new MyExchange();
        httpExchange.setURL("http://localhost:8080/fps/printSlip");
        httpExchange.setRequestHeader("fiscalPrinterType", "DFEmul");
        httpExchange.setRequestHeader("comPort", "COM3");

        ByteArrayInputStream bais = new ByteArrayInputStream(Slip.getTestSlip().toJSONObject().toString().getBytes());
        httpExchange.setRequestContentSource(bais);
        httpExchange.setMethod("POST");
        httpExchange.setRequestContentType("application/json");

        client.send(httpExchange);

        // we expact HTTP status 200 here
        System.out.println(httpExchange.waitForDone());
    }

    private static class MyExchange extends ContentExchange {

        @Override
        protected void onResponseComplete() throws IOException {
            // Show the response from FPS HTTP Server
            System.out.println(getResponseContent());
        }
    }
}

Oczywiście w tej sytuacji najistotniejsze jest zbudowanie poprawnego dokumentu JSON opisującego paragon fiskalny oraz odpowiednie określenie jakiego drivera/portu szeregowego należy użyć aby wydrukować paragon. Sterowanie serwerem odbywa się poprzez ustawienie odpowiednich nagłówków w requescie HTTP (nie używamy parametrów, ponieważ content komunikatu post używany jest przez JSONa). Używamy dwóch tekstowych nagłówków: fiscalPrinterType, podając wartość odpowiadającą sterownikowi drukarki fiskalnej oraz comPort, podając port szeregowy do którego podłączona jest drukarka. Przykładowe użycie widzieliśmy powyżej w listingu programu.

Przykładowy JSON opisujący paragon wygląda następująco (celowo wybrałem możliwie długi przykład):

{
   "cashbox": "BP01",
   "cashierName": "Bart Prokop",
   "created": 1356119571232,
   "errorNote": "Nowy",
   "printingState": "Created",
   "reference": "R-k 645033",
   "slipLines": [
      {
         "amount": 40.27,
         "discount": 0,
         "discountType": "NoDiscount",
         "name": "Losowy1",
         "price": 99.99,
         "taxRate": "VAT23"
      },
      {
         "amount": 54.67,
         "discount": 0,
         "discountType": "NoDiscount",
         "name": "Losowy2",
         "price": 14.06,
         "taxRate": "VAT23"
      },
      {
         "amount": 0.08,
         "discount": 5.1,
         "discountType": "AmountDiscount",
         "name": "Losowy RABAT",
         "price": 64.01,
         "taxRate": "VAT23"
      },
      {
         "amount": 9.99,
         "discount": 0,
         "discountType": "NoDiscount",
         "name": "Losowy3",
         "price": 40.11,
         "taxRate": "VAT23"
      },
      {
         "amount": 0.3999,
         "discount": 0,
         "discountType": "NoDiscount",
         "name": "Losowy4",
         "price": 86.11,
         "taxRate": "VAT08"
      },
      {
         "amount": 0.6682,
         "discount": 0,
         "discountType": "NoDiscount",
         "name": "Losowy4",
         "price": 41.03,
         "taxRate": "VAT08"
      },
      {
         "amount": 0.6462,
         "discount": 0,
         "discountType": "NoDiscount",
         "name": "Losowy4",
         "price": 54.03,
         "taxRate": "VAT08"
      },
      {
         "amount": 0.3436,
         "discount": 0,
         "discountType": "NoDiscount",
         "name": "Losowy4",
         "price": 71.74,
         "taxRate": "VAT08"
      },
      {
         "amount": 0.8619,
         "discount": 0,
         "discountType": "NoDiscount",
         "name": "LosowyZERO",
         "price": 54.64,
         "taxRate": "VAT00"
      },
      {
         "amount": 0.8599,
         "discount": 0,
         "discountType": "NoDiscount",
         "name": "LosowyZW",
         "price": 28.89,
         "taxRate": "VATzw"
      },
      {
         "amount": 86.74,
         "discount": 0,
         "discountType": "NoDiscount",
         "name": "Losowy1",
         "price": 99.99,
         "taxRate": "VAT23"
      },
      {
         "amount": 50.94,
         "discount": 0,
         "discountType": "NoDiscount",
         "name": "Losowy2",
         "price": 54.84,
         "taxRate": "VAT23"
      },
      {
         "amount": 99.07,
         "discount": 7.97,
         "discountType": "AmountDiscount",
         "name": "Losowy RABAT",
         "price": 67.28,
         "taxRate": "VAT23"
      },
      {
         "amount": 9.99,
         "discount": 0,
         "discountType": "NoDiscount",
         "name": "Losowy3",
         "price": 9.129999999999999,
         "taxRate": "VAT23"
      },
      {
         "amount": 0.6828,
         "discount": 0,
         "discountType": "NoDiscount",
         "name": "Losowy4",
         "price": 73.51,
         "taxRate": "VAT08"
      },
      {
         "amount": 0.9471,
         "discount": 0,
         "discountType": "NoDiscount",
         "name": "Losowy4",
         "price": 7.13,
         "taxRate": "VAT08"
      },
      {
         "amount": 0.4117,
         "discount": 0,
         "discountType": "NoDiscount",
         "name": "Losowy4",
         "price": 4.01,
         "taxRate": "VAT08"
      },
      {
         "amount": 0.4595,
         "discount": 0,
         "discountType": "NoDiscount",
         "name": "Losowy4",
         "price": 97.88,
         "taxRate": "VAT08"
      },
      {
         "amount": 0.852,
         "discount": 0,
         "discountType": "NoDiscount",
         "name": "LosowyZERO",
         "price": 38.12,
         "taxRate": "VAT00"
      },
      {
         "amount": 0.304,
         "discount": 0,
         "discountType": "NoDiscount",
         "name": "LosowyZW",
         "price": 21.82,
         "taxRate": "VATzw"
      }
   ],
   "slipPayments": [{
      "amount": 23747.36,
      "name": "Karnet 653214",
      "type": "Voucher"
   }]
}

Jest to najprostszy sposób wykorzystania serwera wydruku. Skuteczny np. w sytuacji gdy mamy sieć LAN i kilkanaście aplikacji działających w przeglądarce, współdzielących drukarkę fiskalną.
Comments