Фискализация (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/110vat20- НДС по ставке 20%vat120- НДС по расчетной ставке 20/120vat5- НДС по ставке 5%vat7- НДС по ставке 7%vat105- НДС по расчетной ставке 5/105vat107- НДС по расчетной ставке 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)
Правила формирования чека¶
В чеке должна быть хотя бы одна позиция
Во всех позициях должно быть указано наименование
Наименование не должно содержать спецсимволов (кроме русского и английского)
Наименование не должно превышать 128 символов
Цена и сумма позиции не должны быть отрицательными
Общая сумма всех позиций должна быть больше нуля
Сумма всех позиций в чеке должна быть равна сумме операции (out_sum)
Все телефоны должны быть в формате “+Ц” (максимум 18 цифр)
Важные замечания¶
Подпись: Receipt автоматически включается в расчет подписи
URL-кодирование: Receipt автоматически URL-кодируется перед отправкой
Валидация: Библиотека проверяет, что receipt является валидным JSON
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())