PayKeeper поддерживает автоматическую генерацию чеков согласно 54-ФЗ.
URI | Назначение | |
---|---|---|
8.1 | URI:/info/receipts/bydate/ | Назначение:Получение реестра чеков за период, с фильтром по типам. |
8.2 | URI:/info/receipts/bydatecount/ | Назначение:Получение количеств чеков за период, сгруппированных по типам |
8.3 | URI:/info/receipts/bypaymentid/ | Назначение:Получение информации о чеках, выданных по указанному платежу |
8.4 | URI:/info/receipts/byid/ | Назначение:Получение информации о чеке по его внутреннему номеру |
8.5 | URI:/info/receipts/search/ | Назначение:Поиск чеков по фискальным атрибутам |
8.6 | URI:ЗАРЕЗЕРВИРОВАНО | Назначение:ЗАРЕЗЕРВИРОВАНО |
8.7 | URI:ЗАРЕЗЕРВИРОВАНО | Назначение:ЗАРЕЗЕРВИРОВАНО |
8.8 | URI:ЗАРЕЗЕРВИРОВАНО | Назначение:ЗАРЕЗЕРВИРОВАНО |
8.9 | URI:ЗАРЕЗЕРВИРОВАНО | Назначение:ЗАРЕЗЕРВИРОВАНО |
8.10 | URI:ЗАРЕЗЕРВИРОВАНО | Назначение:ЗАРЕЗЕРВИРОВАНО |
8.11 | URI:/change/receipt/print/ | Назначение:Сгенерировать чек по платежу или с произвольными атрибутами |
8.12 | URI:ЗАРЕЗЕРВИРОВАНО | Назначение:Отправить запрос о состоянии чеков кассовому устройству. Если у чека нет фискальных атрибутов, этот запрос может их получить. |
8.13 | URI:Callback о статусе чека | Назначение:Уведомление системы ТСП о достижении чеком финального статуса |
Результатом будет список выданных произвольных чеков.
Тип | Формат запроса | |
Тип: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 } } } |
Тип | Формат запроса | |
Тип: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 } |
Запрос покажет чеки окончательного расчёта и произвольные чеки, сгенерированные по данному платежу. В настоящее время запрос не покажет самый первый чек, выданный при получении платежа.
Тип | Формат запроса | |
Тип:GET | Формат запроса:/info/receipts/bypaymentid/?payment_id=2211 |
Параметр | Назначение | |
1. | Параметр:payment_id | Назначение:Идентификатор платежа, по которому необходимо получить данные |
Таблица 8.3.1. Параметры запроса |
Если по данному платежу не было чеков окончательного расчёта или на произвольные суммы, то ответ будет пустым. Если чеки есть, они вернутся в виде массива структур, описанных в таблице 8.4.2
С помощью этого запроса можно получить чек по его идентификатору:
Тип | Формат запроса | |
Тип: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. Статусы чека |
При необходимости можно сформировать ссылку на чек по следующему шаблону:
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 | Ошибка постановки чека в очередь, до передачи запроса в ККТ. |
Тип | Формат запроса | |
Тип: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.
В настоящее время не используется
В настоящее время не используется
В настоящее время не используется
В настоящее время не используется
В настоящее время не используется
Печать произвольного чека происходит в асинхронном режиме. Необходимо отправить данный запрос, а результат запроса проверить через некоторое время (рекомендуется не ранее, чем через 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.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'])) { // подпись верна } |