PHPackages                             agoalofalife/fnsapi - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. agoalofalife/fnsapi

ActiveLibrary[API Development](/categories/api)

agoalofalife/fnsapi
===================

Взаимодействие с API ФНС по протоколу SOAP(кассовые чеки)

v1.2.1(5y ago)5382[1 issues](https://github.com/agoalofalife/fnsapi/issues)MITPHPPHP &gt;=7.1.0CI failing

Since Jan 7Pushed 4y ago2 watchersCompare

[ Source](https://github.com/agoalofalife/fnsapi)[ Packagist](https://packagist.org/packages/agoalofalife/fnsapi)[ Fund](https://money.yandex.ru/to/410019109036855)[ RSS](/packages/agoalofalife-fnsapi/feed)WikiDiscussions master Synced today

READMEChangelog (10)Dependencies (5)Versions (15)Used By (0)

Fns API SOAP
============

[](#fns-api-soap)

 [![](https://camo.githubusercontent.com/8cb79a8216a8d1d3e192272daff5e2fec93e1ca2bd70b5aadb6e0f610073f50a/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f61676f616c6f66616c6966652f666e736170692f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/agoalofalife/fnsapi/?branch=master)

Пакет предоставляет возможность работы по проверке чеков через [официальное API](https://www.nalog.ru/files/kkt/pdf/%D0%A2%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5%20%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D1%8F%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F.pdf) ФНС (Федеральной Налоговая службы России).

- [Установка](#Installation)
- [Аутентификация](#auth)
- [Создать Ticket (кассовый чек)](#create_ticket)
- [Создание SOAP Client](#create_soap_client)
- [Проверка или информация по чеку](#check_or_info_ticket)
- [Response в готовой структуре](#response_in_strucutre)
- [Алгоритмы обработки timeout](#strategy_timout)
- [Дополнительная информация от автора](#note_from_author)
- [Угостить чаем 😌](#donate)

Установка
---------

[](#установка)

`composer require agoalofalife/fnsapi`

Аутентификация
--------------

[](#аутентификация)

Для начала работы с сервисом, вам необходимо получить временный токен. На момент написания документации, время его жизни был один час.

```
$cachePSR16 = new Sarahman\SimpleCache\FileSystemCache(__DIR__);
$master_token = 'ourMasterToken';
$auth = new Fns\Auth\AuthRequest($master_token, $cachePSR16);
$auth->authenticate();
```

Вам надо передать мастер токен, который выдали в ФНС и хранилище, которое реализует PSR-16.

В хранилище будет своевременно обновляться новый токен, [который реализуется в PSR-16](https://github.com/php-fig/simple-cache/blob/master/src/CacheInterface.php#L34) параметром ttl.

PSR-16 позволяет использовать пакет во многих современных фреймворках и т.д

Класс имеет исключение UnexpectedValueException в случае если токен не будет получен.

#### Временная зона

[](#временная-зона)

Время жизни токена устанавливается в соответствии с вашей настройкой [PHP: Настройка во время выполнения - Manual](https://www.php.net/manual/ru/datetime.configuration.php#ini.date.timezone)date.timezone Рекомендуется проверить ваш файл php.ini и установить соответствующую временную зону.

Создать Ticket (кассовый чек)
-----------------------------

[](#создать-ticket-кассовый-чек)

Для того чтобы получить информацию по чеку, вам надо создать объект класса `Ticket`Подробнее о данных написано в коде и официальной документации ФНС.

```
$ticket = new \Fns\Ticket();
$ticket->setDate('2019-12-16T12:22:00');
$ticket->setFiscalDocumentId(11222);
$ticket->setFiscalSign(111111122);
$ticket->setFn(1234000123440000);
$ticket->setSum(11220);
$ticket->setTypeOperation(1);
// случайные данные
```

Создание SOAP Client
--------------------

[](#создание-soap-client)

Отлично мы создали чек и заполнили его данными. Теперь надо создать SOAP client. Это очень осведомленный клиент, он знает что мы работает с ФНС, поэтому он требует:

- Уникальную строку, для сессии. Это строка будет кодироваться в base64(который примерно на 30% увеличивают длину), не должна превышать 160 символов.
- И то же хранилище данных, PSR-16, тот созданный объект, который передавался для получения временного токена.
- Включить режим debug(по-умолчанию false), можно просматривать запросы с помощью таких методов как `__getLastRequest` и так далее.

```
$client = new \Fns\ClientSoap('uniqueStringOrNumber', $cache);
```

Проверка или информация по чеку
-------------------------------

[](#проверка-или-информация-по-чеку)

Отлично, вы создали чек и клиента. И уже все готово для работы! Осталось уже выбрать:

- Проверить чек `\Fns\GetMessage\CheckTicketRequest`
- Получить по нему подробную информацию `\Fns\GetMessage\GetTicketRequest`

```
Для справки
API ФНС реализованно через асинхроннсть.
Для начала вам надо отправить запрос для получения `MessageId`
с информацией по чеку и типом(проверка или полной информацией по чеку)
Далее новым запросом с  `MessageId` получить информацию.

Нюанс заключается в том, что последующий запрос, имеет время исполнения и сетевые задержки.
К примеру вы можете получить информацию по `MessageId` в течении 60 секунд.
Для своей реализации обработки timeout читайте в разделе  Алгоритмы обработки timeout

```

- создание обьекта с типом запроса
- Внедрить свою стратегию обработки timeout реализующий интерфейс `Fns\Contracts\TimeoutStrategyHandler`
- Создать объект `SendMessageRequest` передать клиента которого мы создали ранее и объект конкретного запроса.
- Передать чек
- И выполнить запрос `execute` который возвращает интерфейс `ResponseSendMessage`
- Получить информацию по запросу код и тело ответа.

```
$message = new \Fns\GetMessage\GetTicketRequest();
$message->setTimeoutStrategy(new ExponentialBackoff($message));
// можно установить свое максимальное значение time out
$message->setTimeoutStrategy(new ExponentialBackoff($message), 600000000);

$request = new SendMessageRequest($client, $message);
$request->setTicket($ticket);
$response = $request->execute();

if ($response->getCode() === 200) {
    dump(json_decode($response->getBody()));
    // или получить в виде структуры
    $response->getReceipt();
}
```

Ответ возвращается в json или в обекте Receipt.

#### Response в готовой структуре

[](#response-в-готовой-структуре)

Ответ по чеку можно получить в виде готовой структуры, которая содержит:

- Класс Receipt
- Класс ProductCollection
- Класс Product

и решает такие проблемы как:

- Более явное получение данных
- Инкапсуляция преобразования их для более простой модификации и безболезности в клиентском коде.

но вы всегда можете получить сырой вариант.

#### Проверка чека CheckTicketRequest

[](#проверка-чека--checkticketrequest)

Для получения информации что чек корректен, достаточно сравнить код ответа с кодом 200.

```
Из старой документации
если 200, то "Отправленные данные корректны"
если 400, то "Формат отправленных данных некорректен"
если 406, то "Данные не прошли проверку"
если 503, то "Сервис недоступен".

```

#### Получении информации по чеку GetTicketRequest

[](#получении-информации-по-чеку-getticketrequest)

```
Из старой документации
Содержимое ФД, если код возврата равен 200
если 400, то "Формат отправленных данных некорректен"
если 404, то "Чек не найден"
если 406, то "Данные не прошли проверку"
если 453, то "Чек неккоректен".

```

```
Из нового сервиса опытным путем:
452 - Запрос не соответствует формату hsm
454 - Обращение к hsm было произведено и получен отрицательный результат проверки
455 - Не найдены данные в сервисе поиска чека
531 - "" (Происходит когда были отпроавлены неккоректные данные)

528 - Фискальный признак не может быть проверен, поскольку в hsm отсутствует необходимый ключ
531 - "" (Происходит когда были отпроавлены неккоректные данные)

```

```
После обновления API пока не предоставлен конечный список ответов!

```

Алгоритмы обработки timeout
---------------------------

[](#алгоритмы-обработки-timeout)

Чтобы получить информацию по чеку, надо сделать запрос `SendMessageRequest` c параметром `messageId`При первом(вторым и т.д) запросе, сразу после получения `messageId`, может отсутствовать информацию по чеку. По-умолчанию в пакете реализовывается [Exponential Backoff](https://ru.wikipedia.org/wiki/%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5)

Вы можете реализовать свой алгоритм реализуя интерфейс `Fns\Contracts\TimeoutStrategyHandler\TimeoutStrategyHandler`

Для контроля процесса выполнения запроса и его результата, передайте в конструктор `Fns\Contracts\RequestsManager`

Для примера вы можете реализовать свой алгоритм `Interval`Который будет опрашивать сервер через константный промежуток времени.

Дополнительная информация от автора
-----------------------------------

[](#дополнительная-информация-от-автора)

В данный момент все выполняется в синхронном режиме. Можно разделить процесс получения `messageId` и информации по нему, на два различных процесса. Для начальной версии пакета, пока остаётся так.

Угостить чаем 😌
---------------

[](#угостить-чаем-)

Этот пакет был создан для экономии вашего времени на безвозмездной основе. Надеюсь у меня получилось это сделать и я буду рад любым формам спасибо. Звезда или скромный донат - окажут мне поддержку и веру в людей.

###  Health Score

27

—

LowBetter than 49% of packages

Maintenance16

Infrequent updates — may be unmaintained

Popularity14

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity59

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~33 days

Total

14

Last Release

1880d ago

Major Versions

v0.3.0 → v1.0.02020-11-20

### Community

Maintainers

![](https://www.gravatar.com/avatar/de0b1f6d64571d925fd7580acf7f99394511ad98c4befd6d2d9e1ef64ea1ea8e?d=identicon)[agoalofalife](/maintainers/agoalofalife)

---

Top Contributors

[![agoalofalife](https://avatars.githubusercontent.com/u/15719824?v=4)](https://github.com/agoalofalife "agoalofalife (65 commits)")

---

Tags

fnssoapsoapfns

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/agoalofalife-fnsapi/health.svg)

```
[![Health](https://phpackages.com/badges/agoalofalife-fnsapi/health.svg)](https://phpackages.com/packages/agoalofalife-fnsapi)
```

###  Alternatives

[team-reflex/discord-php

An unofficial API to interact with the voice and text service Discord.

1.1k379.4k24](/packages/team-reflex-discord-php)[laminas/laminas-soap

6121.8M37](/packages/laminas-laminas-soap)[gusapi/gusapi

Gus Api Library for PHP

1351.5M8](/packages/gusapi-gusapi)[codedredd/laravel-soap

A SoapClient wrapper integration for Laravel

221516.6k3](/packages/codedredd-laravel-soap)[afipsdk/afip.php

Libreria para usar los Web Services de AFIP (Argentina)

284121.2k5](/packages/afipsdk-afipphp)[besimple/soap-client

Build and consume SOAP Client based web services

582.2M14](/packages/besimple-soap-client)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
