Удаленное создание нефискального чека

LifePay позволяет удаленно создать нефискальный чек по атрибутам запроса

Пример распечатанного чека по запросу:

Отправка чека на печать

Тип запроса:

POST

Формат данных:

Данные в теле запроса предварительно сериализуются в json-формат

Адрес URL:

https://sapi.life-pay.ru/cloud-print/create-non-fiscal-receipt

Описание полей

Параметр Тип Описание Обязательный
apikey Строка АПИ-ключ компании в системе Lifepay. Узнать свой АПИ-ключ можно в личном кабинете Lifepay. Да
login Строка Логин администратора компании или торговой точки в системе Lifepay. Если логин относится к торговой точке, к которой привязан принтер, документ будет отправлен на этот принтер. Как правило, логин - номер телефона в формате 7xxxxxxxxxx. Да
purchase json Позиции в чеке. Да
test Целое Тестовый режим отправки запроса без печати. Может принимать значения 0, 1, или отсутствовать (печать по умолчанию). В тестовом режиме uuid сгенерирован не будет, оповещения о результате печати отправляться не будут. Нет
type Строка Тип документа. Возможные значения:
payment - приход (по умолчанию),
refund - возврат прихода,
buy - расход,
buy_refund - возврат расхода.
Нет
card_amount Вещественное | Строка Сумма, оплаченная клиентом по карте. Особое значение - #. Нет
cash_amount Вещественное | Строка Сумма, оплаченная клиентом наличными. Особое значение - #. Нет
cashier_name Строка Имя кассира. Нет
target_serial Строка Серийный номер принтера, на который необходимо направить чек. Если не задан, чек будет распечатан на одном из подключенных (активных) фискальных принтеров. Нет
ext_id Строка Идентификатор в сторонней системе. Максимум 50 символов. В случае, если в систему повторно передан запрос с одинаковым ext_id, документ создан не будет, сервер вернет uuid первого документа. Нет
callback_url Строка URL для отправки уведомления об обработке документа. Максимум 255 символов. Уведомление будет сформировано при смене статуса обработки документа на “обработан”, “ожидает повтора”, “ошибка”. Нет
callback_data Строка | Объект | Массив Пользовательские данные, которые будут отправлены обратно на URL, указанный в параметре callback_url. Нет
ref_uuid
замечание
Строка Идентификатор, который вернул сервер при создании документа. Может использоваться только при возврате прихода (см. замечания). Нет
pos
описание
пример
json | Объект | Массив Опции для подключенного POS-терминала (см. описание поля и замечания). Нет
tax_system
замечание
Строка Система налогообложения.
Возможные значения:
osn - ОСН
usn6 - УСН доход
usn15 - УСН доход-расход
eshn - ЕСН
patent - Патент
Нет
payment_place Строка Место осуществления расчетов между пользователем и покупателем (клиентом) Нет

Пример содержимого поля purchase:


{ "products": [ { "name": "Монитор DELL U2412M", "price": 20730.00, "quantity": 1, "unit": "piece", "discount": { "type": "percent", "value": 10 } }, { "name": "Сканер Canon CanoScan LiDE 120", "price": 3710.00, "quantity": 1, "unit": "piece", "discount": { "type": "percent", "value": 10 } } ] }

Описание поля purchase

Параметр Описание
products Массив позиций для печати

Описание позиций в поле products

Параметр Тип Описание Обязательный
name Строка Наименование позиции. Да
price Строка Цена за единицу. Да
quantity Вещественное Количество товаров в позиции. В случае с весовыми товарами данное значение может быть дробным (до трех знаков после запятой, разделитель - точка). Да
unit Строка Единица измерения. Доступные значения: piece - штуки (по умолчанию), kg - килограммы, g - граммы, l - литры, ml - миллилитры, m2 - квадратные метры. Нет
discount json Скидка на позицию. Нет

Описание поля discount объекта products

Параметр Тип Описание Обязательный
type Строка Тип скидки. Возможные значения:
amount - абсолютное значение,
percent процентное значение.
Да
value Вещественное Значение скидки. Да

Описание поля pos

Параметр Описание
perform Перед печатью принять карту через POS-терминал. Возможные значения: 0 - не использовать, 1 - использовать.
slip_count Количество слип-чеков, которые необходимо распечатать после успешной транзакции по POS-терминалу. Возможные значения: 0, 1, 2.

Замечания

  1. Ни одно из полей card_amount, cash_amount не являются обязательными, но их сумма должна быть не меньше суммы позиций в чеке. Например, если сумма чека по позициям 1000, card_amount = 700, cash_amount = 500 то это означает, что покупатель оплатил покупку по карте на 700 рублей и 500 рублей наличными, сдача при этом будет составлять 200 рублей.

Если оплата была по карте, то в поле card_amount должна быть указана общая сумма, которую клиент оплатил по карте и совпадать с суммой позиций в чеке (в примере выше 239.45 рублей).

Любое из этих полей card_amount, cash_amount может принимать значение #, которое будет сообщать системе, что значение является вычисляемым: # = {сумма всех позиций из products} - (card_amount + cash_amount). Данное значение может быть полезно для того, чтобы не вычислять сумму, которую заплатил покупатель по products и не беспокоиться о проблемах с округлением в подсчетах.

В самом простом варианте, если покупка была оплачена, например, по карте, то необходимо заполнить только card_amount = #.

В примере выше, если оплата была по наличным на 10000, а остальное клиент оплатил электронными, то значения полей можно заполнить как: cash_amount = 10000, card_amount = #. В результате card_amount будет вычислен автоматически и в примере выше будет равен 11996.00.

  1. Параметр ref_uuid позволяет сопоставить 2 документа - приход и возврат прихода. Актуален только для запроса возврата прихода (type = refund). В случае, если параметр ref_uuid задан, система попытается найти документ прихода и, если он будет найден и сумма возвратов не превышает суммы прихода, создаст документ возврата прихода. Если осуществляется возврат прихода с параметром pos (perform = 1), ref_uuid является обязательным для заполнения для поиска RRN платежа в документе прихода.

  2. Параметр tax_system позволяет осуществлять продажи в случае нескольких СНО. Если товары продаются по одной СНО, а услуги по другой, необходимо сформировать 2 чека с разными значениями tax_system. Если tax_system не будет указана в запросе, система применит значение СНО, установленное в личном кабинете Lifepay. Если в личном кабинете СНО не была установлена, будет применена СНО - ОСН.

  3. Опция pos со значением perform = 1 позволяет перед печатью принять оплату/возврат по POS-терминалу, в случае успеха будет распечатан чек прихода (в случае type = payment), либо возврата прихода (в случае type = refund). Сумма, которая будет отправлена на POS-терминал, берется из параметра card_amount. Поддерживаемые терминалы: Ingenico IPP* с поддержкой библиотеки arcus2.

    Особенности работы с POS-терминалом при удаленной печати.

    1. В рамках одной смены до сверки на POS терминале при возврате осуществляется попытка отмены, при ее неудаче обрабатывается возврат.
    2. Смена на терминале закрывается при снятии z-отчета на принтере, подключенному к тому же микрокомпьютеру.
    3. Если смена на терминале не была закрыта в течение 48 часов, сверка осуществляется автоматически спустя 48 часов.
    4. В рамках одного микрокомпьютера можно подключить только 1 POS терминал.
    5. POS терминалу может не хватать питания только лишь от микрокомпьютера (зависит от блока питания). Нехватка питания выражается в постоянной перезагрузке при попытке оплаты. Поможет подключение отдельного питания к POS-терминалу, либо замена блока питания.
    6. Если оплата/возврат по POS терминалу прошла, но чек по каким-либо причинам не распечатался, транзакция откатываться не будет. В зависимости от ошибки принтера, сервер предпримет попытку повторной печати.

Пример успешного ответа:

формат json
Object
(
    [code] => 0
    [message] =>
    [data] => Object
        (
            [uuid] => 84fefc72-cbc5-5cc1-ba40-d00f035f05cb
        )

)

uuid - уникальный идентификатор документа

Пример ответа при ошибке:

формат json
Object
(
    [code] => 400
    [message] => Ошибка данных.
    [data] => Object
        (
            [purchase] => Array
                (
                    [0] => purchase не содержит products или products не является массивом
                )

        )

)

Возможные значения поля code:

  • 500 Внутренняя ошибка сервера
  • 400 Ошибка данных
  • 6000 Неверный формат данных
  • 6009 Не удалось найти пользователя по login
  • 6010 Не удалось найти пользователя по login и apikey
  • 6080 Облачная фискализация запрещена
  • 6095 Доступ запрещен

При значении поля “code” = 500 необходимо обратиться в тех поддержку, уточнить причину появления данной ошибки.

Рекомендация:

Если http-код ответа (не путать с полем code) отличен от 200, необходимо повторять запрос с тем же ext_id через некоторые промежутки времени. Промежутки повтора запроса могут быть, например, такими: 1 минута, 3 минуты, 5 минут, далее – один раз в 10 минут до получения http кода ответа 200.

Пример запроса на языке php.

$data = [];
$data['apikey'] = '{your_apikey}';
$data['login'] = '{your_login}';
$data['purchase'] = [
    'products' => [
        [
            'name' => 'Монитор DELL U2412M',
            'unit' => 'piece',
            'price' => 20730.00,
            'quantity' => 1,
            'discount' => [
                'type' => 'percent',
                'value' => 10,
            ]
        ],
        [
            'name' => 'Сканер Canon CanoScan LiDE 120',
            'unit' => 'piece',
            'price' => 3710.00,
            'quantity' => 1,
            'discount' => [
                'type' => 'percent',
                'value' => 10,
            ]
        ],
    ]
];

$data['type'] = 'payment';
$data['test'] = 0;
$data['cash_amount'] = 10000;
$data['card_amount'] = '#';
$data['payment_place'] = 'м. Автозаводская (центр зала)';

$request = json_encode($data);

$url = "https://sapi.life-pay.ru/cloud-print/create-non-fiscal-receipt";
$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, $request);

$result = curl_exec($curl);
curl_close($curl);

$resultJson = @json_decode($result);

printf("Res: %s\n", print_r($resultJson ? : $result, true));