При покупках в интернет-магазинах клиенты, чаще всего, приобретают более одного товара. В такой ситуации для соответствия 54-ФЗ в налоговую необходимо передавать чек покупки со сведениями обо всех приобретённых товарах и услугах. Обычно сформировать список покупок в конкретном заказе не составляет труда, поскольку при оформлении заказа в большинстве современных решений для интернет-магазина используется так называемая корзина товаров (по аналогии с корзинкой для товаров в супермаркетах), которую покупатель наполняет, просматривая витрину интернет-магазина.
Для формирования корректного чека необходимо в процессе инициализации оплаты передать содержимое корзины заказа. Чтобы это сделать, нужно сформировать JSON-массив объектов товарных позиций и передать в параметре cart POST-запроса на создание платежа, вместе с остальными параметрами платежа.
Формат одного объекта товарной позиции следующий:
Поле | Назначение | Обязательное |
name | Наименование экземпляра товара | Да |
price | Стоимость единичного экземпляра товара | Да |
quantity | Количество экземпляров товара в данной позиции | Да |
sum | Полная сумма к уплате по данной товарной позиции, включая НДС | Да |
tax | Код налога, применяющегося к данной позиции | Да |
tax_sum | Сумма налога к уплате по данной товарной позиции, уже должна быть учтена в поле sum. Было обязательным до 2019 года. Не рекомендуется заполнять на данный момент. | Нет |
item_type | Код признака предмета расчёта (категория товара/услуги). Значение по умолчанию – «ТОВАР» | Нет |
payment_type | Код признака расчёта. Значение по умолчанию – «ПРЕДОПЛАТА 100%» | Нет |
Таблица 12.1 Поля объекта товарной позиции |
Для поля tax предусмотрены следующие возможные коды:
Код | Значение |
none | НДС не облагается |
vat0 | НДС 0% |
vat10 | НДС 10% |
vat20 | НДС 20% |
vat110 | НДС 10/110 |
vat120 | НДС 20/120 |
Таблица 12.2 Типы налогов |
Все поля данного объекта должны быть в кодировке UTF-8.
Также необходимо обратить внимание — ставки «НДС 0%» и «НДС не облагается» применяются в разных случаях. Для предприятий, работающих по упрощённой схеме налогообложения, нужно указывать none — «НДС не облагается».
Сумма полных стоимостей товарных позиций должна быть равна полной стоимости заказа.
Для соответствия ФФД 1.05 для каждой товарной позиции указывать код признака предмета расчёта и код признака расчёта. Для этих целей введены два необязательных поля: item_type и payment_type соответственно.
Для поля item_type предусмотрены следующие возможные коды:
Код | Значение |
goods | Товар |
service | Услуга |
work | Работа |
excise | Подакцизный товар |
ip | Интеллектуальная деятельность, права на интеллектуальную собственность |
payment | Аванс, задаток, предоплата, взнос или другой платёж |
agent | Вознаграждение агента |
Таблица 12.3 Типы предметов расчёта |
Для поля payment_type предусмотрены следующие возможные коды:
Код | Значение |
prepay | Предоплата 100% |
part_prepay | Частичная предоплата |
advance | Аванс |
full | Полная оплата в момент передачи предмета расчёта |
Таблица 12.4 Типы признаков расчёта |
Указать список товарных позиций можно также при выставлении счёта через наш JSON API. В этом случае на размер результирующего объекта cart накладываются некоторые ограничения — в данный момент максимальная длина текста в переменной service_name составляет 10240 символов, и, таким образом, размер объекта ограничен 10234 символами (6 символов на спец. идентификатор). Передавать объект нужно в переменной service_name внутри специального идентификатора:
;PKC|JSON_массив_объектов_товарных_позиций|
Формирование корзины на PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
"cart" => json_encode( array ( array ( "name" => 'Стол обеденный 2x3', "price" => 10.01, "quantity" => 1, "sum" => 10.01, "tax" => 'vat20', "item_type" => 'goods', "payment_type" => 'prepay' ), array ( "name" => 'Книга о вкусной и здоровой пище', "price" => 1.01, "quantity" => 3, "sum" => 3.03, "tax" => 'vat10' ) ) ) |
Формирование корзины на PHP с созданием счёта через JSON API:
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 |
<?php # Логин и пароль любого пользователя личного кабинета $user = "user"; $password = "password"; # имя или IP-адрес вашего сервера с PayKeeper $server = "example.server.paykeeper.ru"; # параметры платежа. Обязательной является только сумма. $payment_data = array ( "pay_amount" => 7.50, "clientid" => "Иванов Иван Иванович", "orderid" => "Заказ № 10", "client_email" => "test@example.com", # передача корзины товаров для формирования чека по 54-ФЗ "service_name" => ";PKC|".json_encode( array ( array ( "name" => 'Стол обеденный 2x3', "price" => 1.50, "quantity" => 1, "sum" => 1.50, "tax" => 'none', ), array ( "name" => 'Книга о вкусной и здоровой пище', "price" => 2, "quantity" => 3, "sum" => 6, "tax" => 'none', ) ))."|", "client_phone" => "8 (910) 123-45-67" ); $auth_header = array ( 'Authorization: Basic '.base64_encode("$user:$password") ); $context = stream_context_create(array ( 'http' => array ( 'header' => $auth_header ) ) ); $result = json_decode(file_get_contents("http://$server/info/settings/token", FALSE, $context), TRUE); $token = $result['token']; $request = array_merge($payment_data, array ('token'=>$token)); $request_string = http_build_query($request); $request_headers = array_merge($auth_header, array("Content-type: application/x-www-form-urlencoded")); $context = stream_context_create(array ( 'http' => array ( 'method' => 'POST', 'header' => $request_headers, 'content' => $request_string ) ) ); $result = json_decode(file_get_contents("http://$server/change/invoice/preview", FALSE, $context), TRUE); $invoice_id = $result['invoice_id']; # в этой переменной прямая ссылка на оплату с заданными параметрами. $link = "https://$server/bill/$invoice_id/"; echo $link; ?> |
Рассмотренные выше примеры кода позволяют сформировать и передать товарную корзину для дальнейшего корректного формирования чека в соответствии с 54-ФЗ на стороне поддерживаемого PayKeeper кассового решения.
Менеджер перезвонит вам и расскажет про детали подключения