Как я могу подтвердить доставку?
Вычислите HMAC-SHA256 по необработанному телу запроса с использованием секрета вашей подписки и сравните результат в константном времени со значением заголовка X-PaperOffice-Signature (формат sha256=<hex>). Если подпись не совпадает, ответьте HTTP 401 и не обрабатывайте тело.
Откуда берется секрет?
При создании подписки через POST /latest/webhooks/subscribe оставьте поле secret пустым, и PaperOffice сгенерирует секретный ключ, который будет возвращен однократно в ответе. Вы можете заменить его в любое время с помощью POST /latest/webhooks/update.
Что происходит, если мой конечный пункт не отвечает?
Любой ответ, отличный от HTTP 2xx, или таймаут считаются неудачной попыткой. В зависимости от политики повторных попыток (экспоненциальная, линейная, без повторов) PaperOffice повторяет доставку до установленного количества повторений (0–10, по умолчанию 5). Каждая попытка фиксируется в журнале доставки вместе со статус-кодом, ответом и замером времени.
Может ли одна и та же доставка прийти дважды?
Да, это возможно при повторных попытках после таймаута. Поэтому дублирование следует устранять с помощью заголовка X-PaperOffice-Event-ID: ID уникальна для каждого события и подходит в качестве ключа идемпотентности в вашей базе данных.
Какие события я могу подписать?
22 типа событий из четырех групп: Документы, Задания, Рабочие пространства и Задачи. Вы можете подписаться на отдельные события или использовать подстановочный знак * для всех. С помощью фильтров (например, workspace_id или pofid) можно дополнительно ограничить подписку.
В каком тарифном плане включены вебхуки?
Вебхуки доступны начиная с плана Professional. Какой план подходит для вашей конфигурации, показано в таблице цен.
Как таблицы передаются в вебхуке?
Для полей таблиц (например, значений инспекции или строк позиций) document.processed также содержит data.extracted_tables. Его список tables хранит одну запись для каждого поля таблицы с key, label, columns и rows; каждая ячейка имеет value (число, если PaperOffice прочитало число, иначе текст в том виде, в каком он был напечатан) и value_raw (текст в том виде, в каком он был напечатан, или null, если это неизвестно). extracted_fields остается неизменным. Каждая доставка содержит не более 50 таблиц с до 1 000 строк и 40 столбцов каждая, по 2 000 символов на ячейку и до 512 КБ для всех таблиц вместе; если что-то было обрезано, truncated равно true, а row_count указывает полное количество строк. Подпись охватывает все тело запроса, включая extracted_tables.
Что нового в событии document.processed?
Новое: key_fields теперь также содержит document_number (например, номер счета) и publisher (сторону, выдавшую документ), если PaperOffice их прочитал. Позиции поступают в виде таблицы в data.extracted_tables: таблица с key __document__content__extraction__line_items (для полей агента: _line_items) содержит одну строку на каждую позицию.