Skip to main content

Создание чека по ФФД 1.05

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

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

Отправка чека на фискализацию

Тип запроса:

POST

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

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

Адрес URL:

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

Условные обозначения в формате данных

ОбозначениеОписание
ЦАтрибут, обозначающий, что данные реквизита должны быть представлены в виде цифры
САтрибут, обозначающий, что данные реквизита должны быть представлены в виде символа
{}Атрибут повторяемый

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

ПараметрТегТипОписаниеОбязательныйФорматМаксимальная длина
apikeyСтрокаАПИ-ключ компании в системе Lifepay. Узнать свой АПИ-ключ можно в личном кабинете Lifepay.Да{С}255
loginСтрокаЛогин администратора компании или торговой точки в системе Lifepay. Если логин относится к торговой точке, к которой привязан принтер, документ будет отправлен на этот принтер.Да7{Ц}11
purchaseМассивПозиции в чеке.Да
testЦелоеТестовый режим отправки запроса без фискализации. Может принимать значения 0, 1, или отсутствовать (фискализировать по умолчанию). В тестовом режиме uuid сгенерирован не будет, оповещения о результате фискализации отправляться не будут.Нет
modeСтрокаРежим печати/отправки чека. Возможные значения:email - отправить электронный чек по email и/или смс,print_email - распечатать чек и отправить по email и/или смс.Нет
type1054СтрокаТип документа. Возможные значения:payment - приход (по умолчанию),refund - возврат прихода,buy - расход,buy_refund - возврат расхода.Нет
customer_phone1008СтрокаНомер телефона клиента для отправки чека.Нет+{Ц}15
customer_email1008СтрокаЭлектронный адрес клиента для отправки чека.Нет{С}@{С}64
customer_name1227СтрокаПокупатель (клиент).Нет{С}256
customer_inn1228СтрокаИНН покупателя.Нет{Ц}12
card_amount1081ВещественноеСумма, оплаченная клиентом по карте. Особое значение - #.Нет{Ц}.ЦЦ | {Ц}
cash_amount1031ВещественноеСумма, оплаченная клиентом наличными. Особое значение - #.Нет{Ц}.ЦЦ | {Ц}
prepayment_amount1215ВещественноеСумма, внесенная авансом. Особое значение - #.Нет{Ц}.ЦЦ | {Ц}
credit_amount1216ВещественноеСумма, внесенная кредитными средствами. Особое значение - #.Нет{Ц}.ЦЦ | {Ц}
other_amount1217ВещественноеСумма иной формы оплаты (встречное предоставление). Особое значение - #.Нет{Ц}.ЦЦ | {Ц}
cashier_name1021СтрокаИмя кассира.Нет{С}64
cashier_inn1203СтрокаИНН кассира.Нет{Ц}12
target_serialСтрокаСерийный номер принтера, на котором необходимо фискализировать данные. Если не задан, чек будет фискализирован на одном из подключенных (активных) фискальных принтеров.Нет{С}
target_kkt_group_uuidСтрокаИдентификатор группы касс для фискализации. При задании параметра чек будет фискализирован на одном из ККТ, входящих в указанную группу. Объединить кассы в группы, и получить идентификатор можно в Личном кабинете Lifepay.Нет{С}
chpu_loginСтрокаЛогин, на который необходимо направить чек после печати фискального.Нет7{Ц}
ext_idСтрокаИдентификатор в сторонней системе. В случае, если в систему повторно передан запрос с одинаковым ext_id, документ создан не будет, сервер вернет uuid первого документа.Нет{С}50
order_numberСтрокаНомер заказа в сторонней системе. Может использоваться для поиска чека в личном кабинете.Нет{С}
callback_urlСтрокаURL для отправки уведомления об обработке документа. Уведомление будет сформировано при смене статуса обработки документа на "обработан", "ожидает повтора", "ошибка".Нет{С}255
callback_dataСтрока | Структура | МассивПользовательские данные, которые будут отправлены обратно на URL, указанный в параметре callback_url.Нет
ref_uuid замечаниеСтрокаИдентификатор, который вернул сервер при создании документа. Может использоваться только при возврате прихода (см. замечания).Нет{С}50
pos примерСтруктураОпции для подключенного POS-терминала (см. описание поля и замечания).Нет
agent замечание, пример1057Структура | ЦелоеПризнак агента.Нет
tax_system замечание1055СтрокаСистема налогообложения.Возможные значения:osn - ОСНusn6 - УСН доходusn15 - УСН доход-расходeshn - ЕСНpatent - ПатентНет
payment_place1187СтрокаМесто осуществления расчетов между пользователем и покупателем (клиентом)Нет{С}256
additional_receipt_details1192СтрокаДополнительный реквизит чека (БСО)Нет{С}16
receipt_header_lines примерМассивКастомные строки заголовка чека.Нет
sender_email1117СтрокаЭлектронный адрес (email) отправителя чеков.Нет{С}@{С}64
additional_user_detail1084СтруктураДополнительный реквизит пользователя.Нет

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


{
"products": [
{
"name": "Ананас",
"price": 110,
"quantity": 1,
"tax": "vat20",
"unit": "piece",
"discount": {
"type": "percent",
"value": 10
}
},
{
"name": "Картофель",
"price": 15,
"quantity": 2,
"tax": "vat20",
"unit": "kg",
"discount": {
"type": "percent",
"value": 10
}
},
{
"name": "Кешью",
"price": 1200,
"quantity": 0.1,
"tax": "vat10",
"unit": "kg",
"discount": {
"type": "amount",
"value": 6.55
}
}
]
}

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

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

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

ПараметрТегТипОписаниеОбязательныйФорматМаксимальная длина
name1030СтрокаНаименование позиции.Да{С}128
price1079ВещественноеЦена за единицу.Да{Ц}.ЦЦ | {Ц}
quantity1023ВещественноеКоличество товаров в позиции.Да{Ц}.ЦЦЦ | {Ц}
tax1199СтрокаНалог на позицию. Возможные значения: none - НДС не облагается;vat0 - НДС по ставке 0%;vat10 - НДС чека по ставке 10%;vat20 - НДС чека по ставке 20%;vat110 - НДС расчитанный 10/110;vat120 - НДС расчитанный 20/120;Нет
unitСтрокаЕдиница измерения. Доступные значения: piece - штуки, kg - килограммы, g - граммы, l - литры, ml - миллилитры, m2 - квадратные метры.Нет
discountСтруктураСкидка на позицию.Нет
type1214ЦелоеПризнак способа расчета. Для стандартных случаев данный параметр заполнять не следует.Возможные значения: 1 - Полная предварительная оплата до момента передачи предмета расчета;2 - Частичная предварительная оплата до момента передачи предмета расчета;3 - Аванс;4 - Полная оплата, в том числе с учетом аванса (предварительной оплаты) в момент передачи предмета расчета;5 - Частичная оплата предмета расчета в момент его передачи с последующей оплатой в кредит;6 - Передача предмета расчета без его оплаты в момент его передачи с последующей оплатой в кредит;7 - Оплата предмета расчета после его передачи с оплатой в кредит (оплата кредита);Нет
item_type1212ЦелоеПризнак предмета расчета. Возможные значения: 1 - Товар;2 - Подакцизный товар;3 - Работа;4 - Услуга;5 - Ставка азартной игры;6 - Выигрыш азартной игры;7 - Лотерейный билет;8 - Выигрыш лотереи;9 - Предоставление результатов интеллектуальной деятельности;10 - Платеж;11 - Агентское вознаграждение;12 - Составной предмет расчета;13 - Иной предмет расчета;Нет
agent_item_type пример1222МассивПризнак агента по предмету расчета.Нет
agent_data1223СтруктураДанные агента.Нет
supplier_data1224СтруктураДанные поставщика.Нет
supplier_inn1226СтрокаИНН поставщика. Должен быть корректным.Да, если задано supplier_data{Ц}12
marking_code1162СтрокаКод маркировки, полученный от сканера. Будет разобрано в тег 1162 автоматически. Пример:Переданное значение:010460043993125621JgXJ5.T\u001d8005112000\u001d930001\u001d923zbrLA==\u001d24014276281Разобранное значение 1162:444D042F1F9681784A67584A352E54313132303030 (hex).Нет{С}32
country_code1230СтрокаКод страны происхождения товара.НетЦЦЦ3
declaration_number1231СтрокаНомер таможенной декларации.Нет{С}32
excise_amount1229ВещественноеСумма акциза в рублях.Нет{Ц}.ЦЦ | {Ц}
additional_detail1191СтрокаДополнительный реквизит предмета расчета.Нет{С}64
unit_value1197СтрокаЕдиница измерения предмета расчета.Нет{С}16

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

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

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

ПараметрТегТипОписаниеФорматМаксимальная длина
tag10051005СтрокаАдрес оператора перевода.{С}256
tag10161016СтрокаИНН оператора перевода. Должен быть корректным.{Ц}12
tag10261026СтрокаНаименование оператора перевода.{С}64
tag10751075Массив строкТелефон оператора перевода.[+{Ц}]19 (для каждого элемента)
tag10441044СтрокаОперация платежного агента.{С}24
tag10731073Массив строкТелефон платежного агента.[+{Ц}]19 (для каждого элемента)
tag10741074Массив строкТелефон оператора по приему платежей.[+{Ц}]19 (для каждого элемента)

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

ПараметрТегТипОписаниеФорматМаксимальная длина
tag11711171Массив строкТелефон поставщика.[+{Ц}]19 (для каждого элемента)
tag12251225СтрокаНаименование поставщика.{С}256

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

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

Описание поля agent, agent_item_type

ПараметрОписание
bankPaymentAgentОказание услуг покупателю (клиенту) пользователем, являющимся банковским платежным агентом. Возможные значения: 0 - нет, 1 - да.
bankPaymentSubagentОказание услуг покупателю (клиенту) пользователем, являющимся банковским платежным субагентом. Возможные значения: 0 - нет, 1 - да.
paymentAgentОказание услуг покупателю (клиенту) пользователем, являющимся платежным агентом. Возможные значения: 0 - нет, 1 - да.
paymentSubagentОказание услуг покупателю (клиенту) пользователем, являющимся платежным субагентом. Возможные значения: 0 - нет, 1 - да.
attorneyОсуществление расчета с покупателем (клиентом) пользователем, являющимся поверенным. Возможные значения: 0 - нет, 1 - да.
commissionerОсуществление расчета с покупателем (клиентом) пользователем, являющимся комиссионером. Возможные значения: 0 - нет, 1 - да.
agentОсуществление расчета с покупателем (клиентом) пользователем, являющимся агентом и не являющимся банковским платежным агентом (субагентом), платежным агентом (субагентом), поверенным, комиссионером. Возможные значения: 0 - нет, 1 - да.

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

Содержит массив строк:

ПараметрТипОписание
textСтрокаСтрока для печати.
alignСтрокаВыравнивание текста. Возможные значения: left, center, right. По умолчанию left.
text_wrapСтрокаПеренос строки. Возможные значения: no - не переносить, words - переносить по словам. По умолчанию no.
char_size_multiplyЦелоеМультипликатор ширины и высоты символов. Возможные значения: 1, 2. По умолчанию 1.

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

ПараметрТегТипОписаниеФорматМаксимальная длина
tag10851085СтрокаНаименование дополнительного реквизита пользователя.{С}64
tag10861086СтрокаЗначение дополнительного реквизита пользователя.{С}256

Замечания

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

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

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

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

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

  1. Параметр mode актуален для принтеров, соответствующих 54-ФЗ. Если этот параметр равен email или print_email, электронный чек будет отправлен покупателю по смс или email (в зависимости от заполненности полей customer_phone и customer_email).

  2. Функционал аванса/кредита (в соответствии с ФФД 1.05) доступен на принтерах АТОЛ начиная с версии прошивки 3689. Версию прошивки можно посмотреть в личном кабинете Lifepay в разделе Фискализация -> Принтеры.

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

  4. Функционал печати признака агента по полю agent доступен на версии микрокомпьютера не ниже 3.0.1 на принтерах АТОЛ прошивки не ниже 3689. Для печати на ЧПУ признака агента требуется версия приложения на Android не ниже 7.11. Версии устройств можно посмотреть в личном кабинете Lifepay во вкладке Фискализация -> Принтеры. Принтер должен быть зарегистрирован с необходимыми фискальными признаками агента.

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

  6. Опция 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 терминалу прошла, но чек по каким-либо причинам не распечатался, транзакция откатываться не будет. В зависимости от ошибки принтера, сервер предпримет попытку повторной печати.

Если оплата осуществляется через приложение Lifepay, а в личном кабинете в разделе "Фискализация" -> "Сотрудники" разрешена для указанного логина удаленная фискализация и печать на ЧПУ, чек на ЧПУ будет отправлен на устройство с которого был принят платеж.

Список принтеров или логины пользователей, которые подключены к организации можно посмотреть в личном кабинете Lifepay.

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

формат json
Object
(
[code] => 0
[message] =>
[data] => Object
(
[uuid] => dabe3833-43ff-5e5c-a45e-9cff664503ff
)

)

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

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

формат json
Object
(
[code] => 400
[message] => Ошибка данных.
[data] => Object
(
[purchase] => Array
(
[0] => Ошибка в позиции 1: Значение «Value» не должно превышать 100.
)

)

)

Возможные значения поля 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.

Продажа трех позиций на общую сумму 239,45 руб. Покупатель дал 500 руб. Сдача составляет 260,55 руб.

Выставлен режим печати бумажного чека.

$data = [];
$data['apikey'] = '{your_apikey}';
$data['login'] = '{your_login}';
$data['purchase'] = '
{
"products": [
{
"name": "Ананас",
"unit": "piece",
"price": 110,
"quantity": 1,
"tax": "vat20",
"discount": {
"type": "percent",
"value": 10
}
},
{
"name": "Картофель",
"unit": "kg",
"price": 15,
"quantity": 2,
"tax": "vat20",
"discount": {
"type": "percent",
"value": 10
}
},
{
"name": "Кешью",
"unit": "kg",
"price": 1200,
"quantity": 0.1,
"tax": "vat10",
"discount": {
"type": "amount",
"value": 6.55
}
}
]
}
';
$data['type'] = 'payment';
$data['test'] = 0;
$data['customer_phone'] = null;
$data['customer_email'] = null;
$data['cash_amount'] = 500;
$data['card_amount'] = null;
$data['payment_place'] = 'Станция метро Третьяковская (центр зала)';

$request = json_encode($data);

$url = "https://sapi.life-pay.ru/cloud-print/create-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));

Возврат по безналичным. Пример запроса на языке php.

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

Выставлен режим отправки электронного чека.

$data = [];
$data['apikey'] = '{your_apikey}';
$data['login'] = '{your_login}';
$data['purchase'] = '
{
"products": [
{
"name": "Пылесос SAMSUNG SC6573",
"unit": "piece",
"price": 9500.59,
"quantity": 1,
"tax": "vat20",
"discount": {
"type": "percent",
"value": 33
}
}
]
}
';
$data['type'] = 'refund';
$data['test'] = 0;
$data['mode'] = 'email';
$data['customer_phone'] = null;
$data['customer_email'] = '{customer_email}';
$data['cash_amount'] = null;
$data['card_amount'] = '#';

$request = json_encode($data);

$url = "https://sapi.life-pay.ru/cloud-print/create-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));

Продажа с частичной оплатой наличными. Пример запроса на языке php.

Оплата покупателем покупки с оплатой по наличным 15000 руб., и остатка по карте.

Выставлен режим печати бумажного и отправки электронного чека.

$data = [];
$data['apikey'] = '{your_apikey}';
$data['login'] = '{your_login}';
$data['purchase'] = '
{
"products": [
{
"name": "Холодильник Bosch KGV36NL1AR",
"unit": "piece",
"price": 26990,
"quantity": 1,
"tax": "vat20"
}
]
}
';
$data['type'] = 'payment';
$data['test'] = 0;
$data['mode'] = 'print_email';
$data['customer_phone'] = null;
$data['customer_email'] = '{customer_email}';
$data['cash_amount'] = 15000;
$data['card_amount'] = '#';

$request = json_encode($data);

$url = "https://sapi.life-pay.ru/cloud-print/create-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));

Продажа товара в рассрочку. Пример запроса на языке php.

Продавец продает покупателю следующие товары, находящиеся в собственности продавца:

  1. Монитор DELL U2412M 1 шт. на сумму 20730 руб.
  2. Сканер Canon CanoScan LiDE 120 1 шт. на сумму 3710 руб. Итого: 24440 руб.

Для оплаты товара продавец предоставляет покупателю рассрочку на 2 месяца на сумму 20000 руб. Заключен договор No 123 от 01.02.2017. Ежемесячные платежи составят 10000 рублей до 04.04.2017. Остальные денежные средства в размере 4440 руб. оплачены покупателем наличными 01.02.2017.

  1. Покупатель оплатил товар в рассрочку. 01.02.2017 будет сформирован чек по запросу:
$data = [];
$data['apikey'] = '{your_apikey}';
$data['login'] = '{your_login}';
$data['purchase'] = '
{
"products": [
{
"name": "Монитор DELL U2412M",
"unit": "piece",
"price": 20730.00,
"quantity": 1,
"tax": "vat20",
"type": 5
},
{
"name": "Сканер Canon CanoScan LiDE 120",
"unit": "piece",
"price": 3710.00,
"quantity": 1,
"tax": "vat20",
"type": 5
}
]
}
';
$data['type'] = 'payment';
$data['test'] = 0;
$data['customer_phone'] = null;
$data['customer_email'] = null;
$data['cash_amount'] = '#';
$data['card_amount'] = null;
$data['credit_amount'] = 20000;

$request = json_encode($data);

$url = "https://sapi.life-pay.ru/cloud-print/create-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));
  1. Покупатель оплатил кредит картой. 01.03.2017 и 01.04.2017 чеки будут сформированы следующим запросом:
$data = [];
$data['apikey'] = '{your_apikey}';
$data['login'] = '{your_login}';
$data['purchase'] = '
{
"products": [
{
"name": "Оплата кредита за монитор DELL U2412M",
"unit": "piece",
"price": 5000.00,
"quantity": 1,
"tax": "vat20",
"type": 7
},
{
"name": "Оплата кредита за сканер Canon CanoScan LiDE 120",
"unit": "piece",
"price": 5000.00,
"quantity": 1,
"tax": "vat20",
"type": 7
}
]
}
';
$data['type'] = 'payment';
$data['test'] = 0;
$data['customer_phone'] = null;
$data['customer_email'] = null;
$data['cash_amount'] = null;
$data['card_amount'] = '#';
$data['credit_amount'] = null;

$request = json_encode($data);

$url = "https://sapi.life-pay.ru/cloud-print/create-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));
Продажа товара с использованием кредитных средств. Пример запроса на языке php.

Продавец продает покупателю следующие товары, находящиеся в собственности продавца:

  1. Монитор DELL U2412M 1 шт. на сумму 20730 руб.
  2. Сканер Canon CanoScan LiDE 120 1 шт. на сумму 3710 руб. Итого: 24440 руб.

01.02.2017 между покупателем и Банком (кредитной организацией) заключен договор на предоставление потребительского кредита на покупку указанных товаров на сумму 20000 руб. Оплата за товар произведена следующим образом: • 4440 руб. оплачены клиентом наличными денежными средствами 01.02.2017; • 20000 руб. оплачены с использованием кредитных средств кредитной организации.

Запрос на формирование кассового чека будет выглядеть следующим образом:

$data = [];
$data['apikey'] = '{your_apikey}';
$data['login'] = '{your_login}';
$data['purchase'] = '
{
"products": [
{
"name": "Монитор DELL U2412M",
"unit": "piece",
"price": 20730.00,
"quantity": 1,
"tax": "vat20",
"type": 4
},
{
"name": "Сканер Canon CanoScan LiDE 120",
"unit": "piece",
"price": 3710.00,
"quantity": 1,
"tax": "vat20",
"type": 4
}
]
}
';
$data['type'] = 'payment';
$data['test'] = 0;
$data['customer_phone'] = null;
$data['customer_email'] = null;
$data['cash_amount'] = '#';
$data['card_amount'] = null;
$data['credit_amount'] = 20000;

$request = json_encode($data);

$url = "https://sapi.life-pay.ru/cloud-print/create-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));
Продажа с использованием POS-терминала. Пример запроса на языке php.

Оплата покупателем покупки с оплатой по наличным 15000 руб., и остатка по карте. После успешной оплаты по POS-терминалу будут распечатаны фискальный чек и 2 слип-чека.

Выставлен режим печати бумажного и отправки электронного чека.

$data = [];
$data['apikey'] = '{your_apikey}';
$data['login'] = '{your_login}';
$data['purchase'] = '
{
"products": [
{
"name": "Холодильник Bosch KGV36NL1AR",
"unit": "piece",
"price": 26990,
"quantity": 1,
"tax": "vat20"
}
]
}
';
$data['type'] = 'payment';
$data['test'] = 0;
$data['mode'] = 'print_email';
$data['customer_phone'] = null;
$data['customer_email'] = '{customer_email}';
$data['cash_amount'] = 15000;
$data['card_amount'] = '#';
$data['pos'] = [
'perform' => 1,
'slip_count' => 2,
];

$request = json_encode($data);

$url = "https://sapi.life-pay.ru/cloud-print/create-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));

Возврат с использованием POS-терминала. Пример запроса на языке php.

Возврат покупки из предыдущего примера. После успешного возврата по POS-терминалу будут распечатаны фискальный чек и 1 слип-чек.

Выставлен режим печати бумажного и отправки электронного чека.

$data = [];
$data['apikey'] = '{your_apikey}';
$data['login'] = '{your_login}';
$data['purchase'] = '
{
"products": [
{
"name": "Холодильник Bosch KGV36NL1AR",
"unit": "piece",
"price": 26990,
"quantity": 1,
"tax": "vat20"
}
]
}
';
$data['type'] = 'refund';
$data['test'] = 0;
$data['mode'] = 'print_email';
$data['customer_phone'] = null;
$data['customer_email'] = '{customer_email}';
$data['cash_amount'] = 15000;
$data['card_amount'] = '#';
$data['ref_uuid'] = '{payment_uuid}';
$data['pos'] = [
'perform' => 1,
'slip_count' => 1,
];

$request = json_encode($data);

$url = "https://sapi.life-pay.ru/cloud-print/create-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));

Продажа c проставлением признака агента. Пример запроса на языке php.
$data = [];
$data['apikey'] = '{your_apikey}';
$data['login'] = '{your_login}';
$data['purchase'] = '
{
"products": [
{
"name": "Ананас",
"unit": "piece",
"price": 110,
"quantity": 1,
"tax": "vat20",
"discount": {
"type": "percent",
"value": 10
}
},
{
"name": "Картофель",
"unit": "kg",
"price": 15,
"quantity": 2,
"tax": "vat20",
"discount": {
"type": "percent",
"value": 10
}
},
{
"name": "Кешью",
"unit": "kg",
"price": 1200,
"quantity": 0.1,
"tax": "vat10",
"discount": {
"type": "amount",
"value": 6.55
}
}
]
}
';
$data['type'] = 'payment';
$data['test'] = 0;
$data['customer_phone'] = null;
$data['customer_email'] = null;
$data['cash_amount'] = 500;
$data['card_amount'] = null;
$data['agent'] = [
'bankPaymentAgent' => 1,
];

$request = json_encode($data);

$url = "https://sapi.life-pay.ru/cloud-print/create-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));

Продажа c проставлением данных агента и поставщика для позиций. Пример запроса на языке php.
$data = [];
$data['apikey'] = '{your_apikey}';
$data['login'] = '{your_login}';
$data['purchase'] = '
{
"products": [
{
"name": "Конструктор LEGO Super Heroes 76107",
"price": 4990,
"quantity": 1,
"tax": "vat20",
"discount": {
"type": "percent",
"value": 5
},
"agent_data": {
"tag1005": "Ленинская Слобода, 19",
"tag1016": "123456789047",
"tag1026": "Оператор 1",
"tag1044": "Оплата",
"tag1073": ["+75555555555", "8 (495) 123-23-23"],
"tag1074": ["+71234567890"],
"tag1075": []
},
"supplier_inn": "1234567894",
"supplier_data": {
"tag1171": ["+75555555555", "8 (495) 123-23-23"],
"tag1225": "ООО Поставщик"
},
"agent_item_type": {
"agent": 1
}
},
{
"name": "Доставка",
"price": 300,
"quantity": 1,
"tax": "none"
}
]
}
';
$data['type'] = 'payment';
$data['test'] = 0;
$data['customer_phone'] = null;
$data['customer_email'] = null;
$data['cash_amount'] = '#';
$data['card_amount'] = null;
$data['tax_system'] = 'usn15';
$data['agent'] = [
'agent' => 1,
];

$request = json_encode($data);

$url = "https://sapi.life-pay.ru/cloud-print/create-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));

Фискализация с заданием кастомного заголовка чека. Пример запроса на языке php.
$data = [];
$data['apikey'] = '{your_apikey}';
$data['login'] = '{your_login}';
$data['purchase'] = '
{
"products": [
{
"name": "Конструктор LEGO Super Heroes 76107",
"price": 4990,
"quantity": 1,
"tax": "vat20"
},
{
"name": "Доставка",
"price": 300,
"quantity": 1,
"tax": "none"
}
]
}
';
$data['receipt_header_lines'] = [
[
'text' => 'Заказ 23893',
'char_size_multiply' => 2,
],
[
'text' => 'Для возврата товара обращайтесь по телефону 75555555555',
'align' => 'center',
'text_wrap' => 'words',
]
];
$data['type'] = 'payment';
$data['test'] = 0;
$data['cash_amount'] = '#';

$request = json_encode($data);

$url = "https://sapi.life-pay.ru/cloud-print/create-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));

Чек коррекции

LifePay позволяет удаленно создать чек коррекции в соответствии с требованиями налоговой. Чек коррекции можно создать как посредством запроса по АПИ, так и в личном кабинете Lifepay:

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

Отправка чека на фискализацию

Тип запроса:

POST

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

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

Адрес URL:

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

Условные обозначения в формате данных

ОбозначениеОписание
ЦАтрибут, обозначающий, что данные реквизита должны быть представлены в виде цифры
САтрибут, обозначающий, что данные реквизита должны быть представлены в виде символа
{}Атрибут повторяемый

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

ПараметрТегТипОписаниеОбязательныйФорматМаксимальная длина
apikeyСтрокаАПИ-ключ компании в системе Lifepay. Узнать свой АПИ-ключ можно в личном кабинете Lifepay.Да{С}255
loginСтрокаЛогин администратора компании или торговой точки в системе Lifepay. Если логин относится к торговой точке, к которой привязан принтер, документ будет отправлен на этот принтер.Да7{Ц}11
initiator1173СтрокаИнициатор коррекции. Возможные значения:independently - самостоятельно (по умолчанию),directive - по предписанию.Да
doc_date1178СтрокаДата документа коррекции.ДаГГГГ-ММ-ДД
doc_number1179СтрокаНомер документа коррекции.Да{С}32
testЦелоеТестовый режим отправки запроса без фискализации. Может принимать значения 0, 1, или отсутствовать (фискализировать по умолчанию). В тестовом режиме uuid сгенерирован не будет, оповещения о результате фискализации отправляться не будут.Нет
type1054СтрокаТип коррекции. Возможные значения:sell_correction - коррекция прихода (по умолчанию),buy_correction - коррекция расхода.Нет
card_amount1081ВещественноеСумма, оплаченная клиентом по карте. Особое значение - #.Нет{Ц}.ЦЦ | {Ц}
cash_amount1031ВещественноеСумма, оплаченная клиентом наличными. Особое значение - #.Нет{Ц}.ЦЦ | {€Ц}
prepayment_amount1215ВещественноеСумма, внесенная авансом. Особое значение - #.Нет{Ц}.ЦЦ | {Ц}
credit_amount1216ВещественноеСумма, внесенная кредитными средствами. Особое значение - #.Нет{Ц}.ЦЦ | {Ц}
other_amount1217ВещественноеСумма иной формы оплаты (встречное предоставление). Особое значение - #.Нет{Ц}.ЦЦ | {Ц}
cashier_name1021СтрокаИмя кассира.Нет{С}64
cashier_inn1203СтрокаИНН кассира.Нет{Ц}12
target_serialСтрокаСерийный номер принтера, на котором необходимо фискализировать данные. Если не задан, чек будет фискализирован на одном из подключенных (активных) фискальных принтеров.Нет{С}
target_kkt_group_uuidСтрокаИдентификатор группы касс для фискализации. При задании параметра чек будет фискализирован на одном из ККТ, входящих в указанную группу. Объединить кассы в группы, и получить идентификатор можно в Личном кабинете Lifepay.Нет{С}
ext_idСтрокаИдентификатор в сторонней системе. В случае, если в систему повторно передан запрос с одинаковым ext_id, документ создан не будет, сервер вернет uuid первого документа.Нет{С}50
order_numberСтрокаНомер заказа в сторонней системе. Может использоваться для поиска чека в личном кабинете.Нет{С}
callback_urlСтрокаURL для отправки уведомления об обработке документа. Уведомление будет сформировано при смене статуса обработки документа на "обработан", "ожидает повтора", "ошибка".Нет{С}255
callback_dataСтрока | Структура | МассивПользовательские данные, которые будут отправлены обратно на URL, указанный в параметре callback_url.Нет
tax_system замечание1055СтрокаСистема налогообложения.Возможные значения:osn - ОСНusn6 - УСН доходusn15 - УСН доход-расходeshn - ЕСНpatent - ПатентНет
tax1199СтрокаНалог. Возможные значения: none - НДС не облагается;vat0 - НДС по ставке 0%;vat10 - НДС чека по ставке 10%;vat20 - НДС чека по ставке 20%;vat110 - НДС расчитанный 10/110;vat120 - НДС расчитанный 20/120;Нет
tax_listМассивСписок налоговых ставок и их значенияНет
payment_place1187СтрокаМесто осуществления расчетов между пользователем и покупателем (клиентом)Нет{С}256
customer_name1227СтрокаПокупатель (клиент).Нет{С}256
customer_inn1228СтрокаИНН покупателя.Нет{Ц}12
additional_receipt_details1192СтрокаДополнительный реквизит чека (БСО)Нет{С}16

Описание элементов списка tax_list

ПараметрТегТипОписаниеОбязательныйФормат
tax1199СтрокаВозможные значения: none - НДС не облагается;vat0 - НДС по ставке 0%;vat10 - НДС чека по ставке 10%;vat20 - НДС чека по ставке 20%;vat110 - НДС расчитанный 10/110;vat120 - НДС расчитанный 20/120;Да
value1200ВещественноеСумма НДС.Да{Ц}.ЦЦ | {Ц}

Замечания

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

  2. В запросе необходимо указывать один из параметров tax (для автоматического расчета НДС на стороне ФР), либо tax_list (в случае расчета НДС на стороне клиента). Если указаны оба параметра, то приоритет отдается tax_list.

  3. В случае, если товары/услуги не облагаются НДС (либо НДС 0%), в поле value из списка tax_list указывается сумма, которая не облагается НДС (либо НДС 0%).

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

формат json
Object
(
[code] => 0
[message] =>
[data] => Object
(
[uuid] => dabe3833-43ff-5e5c-a45e-9cff664503fd
)

)

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

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

формат json
Object
(
[code] => 400
[message] => Ошибка данных.
[data] => Object
(
[target_serial] => Array
(
[0] => Принтер не найден.
)

)

)

Возможные значения поля 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['type'] = 'sell_correction';
$data['doc_date'] = "2017-01-01";
$data['doc_number'] = "3123";
$data['tax_list'] = '
[
{
"tax": "none",
"value": 1000
},
{
"tax": "vat10",
"value": 10.55
}
]
';
$data['test'] = 0;
$data['cash_amount'] = 500;
$data['card_amount'] = null;
$data['mc_amount'] = null;
$data['cashier_name'] = null;
$data['target_serial'] = null;
$data['payment_place'] = 'Станция метро Выхино (центр зала)';

$request = json_encode($data);

$url = "https://sapi.life-pay.ru/cloud-print/create-receipt-correction";
$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));