💟
Expirenza
На головнуДо кабінету
  • Про Expirenza
  • Підключення закладу
    • Подати заявку
    • Приєднання до оферти
    • Технiчне підключення
      • r_keeper
        • Останні зміни
      • Poster
      • Syrve
        • Оновлення плагіна
        • Друк QR-коду на пречеку
        • Програма лояльності Expirenza
        • Останні зміни
      • SmartTouch
      • BarBoss
      • SkyService
      • Інші POS-системи
    • Операційна готовність
    • Тестова оплата
    • Підготовка до запуску
  • Налаштування роботи
    • Додавання офіціанта
      • В Poster
      • В Syrve
      • В r_keeper
      • В SmartTouch
      • B BarBoss
      • В SkyService
      • В інші POS-системи
    • Доставка
      • Налаштування Syrve Office / Syrve HQ
      • Налаштування r_keeper
      • Налаштування Poster
    • 🆕Самовивіз
    • Розділення рахунку (Split Bill)
    • Бронювання столика
    • Expirenza Гості (CRM)
    • Замовляй та плати
    • Програма Лояльності
    • Таємні Бокси
  • Підтримка POS-систем
  • API для інших POS-систем
    • Інтеграція нових POS-систем
      • Підготовка до інтеграції
      • Технічна інтеграція
      • Тестування технічної інтеграції
    • Схема роботи з AПІ
    • Авторизація
    • Операції між Expirenza і POS системою
      • Отримання рахунку за номером стола
      • Оплата рахунку і закриття замовлення
      • Отримання списку персоналу
      • Отримання категорій
      • Отримання інформації про столи ресторану
      • Отримання переліку залів у ресторані
      • Отримання налаштувань для відображення QR на ПреЧек
      • Замовлення в меню
      • Розділення рахунку (Split Bill)
      • Отримання стоп-листів
      • Повідомлення у POS-систему
      • Кешування рахунків
      • Результати інших повідомлень від POS системи
    • Підключення за допомогою Postman
    • Поширені питання (FAQ)
  • ПУБЛІЧНЕ АПІ
    • Webhook отримання оновлень по Боксам
  • Корисні посилання
    • Instagram
    • Telegram
    • Youtube
  • Підтримка
    • Telegram
Powered by GitBook
On this page
  • Встановлення WebSocket з'єднання
  • Валідація запиту
  1. API для інших POS-систем

Авторизація

PreviousСхема роботи з AПІNextОперації між Expirenza і POS системою

Last updated 7 months ago

Встановлення WebSocket з'єднання

З'єднання від POS-системи до API Expirenza виконується за допомогою WebSocket.

Під час реалізації WebSocket необхідно налаштовувати повторні спроби з'єднання з сервером Expirenza не частіше ніж раз на 15 секунд.

Як реалізувати з'єднання правильно на боці інтеграції?

Так виглядає блок схема того, як сервер Expirenza опитує POS-систему для утримання зʼєднання:

  1. Expirenza посилає ping у сокет раз в 15 секунд

  2. Очікує наявність pong у наступні 1.5 хвилини

  3. Якщо pong не було отримано за 1.5 хвилини - Expirenza розриває з'єднання

POS-системи мають перевіряти (не частіше ніж раз у 15 секунд):

  1. Якщо з'єднання немає — намагається під'єднатися,

  2. Якщо з'єднання є — перевіряє, коли був останній pong від сервера на ping від інтеграції,

  3. Якщо пройшло більше ніж 1,5 хвилини — значить, щось не так із з'єднанням, розриває його(останній коннект) і намагається під'єднатися ще раз,

  4. Якщо з'єднання є і останній ping був менш ніж 1,5 хвилини тому, значить все добре — інтеграція відправляє pong

  5. Якщо після перепідключення сервер одразу дисконнектить - то треба розірвати існуюче зʼєднання, і створити нове

Headers. Обов'язкова умова передавати наступний хідер, якщо не передати - авторизація не буде працювати. cookie: system={{API}}; Де {{API}} - назва вашої POS системи.

Запит на встановлення з'єднання відправляється на адресу з використанням Basic Auth.

Адреса запиту:

wss://api.shaketopay.com.ua/restaurantEntryPoint
Приклад з'єднання через websocket
Java
import javax.websocket.*;
import javax.websocket.ClientEndpointConfig.Builder;
import javax.websocket.ClientEndpointConfig.Configurator;
import javax.xml.bind.DatatypeConverter;

private final WebsocketEndpoint websocketEndpoint;
private final ClientEndpointConfig clientConfig;
private final URI uri;

    Builder configBuilder = Builder.create();
    String authHeaderValue = "Basic " + DatatypeConverter.printBase64Binary((user + ":" + password).getBytes());
    configBuilder.configurator(new Configurator() {
        @Override
        public void beforeRequest(Map<String, List<String>> headers) {
            headers.put("Authorization", Arrays.asList(authHeaderValue));
        }
    });
    clientConfig = configBuilder.build();
    this.uri = new URI(uri);
    this.websocketEndpoint = new WebsocketEndpoint(messageHandler, new        EventListenerI() {
        @Override
        public void notify(Object o) {
            connected = false;
        }
    });
)

void connect() throws IOException {
    WebSocketContainer container = ContainerProvider.getWebSocketContainer();
    container.connectToServer(websocketEndpoint, clientConfig, uri);
}

void sendMessage(String message) throws IOException {
    websocketEndpoint.session.getBasicRemote().sendText(message);
}
...

Валідація запиту

На стороні Expirenza буде проведена перевірка справжності запиту після надсилання даних від ресторану.

Для проходження перевірки на стороні ПЗ ресторану в заголовках кожного запиту повинні міститися параметри signatureта restoId.

  1. Тіло запиту необхідно підписати алгоритмом HmacSHA256.

  2. Результат роботи алгоритму помістити у значення параметра.

Приклад генерації підпису та додавання її в заголовок signature
JAVA
String signValue = makeSignature(dataBytes);

ResponseEntity<String> bodyEntity = webClient.post()
.uri(urlPart).body(BodyInserters.fromValue(dataBytes))
.header("signature", signValue).retrieve()
.toEntity(String.class).block();

private String makeSignature(byte[] bytes) throws InvalidKeyException, NoSuchAlgorithmException {
    Mac hasher = Mac.getInstance("HmacSHA256");
    hasher.init(new SecretKeySpec(secretKey.getBytes(), "HmacSHA256"));
    byte[] hash = hasher.doFinal(bytes);
    return DatatypeConverter.printBase64Binary(hash);
}

Де secretKey - це SECRET_KEY з файлу properties.txt


Передати у параметр RESTO_ID з файлу налаштувань

Приклад підключення за допомогою .

properties.txt
Postman