Skip to main content

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

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

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

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

Тип запроса:

POST

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

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

Адрес URL:

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

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

ПараметрТипОписаниеОбязательный
apikeyСтрокаАПИ-ключ компании в системе Lifepay. Узнать свой АПИ-ключ можно в личном кабинете Lifepay.Да
loginСтрокаЛогин администратора компании или торговой точки в системе Lifepay. Если логин относится к торговой точке, к которой привязан принтер, документ будет отправлен на этот принтер. Как правило, логин - номер телефона в формате 7xxxxxxxxxx.Да
purchasejsonПозиции в чеке.Да
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 - квадратные метры.Нет
discountjsonСкидка на позицию.Нет

Описание поля 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));