Фискализация (Receipt)

Для клиентов Robokassa, использующих Облачное решение, Кассовое решение или решение Робочеки, необходимо передавать параметр Receipt для фискализации платежей в соответствии с требованиями ФЗ-54.

Важно

  • Отсутствие номенклатуры в чеке является нарушением ФЗ-54

  • Параметр Receipt должен быть включен в расчет контрольной подписи

  • Рекомендуется использовать метод POST для передачи запросов с Receipt

  • Для решений Робочеки и Облачное в чеке не может быть более ста товарных позиций

Базовый пример с Pydantic моделями

Рекомендуемый способ - использование Pydantic моделей с enums:

from decimal import Decimal
from aiorobokassa import (
    RoboKassaClient,
    Receipt,
    ReceiptItem,
    TaxRate,
    TaxSystem,
    PaymentMethod,
    PaymentObject,
)

async with RoboKassaClient(
    merchant_login="your_merchant_login",
    password1="password1",
    password2="password2",
) as client:
    # Создаем позицию чека
    item = ReceiptItem(
        name="Название товара 1",
        quantity=1,
        sum=Decimal("100.00"),
        tax=TaxRate.VAT10,
        payment_method=PaymentMethod.FULL_PAYMENT,
        payment_object=PaymentObject.COMMODITY,
    )

    # Создаем чек
    receipt = Receipt(
        items=[item],
        sno=TaxSystem.OSN,
    )

    url = client.create_payment_url(
        out_sum=Decimal("100.00"),
        description="Payment for goods",
        receipt=receipt,  # Передаем Receipt модель
    )

Базовый пример с dict

Также можно передать receipt как словарь:

from decimal import Decimal
from aiorobokassa import RoboKassaClient

async with RoboKassaClient(
    merchant_login="your_merchant_login",
    password1="password1",
    password2="password2",
) as client:
    receipt_data = {
        "sno": "osn",
        "items": [
            {
                "name": "Название товара 1",
                "quantity": 1,
                "sum": 100,
                "payment_method": "full_payment",
                "payment_object": "commodity",
                "tax": "vat10",
            }
        ],
    }

    url = client.create_payment_url(
        out_sum=Decimal("100.00"),
        description="Payment for goods",
        receipt=receipt_data,  # Передаем как dict
    )

Передача как JSON строка

Также можно передать receipt как JSON строку:

receipt_json = '{"sno":"osn","items":[{"name":"Товар","quantity":1,"sum":100,"tax":"vat10"}]}'

url = client.create_payment_url(
    out_sum=Decimal("100.00"),
    description="Payment",
    receipt=receipt_json,  # Передаем как JSON строку
)

Параметры Receipt

sno (Система налогообложения)

Необязательное поле, если у организации имеется только один тип налогообложения.

Возможные значения:

  • osn - Общая СН

  • usn_income - Упрощенная СН (доходы)

  • usn_income_outcome - Упрощенная СН (доходы минус расходы)

  • esn - Единый сельскохозяйственный налог

  • patent - Патентная СН

items (Массив товаров)

Обязательный массив данных о позициях чека.

Обязательные поля для каждого товара:

  • name - Наименование товара (максимум 128 символов)

  • quantity - Количество товаров

  • sum - Полная сумма в рублях за все количество товара

  • tax - Налоговая ставка (см. ниже)

Опциональные поля:

  • cost - Цена за единицу товара (можно передать вместо sum)

  • payment_method - Признак способа расчёта

  • payment_object - Признак предмета расчёта

  • nomenclature_code - Код маркировки товара

Налоговые ставки (tax)

Обязательное поле для каждого товара:

  • none - Без НДС

  • vat0 - НДС по ставке 0%

  • vat10 - НДС по ставке 10%

  • vat110 - НДС по расчетной ставке 10/110

  • vat20 - НДС по ставке 20%

  • vat120 - НДС по расчетной ставке 20/120

  • vat5 - НДС по ставке 5%

  • vat7 - НДС по ставке 7%

  • vat105 - НДС по расчетной ставке 5/105

  • vat107 - НДС по расчетной ставке 7/107

Признаки способа расчёта (payment_method)

  • full_prepayment - Предоплата 100%

  • prepayment - Предоплата

  • advance - Аванс

  • full_payment - Полный расчёт

  • partial_payment - Частичный расчёт и кредит

  • credit - Передача в кредит

  • credit_payment - Оплата кредита

Признаки предмета расчёта (payment_object)

  • commodity - Товар

  • excise - Подакцизный товар

  • job - Работа

  • service - Услуга

  • gambling_bet - Ставка азартной игры

  • gambling_prize - Выигрыш азартной игры

  • lottery - Лотерейный билет

  • lottery_prize - Выигрыш лотереи

  • intellectual_activity - Предоставление результатов интеллектуальной деятельности

  • payment - Платеж

  • agent_commission - Агентское вознаграждение

  • composite - Составной предмет расчета

  • resort_fee - Курортный сбор

  • another - Иной предмет расчета

  • property_right - Имущественное право

  • non-operating_gain - Внереализационный доход

  • insurance_premium - Страховые взносы

  • sales_tax - Торговый сбор

  • tovar_mark - Товар, подлежащий маркировке

Примеры

Чек с несколькими товарами (с Pydantic моделями)

from aiorobokassa import Receipt, ReceiptItem, TaxRate, TaxSystem, PaymentMethod, PaymentObject
from decimal import Decimal

items = [
    ReceiptItem(
        name="Товар 1",
        quantity=1,
        sum=Decimal("100.00"),
        tax=TaxRate.VAT10,
        payment_method=PaymentMethod.FULL_PAYMENT,
        payment_object=PaymentObject.COMMODITY,
    ),
    ReceiptItem(
        name="Товар 2",
        quantity=2,
        cost=Decimal("100.00"),  # Цена за единицу (sum будет вычислена автоматически)
        tax=TaxRate.VAT20,
        payment_method=PaymentMethod.FULL_PAYMENT,
        payment_object=PaymentObject.COMMODITY,
    ),
]

receipt = Receipt(items=items, sno=TaxSystem.OSN)

Чек с маркированным товаром

from aiorobokassa import Receipt, ReceiptItem, TaxRate, TaxSystem

item = ReceiptItem(
    name="Маркированный товар",
    quantity=1,
    sum=Decimal("100.00"),
    tax=TaxRate.VAT10,
    nomenclature_code="04620034587217",  # Код маркировки
)

receipt = Receipt(items=[item], sno=TaxSystem.OSN)

Чек с услугами

from aiorobokassa import Receipt, ReceiptItem, TaxRate, TaxSystem, PaymentMethod, PaymentObject

item = ReceiptItem(
    name="Консультация",
    quantity=1,
    sum=Decimal("500.00"),
    tax=TaxRate.VAT20,
    payment_method=PaymentMethod.FULL_PAYMENT,
    payment_object=PaymentObject.SERVICE,
)

receipt = Receipt(items=[item], sno=TaxSystem.USN_INCOME)

Правила формирования чека

  1. В чеке должна быть хотя бы одна позиция

  2. Во всех позициях должно быть указано наименование

  3. Наименование не должно содержать спецсимволов (кроме русского и английского)

  4. Наименование не должно превышать 128 символов

  5. Цена и сумма позиции не должны быть отрицательными

  6. Общая сумма всех позиций должна быть больше нуля

  7. Сумма всех позиций в чеке должна быть равна сумме операции (out_sum)

  8. Все телефоны должны быть в формате “+Ц” (максимум 18 цифр)

Важные замечания

  1. Подпись: Receipt автоматически включается в расчет подписи

  2. URL-кодирование: Receipt автоматически URL-кодируется перед отправкой

  3. Валидация: Библиотека проверяет, что receipt является валидным JSON

  4. POST метод: Рекомендуется использовать POST для запросов с Receipt из-за возможной большой длины

Пример полного использования

import asyncio
from decimal import Decimal
from aiorobokassa import RoboKassaClient

async def main():
    async with RoboKassaClient(
        merchant_login="your_merchant_login",
        password1="password1",
        password2="password2",
    ) as client:
        receipt_data = {
            "sno": "osn",
            "items": [
                {
                    "name": "Товар 1",
                    "quantity": 2,
                    "sum": 200,
                    "cost": 100,
                    "payment_method": "full_payment",
                    "payment_object": "commodity",
                    "tax": "vat10",
                },
                {
                    "name": "Услуга",
                    "quantity": 1,
                    "sum": 300,
                    "payment_method": "full_payment",
                    "payment_object": "service",
                    "tax": "vat20",
                },
            ],
        }

        url = client.create_payment_url(
            out_sum=Decimal("500.00"),  # Сумма должна совпадать с суммой позиций
            description="Payment for order #123",
            inv_id=123,
            email="customer@example.com",
            receipt=receipt_data,
        )

        print(f"Payment URL: {url}")

asyncio.run(main())