Пакет предоставляет удобный интерфейс для общения с API Модуль.Кассы для отправки данных чеков в сервис фискализации. Пакет упрощает разработку модулей интеграции интернет-магазина с севисом фискализации Модуль.Кассы.
Часть описания дублирует оригинал документации по API Модуль.Кассы
- php ^7.1
- guzzlehttp/guzzle (или любой клиент следующий интерфейсу
\GuzzleHttp\ClientInterface
) - ext-json
- curl
Вы можете установить данный пакет с помощью сomposer:
composer require bigperson/modulpos-php-api-client
Для PHP 5.4-7.0 можеете использовать предыдущую версию
composer require bigperson/modulpos-php-api-client 1.0
Схема процесса фискализации подробна описана в документации к API. В кратце необходимо связать точку продаж с интернет магазином, настроить отправку данных чеков и проверить статус отправленного чека.
Для начала необходимо в личном кабинете Модуль.Кассы создать розничную точку продаж, активировать у неё функцию Использовать для печати документов интернет-магазина
и получить идентификатор uuid
. Далее вызываем связку
$login = 'test@test.ru'; // Логин от аккаунта Модуль.Кассы
$password = 'password'; // Пароль от аккаунта Модуль.Кассы
$retailPointUuid = 'uuid'; // Идентификатор розничной точки
$testMode = true; // Тестовый режим
$associate = new \Bigperson\ModulposApiClient\Associate($login, $password, $retailPointUuid, $testMode);
$result = $associate->init();
В $result
получим массив с данным userName
и password
которые будут использоватся для дальнейших обращений к API. Их нужно где-нибудь сохранить, например в базе данных.
Для начала необходимо сформировать данные самого чека. Для этого достаточно для ваших моделей инплементировать интерфейсы ModulposOrderInterface для заказа, ModulposOrderItemInterface для товара в заказе, ModulposPaymentItemInterface для способа оплаты. Также вы можете использовать entity из пакета, или отнаследовать от них собственные классы переопределив методы на собственные.
use Bigperson\ModulposApiClient\Entity\Order;
use Bigperson\ModulposApiClient\Entity\Cashier;
use Bigperson\ModulposApiClient\Entity\OrderItem;
use Bigperson\ModulposApiClient\Entity\PaymentItem;
$dateTime = new \DateTime('NOW');
// Создаем заказ
$order = Order::create([
'documentUuid' => uniqid(),
'checkoutDateTime' => $dateTime->format(DATE_RFC3339),
'orderId' => rand(100000, 999999),
'typeOperation' => 'SALE',
'customerContact' => 'test@example.com',
]);
// Созадем товары
$orderItem1 = OrderItem::create([
'price' => 100,
'quantity' => 1,
'vatTag' => OrderItem::VAT_NO,
'name' => 'Test Product1'
]);
$orderItem2 = OrderItem::create([
'price' => 200,
'quantity' => 1,
'vatTag' => OrderItem::VAT_NO,
'name' => 'Test Product2'
]);
//Создаем способ оплаты
$paymentItem = PaymentItem::create([
'type' => 'CARD',
'sum' => 300
]);
// Добавляем товары и способ оплаты к заказу
$order->addItem($orderItem1);
$order->addItem($orderItem2);
$order->addPaymentItem($paymentItem);
//Создаем кассира
$cashier = Cashier::create([
'name' => 'Test Cashier',
'inn' => '123456789012',
'position' => 'salesman',
]);
Далее объект заказа необходимо передать клиенту, также вы можете передать responseURL
и печатать ли чек на кассе:
$login = 'test@test.ru'; // Логин полученный на первом шаге
$password = 'password'; // Пароль полученный на первом шаге
$testMode = true; // Тестовый режим
$client = new \Bigperson\ModulposApiClient\Client($login, $password, $testMode);
$responseUrl = 'https://internet.shop.ru/order/982340931/checkout?completed=1';
$printReceipt = true; // Печатать ли чек на кассе
$result = $client->sendCheck($order, $responseUrl, $printReceipt, $cashier);
Все параметры кроме $order - опциональные. Если не передан объект ModulposCashierInterface
то будут использованны данные из настроек торговой точки.
В ответ придет массив со статусом обработки документа и фискального накопителя.
Если при передаче данных чека был передан responseURL
, то на него придет результат фискализации, если параметр задан не был, то вы можете самостоятельно проверить статус документа:
$login = 'test@test.ru'; // Логин полученный на первом шаге
$password = 'password'; // Пароль полученный на первом шаге
$testMode = true; // Тестовый режим
$documentId = 'efbafcdd-113a-45db-8fb9-718b1fdc3524'; // id документа
$client = new \Bigperson\ModulposApiClient\Client($login, $password, $testMode);
$result = $client->getStatusDocumentById($documentId);
В ответ придет массив со статусом status
, который может принимать значения:
- QUEUED - документ принят в очередь на обработку;
- PENDING - документ получен кассой для печати;
- PRINTED - фискализирован успешно;
- COMPLETED - результат фискализации отправлен (если было заполнено поле responseURL) в сервис источник;
- FAILED - ошибка при фискализации.
Также в массив придет fnState
- статус фискального накопителя, может принимать значения:
- ready - соединение с фискальным накопителем установлено, состояние позволяет фискализировать чеки
- associated - клиент успешно связан с розничной точкой, но касса еще ни разу не вышла на связь и не сообщила свое состояние
- failed - Проблемы получения статуса фискального накопителя. Этот статус не препятствует добавлению документов для фискализации. Все документы будут добавлены в очередь на сервере и дождутся момента когда касса будет в состоянии их фискализировать
Кроме того вы можете вызвать отдельно метод проверки статуса фискального накопителя (сервиса фискализации):
$client = new \Bigperson\ModulposApiClient\Client($login, $password, $testMode);
$result = $client->getStatusFiscalService();
С целью активного развития пакета, рекомендуем создавать пулл-реквесты, а не только баг-репорты (issues). По любым проблемам рекомендуем открывать Баг-репорты с подробным описанием проблемы и последовательностью действия для воспроизведения бага.