Авторизація

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

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

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

Так виглядає блок схема того, як сервер 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. Якщо після перепідключення сервер одразу дисконнектить - то треба розірвати існуюче зʼєднання, і створити нове

circle-exclamation

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

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

wss://api.shaketopay.com.ua/restaurantEntryPoint
chevron-rightПриклад з'єднання через websockethashtag
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. Результат роботи алгоритму помістити у значення параметра.

chevron-rightПриклад генерації підпису та додавання її в заголовок signaturehashtag

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

circle-info

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


Last updated