8. Работа с чеками 54-ФЗ
PayKeeper поддерживает автоматическую генерацию чеков согласно 54-ФЗ.
URI | Назначение | |
---|---|---|
8.1 | /info/receipts/bydate/ | Получение реестра чеков за период, с фильтром по типам. |
8.2 | /info/receipts/bydatecount/ | Получение количеств чеков за период, сгруппированных по типам |
8.3 | /info/receipts/bypaymentid/ | Получение информации о чеках, выданных по указанному платежу |
8.4 | /info/receipts/byid/ | Получение информации о чеке по его внутреннему номеру |
8.5 | /info/receipts/search/ | Поиск чеков по фискальным атрибутам |
8.6 | ЗАРЕЗЕРВИРОВАНО | ЗАРЕЗЕРВИРОВАНО |
8.7 | ЗАРЕЗЕРВИРОВАНО | ЗАРЕЗЕРВИРОВАНО |
8.8 | ЗАРЕЗЕРВИРОВАНО | ЗАРЕЗЕРВИРОВАНО |
8.9 | ЗАРЕЗЕРВИРОВАНО | ЗАРЕЗЕРВИРОВАНО |
8.10 | ЗАРЕЗЕРВИРОВАНО | ЗАРЕЗЕРВИРОВАНО |
8.11 | /change/receipt/print/ | Сгенерировать чек по платежу или с произвольными атрибутами |
8.12 | ЗАРЕЗЕРВИРОВАНО | Отправить запрос о состоянии чеков кассовому устройству. Если у чека нет фискальных атрибутов, этот запрос может их получить. |
8.13 | Callback о статусе чека | Уведомление системы ТСП о достижении чеком финального статуса |
8.1. Получение реестра чеков за период, с фильтром по типам.
Результатом будет список выданных произвольных чеков.
Тип | Формат запроса | ||
GET | /info/receipts/bydate/?start=2021-01-28&end=2021-02-28&sum_type[0]=sum_cashless&sum_type[1]=sum_cash&status[0]=created&status[1]=success | ||
Параметр | Назначение | ||
1. | start | Не обязательный. Дата начала периода в формате YYYY-MM-DD. | |
2. | end | Не обязательный. Дата конца периода в формате YYYY-MM-DD. | |
3. | status | Не обязательный. Массив значений. Фильтровать по статусу (created, request_sent, success, failed, timeout). | |
4. | receipt_type | Обязательный. Массив значений. Фильтровать по типу чека (sale, refund, correction). | |
5. | sum_type | Обязательный. Массив значений. Включить в выборку чеки, с указанным способом оплаты (sum_cashless, sum_cash, sum_advance, sum_credit). | |
6. | sort | Не обязательный. По умолчанию request_datetime. Сортировка по полю (payment_id, refund_id, request_datetime, obtain_datetime, status). | |
7. | direction | Не обязательный. По умолчанию DESC. Направление сортировки (ASC, DESC). | |
8. | from | Не обязательный. По умолчанию 0. Начало выборки. | |
9. | limit | Не обязательный. По умолчанию 10. Количество возвращаемых строк. | |
Таблица 8.1.1. Параметры запроса |
Если чеки будут найдены, то в ответ вернутся массивы объектов. {«receipts»:[…],»counts»:{…}}
Описание одного объекта массива receipts:
Тип | Формат ответа | |
Параметр | Назначение | |
1. | id | Идентификатор чека |
2. | payment_id | Номер платежа, по которому был сгенерирован чек. Может быть пустым, если чек генерировался не по платежу |
3. | type | Тип чека, sale, refund. |
4. | is_post_sale | Был ли данный чек сгенерирован как чек окончательного расчёта |
5. | refund_id | Порядковый номер возврата в рамках указанного платежа, если чек был сгенерирован по определённому возврату. |
6. | status | Статус чека. Может быть created, request_sent, success, timeout, failed. |
7. | contact | Почта или телефон плательщика |
8. | sum_cashless | Сумма, оплаченная безналичными |
9. | sum_cash | Сумма, оплаченная наличными |
10. | sum_advance | Сумма ранее проведённых предоплат или внесённых авансов |
11. | sum_credit | Сумма выданного кредита |
12. | cart | Корзина товаров, таблица 12.1. Строка, кодирующая массив объектов в JSON-формате. |
13. | receipt_properties | Дополнительные свойства чека, таблица 12.5. Строка, кодирующая объект в JSON-формате. |
14. | fpd | Фискальная подпись документа |
15. | fnd | Фискальный номер документа |
16. | fn | Номер фискального накопителя |
17. | ts | Момент времени формирования чека, строка в формате YYYYMMDDTHHmm |
18. | rnkkt | Регистрационный номер ККТ |
19. | shift_number | Номер смены |
20. | receipt_number | Номер чека в смене |
21. | obtain_datetime | Дата/Время проведения платежа |
22. | request_datetime | Дата/Время информирования магазина о проведённом платеже |
23. | fop_receipt_key | Ключ чека. Часть адреса постоянной страницы чека |
24. | fop_uuid | Уникальный идентификатор запроса к кассовому устройству |
25. | fop_url | Строка содержимого QR-кода чека |
Таблица 8.1.2 Параметры ответа на запрос (массив receipts) |
Описание объекта counts:
Тип | Формат ответа | |
Параметр | Назначение | |
1. | status | Количество найденных чеков по статусу печати. Пример: status.request_sent:4 |
2. | receipt_type | Количество найденных чеков по типу чека. Пример: receipt_type.sale:4 |
3. | sum_type | Количество найденных чеков по способу оплаты. Пример: sum_type.sum_cashless:4 |
4. | page_size | Общее количество найденных чеков на страницу |
5. | totals.sum_type | Количество чеков, сгруппированных по способу оплаты |
6. | totals.status | Количество чеков, сгруппированных по статусу печати |
7. | totals.receipt_type | Количество чеков, сгруппированных по типу чека |
8. | totals.total | Всего чеков для запроса без учёта количество показа на страницу |
Таблица 8.1.3 Параметры ответа на запрос (массив counts) |
Пример ответа на запрос:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
{ "receipts": [ { "id": "2107145011", "payment_id": "0", "type": "sale", "is_post_sale": "0", "refund_id": "0", "status": "request_sent", "contact": "", "sum_cashless": "1.00", "sum_cash": "0.00", "sum_advance": "0.00", "sum_credit": "0.00", "cart": [ { "item_type": "goods", "payment_type": "prepay", "sku": "", "name": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vehicula pharetra maximus. Phasellus ultrices, arcu at lacinia ", "price": "1", "quantity": "1", "item_code": "", "tax": "none", "sum": 1, "agent": { "type": "other", "phones": null, "operation": null, "inn": null, "name": null, "address": null, "transfer_phones": null, "receiver_phones": null }, "supplier": { "phones": [ "+79101234567" ], "inn": "5544332219", "name": "ООО ТЕСТ" } } ], "receipt_properties": "{\"client\":null,\"agent\":{\"type\":\"other\",\"phones\":null,\"operation\":null,\"inn\":null,\"name\":null,\"address\":null,\"transfer_phones\":null,\"receiver_phones\":null},\"supplier\":{\"phones\":[\"+79101234567\"],\"inn\":\"5544332219\",\"name\":\"\\u041e\\u041e\\u041e \\u0422\\u0415\\u0421\\u0422\"}}", "fpd": null, "fnd": null, "fn": null, "ts": null, "rnkkt": null, "shift_number": null, "receipt_number": null, "request_datetime": "2021-10-12 11:27:12", "obtain_datetime": null, "fop_receipt_key": "XjtaLpCw_kqfiiI", "fop_uuid": "27e80723-21e7-418b-9806-00f1a7e6aef8", "fop_url": null }, ], "counts": { "status": { "request_sent": 4 }, "receipt_type": { "sale": 4 }, "sum_type": { "sum_cashless": 4 }, "page_size": 4, "totals": { "sum_type": { "sum_cashless": 4, "sum_cash": 0, "sum_advance": 0, "sum_credit": 0 }, "status": { "created": 0, "request_sent": 4, "success": 0, "failed": 0, "timeout": 0 }, "receipt_type": { "sale": 4, "refund": 0, "expense": 0, "expense_refund": 0, "correction": 0 }, "total": 4 } } } |
8.2. Получение количеств чеков за период, сгруппированных по типам.
Тип | Формат запроса | ||
GET | /info/receipts/bydatecount/?start=2020-10-18&end=2021-10-18 | ||
Параметр | Назначение | ||
1. | start | Дата начала периода в формате YYYY-MM-DD. | |
2. | end | Дата конца периода в формате YYYY-MM-DD. | |
Таблица 8.2.1. Параметры запроса |
Описание возвращаемого объекта:
Тип | Формат ответа | |
Параметр | Назначение | |
1. | status | Количество найденных чеков по статусу печати. Пример: status.created:4 |
2. | receipt_type | Количество найденных чеков по типу чека. Пример: receipt_type.sale:4 |
3. | sum_type | Количество найденных чеков по способу оплаты. Пример: sum_type.sum_cashless:4 |
8. | total | Всего чеков для запроса |
Таблица 8.1.3 Параметры ответа на запрос |
Пример ответа на запрос:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
{ "sum_type": { "sum_cashless": 15, "sum_cash": 0, "sum_advance": 5, "sum_credit": 0 }, "status": { "created": 1, "request_sent": 11, "success": 7, "failed": 1, "timeout": 0 }, "receipt_type": { "sale": 20, "refund": 0, "expense": 0, "expense_refund": 0, "correction": 0 }, "total": 20 } |
8.3. Получение чеков по платежу /info/receipts/bypaymentid/
Запрос покажет чеки окончательного расчёта и произвольные чеки, сгенерированные по данному платежу. В настоящее время запрос не покажет самый первый чек, выданный при получении платежа.
Тип | Формат запроса | ||
GET | /info/receipts/bypaymentid/?payment_id=2211 | ||
Параметр | Назначение | ||
1. | payment_id | Идентификатор платежа, по которому необходимо получить данные | |
Таблица 8.3.1. Параметры запроса |
Если по данному платежу не было чеков окончательного расчёта или на произвольные суммы, то ответ будет пустым. Если чеки есть, они вернутся в виде массива структур, описанных в таблице 8.4.2
8.4. Получение чека по его идентификатору /info/receipts/byid/
С помощью этого запроса можно получить чек по его идентификатору:
Тип | Формат запроса | ||
GET | /info/receipts/byid/?id=4201 | ||
Параметр | Назначение | ||
1. | id | Идентификатор чека | |
Таблица 8.4.1. Параметры запроса |
Если чек с таким номером не будет найден, ответ будет пустым. Если чек будет найден, то в ответ вернётся объект следующего вида:
Тип | Формат ответа | |
Параметр | Назначение | |
1. | id | Идентификатор чека |
2. | payment_id | Номер платежа, по которому был сгенерирован чек. Может быть пустым, если чек генерировался не по платежу |
3. | type | Тип чека: sale, refund, expense, expense-refund |
4. | is_post_sale | Был ли данный чек сгенерирован как чек окончательного расчёта, строка "0" или "1" |
5. | is_correction | Является ли чек чеком коррекции по ФФД 1.2, строка "0" или "1" |
6. | refund_id | Порядковый номер возврата в рамках указанного платежа, если чек был сгенерирован по определённому возврату. |
7. | status | Статус чека. Может быть created, sending, rejected, request_sent, success, timeout, failed . |
8. | contact | Почта или телефон плательщика |
9. | sum_cashless | Сумма, оплаченная безналичными |
10. | sum_cash | Сумма, оплаченная наличными |
11. | sum_advance | Сумма ранее проведённых предоплат или внесённых авансов |
12. | sum_credit | Сумма выданного кредита |
13. | sum_counter_payment | Сумма встречным предоставлением |
14. | cart | Корзина товаров, таблица 12.1. Строка, кодирующая массив объектов в JSON-формате. |
15. | receipt_properties | Дополнительные свойства чека, таблица 12.5. Строка, кодирующая объект в JSON-формате. |
16. | fpd | Фискальная подпись документа |
17. | fnd | Фискальный номер документа |
18. | fn | Номер фискального накопителя |
19. | ts | Момент времени формирования чека, строка в формате YYYYMMDDTHHmm |
20. | rnkkt | Регистрационный номер ККТ |
21. | shift_number | Номер смены |
22. | receipt_number | Номер чека в смене |
23. | obtain_datetime | Дата/Время проведения платежа |
24. | request_datetime | Дата/Время информирования магазина о проведённом платеже |
25. | fop_receipt_key | Ключ чека. Часть адреса постоянной страницы чека |
26. | fop_uuid | Уникальный идентификатор запроса к кассовому устройству |
27. | fop_url | Строка содержимого QR-кода чека |
28. | custom_params | JSON-строка с дополнительными атрибутами чека. Используется для чеков коррекции ФФД 1.2 |
29. | error | JSON-строка, содержащая описание ошибки, если чек не был напечатан. |
Таблица 8.4.2 Параметры ответа на запрос |
Пример ответа на запрос:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
{ "id": "4201", "payment_id":"2098", "type":"sale", "is_post_sale":"1", "is_correction":"1", "refund_id":null, "status":"success", "contact":"client@mail.ru", "sum_cashless":"0.00", "sum_cash":"0.00", "sum_advance":"15529.10", "sum_credit":"0.00", "sum_counter_payment":"0.00", "cart":"[{\"name\":\"TEST 3\",\"quantity\":1,\"price\":15529.10,\"sum\":15529.10,\"tax\":\"none\",\"payment_type\":\"full\"}]", "receipt_properties":"null", "fpd":"2020473855", "fnd":"8930", "fn":"9999078900001341", "ts":"20190621T1638", "rnkkt":"0000000400054952", "shift_number":"7123", "receipt_number":"6162", "obtain_datetime":"2019-05-11 09:12:22", "request_datetime":"2019-05-11 09:12:01", "fop_receipt_key":"VhamK7kl", "fop_uuid":"6ee-cs-130", "fop_url":"t=20190511T0912&s=15529.10&fn=9999078900001341&i=8930&fp=2020473855&n=1", "custom_params": "{\"correction_type\":\"self\",\"correction_operation_date\":\"2022-04-11\"}", "error":null } |
В поле 7 вернётся один из статусов чека. Если чек находится в финальном статусе, его дальнейшее изменение невозможно. При достижении чеком финального статуса в адрес информационной системы ТСП будет направлено callback-уведомление о печати чека. Возможны следующие статусы чеков:
Статус | Описание статуса | Финальный |
created | Запрос на печать чека принят, ожидается отправка в сервис-балансировщик. | нет |
sending | Запрос отправляется в сервис-балансировщик. | нет |
rejected | Сервис-балансировщик отказал в принятии чека, повторение чека без изменения чека или настроек подключения бесполезно. Детали ошибки могут быть приведены в поле ошибки 29. | да |
request_sent | Запрос принят сервисом-балансировщиком и будет передан в устройство ККТ. | нет |
success | Чек сформирован. | да |
timeout | Чек находился в очереди на печать длительное время без результата, и был из неё выброшен. Наиболее вероятно, что ККТ не подключена или не готова к приёму запросов. | да |
failed | От ККТ получен отказ в печати чека. Детали ошибки могут быть приведены в поле ошибки 29. | да |
Таблица 8.4.3. Статусы чека |
При необходимости можно сформировать ссылку на чек по следующему шаблону:
1 |
https://%адрес сервера Paykeeper%/receipt/%fop_receipt_key%/?rc_id=%id% |
Для чеков коррекции по ФФД 1.2 в поле custom_params будет возвращена JSON-строка, представляющая собой следующий объект:
28.1 | correction_type | Тип коррекции: self, by_order (самостоятельная, по предписанию ФНС). |
28.2 | correction_operation_date | Дата совершения корректируемого расчёта. Формат: YYYY-MM-DD (тег 1178). |
28.3 | correction_document_number | Номер предписания налогового органа, если correction_type равен by_order (тег 1179), строка до 32 символов. |
Если попытка напечатать чек окончилась неудачей (то есть чек находится в статусе rejected или failed), в ответе будет заполнено поле error. Оно будет содержать JSON-строку, содержащую объект ошибки:
29.1 | type | Тип ошибки — syntax_error, ffd_error, item_code_error, print_error, queue_error |
29.2 | message | Словесная расшифровка причины ошибки |
29.3 | error_id | Идентификатор события ошибки в логах системы |
Значения различных типов ошибок приведены в следующей таблице:
syntax_error | Запрос содержит синтаксические ошибки в значении одного или нескольких параметров. Отказ до отправки в ФН. |
ffd_error | Запрос содержит теги или сочетания тегов, не допустимые согласно ФФД кассового устройства. Отказ при отправке в ФН. |
item_code_error | Код «Честный знак» товара не прошёл валидацию, а ККТ настроена на режим отклонения чеков с не валидными кодами |
print_error | Общая ошибка, без указания конкретной причины, на этапе обработки запроса в ККТ |
queue_error | Ошибка постановки чека в очередь, до передачи запроса в ККТ. |
8.5. Поиск чеков по фискальным атрибутам.
Тип | Формат запроса | ||
GET | /info/receipts/search/?start=2020-10-18&end=2021-10-18&query=12345 | ||
Параметр | Назначение | ||
1. | start | Дата начала периода в формате YYYY-MM-DD. | |
2. | end | Дата конца периода в формате YYYY-MM-DD. | |
3. | query | Строка для поиска. Поиск ведется по полям id, payment_id, contact. Можно выполнять поиск по части строки | |
Таблица 8.5.1. Параметры запроса |
Формат ответа описан в таблице 8.1.1.
8.6. ЗАРЕЗЕРВИРОВАНО ЗАРЕЗЕРВИРОВАНО
В настоящее время не используется
8.7. ЗАРЕЗЕРВИРОВАНО ЗАРЕЗЕРВИРОВАНО
В настоящее время не используется
8.8. ЗАРЕЗЕРВИРОВАНО ЗАРЕЗЕРВИРОВАНО
В настоящее время не используется
8.9. ЗАРЕЗЕРВИРОВАНО ЗАРЕЗЕРВИРОВАНО
В настоящее время не используется
8.10. ЗАРЕЗЕРВИРОВАНО ЗАРЕЗЕРВИРОВАНО
В настоящее время не используется
8.11. Сгенерировать чек по платежу или с произвольными атрибутами /change/receipt/print/
Печать произвольного чека происходит в асинхронном режиме. Необходимо отправить данный запрос, а результат запроса проверить через некоторое время (рекомендуется не ранее, чем через 2 минуты).
Тип | Формат запроса | |
Параметр | Назначение | |
POST | /change/receipt/print/ | |
1. | payment_id | Номер платежа, по которому нужно выдать чек. Может быть пустым (пустая строка: '' ). Передавать обязательно! |
2. | type | Тип чека, строка sale, refund, expense, expense-refund |
3. | is_post_sale | Пометить как чек окончательного расчёта, строка true или false. При type = refund не передаётся. |
4. | is_correction | Для выдачи чека коррекции по ФФД 1.2. Строка true или false. |
5. | refund_id | Порядковый номер возврата в рамках указанного платежа. Может быть пустым ( '' ). |
6. | contact | Почта или телефон плательщика. Телефон передаётся строкой в формате +79101234567 |
7. | sum_cashless | Сумма, оплаченная безналичными |
9. | sum_cash | Сумма, оплаченная наличными |
10. | sum_advance | Сумма ранее проведённых предоплат или внесённых авансов |
11. | sum_credit | Сумма выданного кредита |
12. | sum_counter_payment | Сумма встречным предоставлением |
13. | cart | Корзина товаров, таблица 12.1. Строка, кодирующая массив объектов в JSON-формате. |
14. | receipt_properties | Дополнительные свойства чека, таблица 12.5. Строка, кодирующая объект в JSON-формате. |
15. | receipt_key | Уникальный ключ чека, строка длиной не менее 6 символов. Будет отображаться как часть адреса постоянной страницы чека. |
Таблица 8.11.1. Параметры запроса |
При генерации чеков, не связанных с платежами в PayKeeper, рекомендуется оставлять пустыми payment_id и refund_id, а для сопоставления чека с операцией в информационной системе предприятия заполнять receipt_key своим уникальным идентификатором. Ключ чека рекомендуется составлять из символов a-z, A-Z, _, -, 0-9 достаточно длинным, чтобы не была возможна атака перебором. Результатом данного запроса будет объект с идентификатором чека:
1 2 3 |
{ 'receipt_id' : 816 } |
Система не примет запрос, если с данными payment_id, refund_id, is_post_sale, type, receipt_key уже есть успешно сгенерированный или находящийся в процессе генерации чек, или чек, по которому наступил таймаут генерации. В последнем случае ранее отосланный запрос может оказаться успешным, и статус чека будет загружен позднее. Если требуется отправить чек, сохранив связь с платежом или возвратом, но с такими данными чек уже ранее был сгенерирован, нужно сгенерировать для него новый ключ чека.
При формировании чека коррекции по ФФД 1.2 в запросе, помимо поля is_correction = true, нужно передать дополнительные поля в POST-запросе:
4.1 | correction_type | Тип коррекции, строка: self, by_order |
4.2 | correction_operation_date | Дата совершения корректируемого расчёта. Формат: YYYY-MM-DD (тег 1178) |
4.3 | correction_document_number | Номер предписания налогового органа. Нужно передавать, если correction_type равен by_order (тег 1179), строка до 32 символов. |
8.12. Отправить запрос о состоянии чеков кассовому устройству. Если у чека нет фискальных атрибутов, этот запрос может их получить. ЗАРЕЗЕРВИРОВАНО
В настоящее время не используется
8.13. Уведомление системы ТСП о достижении чеком финального статуса
Когда запрос на печать чека переходит в один из финальных статусов (см таблицу 8.4.3), в адрес сайта ТСП может быть отправлен POST-запрос уведомления о статусе чека. Это уведомление направляется однократно, без проверки принятия данного запроса сайтом ТСП.
В теле POST-запроса будут перечислены все параметры из таблицы 8.4.2, но дополнительно будет передана цифровая подпись запроса в параметре sign. Подпись вычисляется следующим образом: все переданные (в том числе пустые) параметры запроса сортируются в алфавитном порядке своих ключей, значения в виде строк конкатенируются через разделитель точка с запятой, берётся hmac_sha256 от этой строки с ключом — секретным словом POST-уведомлений.
Пример вычисления цифровой подписи запроса на языке PHP:
1 2 3 4 5 6 7 8 9 10 11 |
<?php $request = $_POST; $pk_key = "Секретный клиентский ключ"; unset($request['sign']); ksort($request); $to_hash = implode(';', $request); $sign = hash_hmac('sha256', $to_hash, $pk_key); if(strtoupper($sign) == strtoupper($_POST['sign'])) { // подпись верна } |