🔧 Robokassa • API • Python

Интеграция Robokassa: полное руководство разработчика

Полное техническое руководство по интеграции Robokassa: хеш-подпись MD5/SHA256, Result URL, мультивалюта, цифровые товары.

Интеграция Robokassa: полное руководство разработчика
19 мин чтения ~5300 слов 25 августа 2026 г. Дмитрий Малышев

Интеграция Robokassa: пошаговое руководство с примерами кода

Robokassa — один из старейших платёжных агрегаторов в России (работает с 2003 года). 70+ способов оплаты, поддержка 15 валют, встроенная фискализация. По данным Robokassa, через их систему проходит более 500 000 транзакций в день.

В отличие от ЮKassa, Robokassa использует хеш-подпись для верификации запросов — и именно здесь 80% разработчиков допускают ошибки. Неправильный порядок параметров, неверный алгоритм хеширования, отсутствие проверки подписи ответа — и платёж не проходит или, что хуже, мошенники обходят защиту.

Я интегрировал Robokassa в 15+ проектов — от интернет-магазинов до Telegram-ботов с оплатой за цифровые товары. В этой статье — полное техническое руководство: от регистрации до обработки webhook, с примерами кода на Python, которые можно скопировать и использовать.

Если нужна интеграция Robokassa в Telegram-бота под ключ — это от 15 000 ₽ и 3–5 дней.

Полезные материалы по теме
Интеграция Robokassa за 3–5 дней от 15 000 ₽заказать интеграцию Robokassa
Обзор всех платёжных провайдеровинтеграция платежей в Telegram
Альтернативный провайдер — ЮKassaинтеграция ЮKassa API
Практические сценарии приёма оплатыприём оплаты через Telegram-бота
Подключение внешних сервисов к ботуразработка API интеграций

Robokassa vs ЮKassa: когда выбирать Robokassa

Перед интеграцией важно понять, когда Robokassa лучше ЮKassa, и наоборот.

Сравнительная таблица

ПараметрRobokassaЮKassa
Способы оплаты70+ (карты, кошельки, терминалы, крипто)Карты, СБП, ЮMoney, SberPay
Комиссия (карты)2,5–3,5%2,8–3,5%
Комиссия (СБП)0,4–0,7%
Валюты15 (RUB, USD, EUR, UAH, KZT...)RUB
Хеш-подписьMD5 / SHA256Basic Auth + webhook подпись
Фискализация
Рекуррентные платежи
Sandbox
Минимальная комиссия15 ₽
Лучше всего дляАльтернативные способы, мультивалютаРоссийский бизнес, СБП

Когда выбирать Robokassa: • Нужны альтернативные способы оплаты (кошельки, терминалы, криптовалюта) • Клиенты платят в разных валютах (USD, EUR, KZT) • Нужна поддержка Qiwi, WebMoney, Яндекс.Деньги • Минимальная комиссия 15 ₽ выгодна для микроплатежей

Когда выбирать ЮKassa: • Основной рынок — Россия • Нужна СБП (0,4% комиссии) • Нужна простая интеграция (SDK vs HTTP) • Нужны рекуррентные платежи (проще настроить)

Регистрация и настройка Robokassa

Пошаговая инструкция по регистрации и получению ключей.

Шаг 1: Регистрация магазина

  1. 1.Зайдите на robokassa.ru и нажмите «Подключить магазин»
  2. 2.Заполните форму: название магазина, сайт, email, телефон
  3. 3.Загрузите документы: ИНН, ОГРН/ОГРНИП, паспорт
  4. 4.Дождитесь верификации: 1–2 дня
  5. 5.Получите логин (MerchantLogin), пароль №1 (Password1) и пароль №2 (Password2)

Важно:Password1 — используется для формирования подписи запроса (отправляется на сервер Robokassa) • Password2 — используется для проверки подписи ответа (НИКОГДА не передаётся в запросах) • Никогда не храните Password2 на клиентской стороне

Шаг 2: Настройка магазина

В личном кабинете Robokassa настройте:

  1. 1.Result URL — URL для получения уведомлений об оплате (аналог webhook)
  2. 2.Success URL — URL перенаправления после успешной оплаты
  3. 3.Fail URL — URL перенаправления при ошибке оплаты
  4. 4.Способы оплаты — выберите нужные (карты, кошельки, терминалы)
  5. 5.Валюта — основная валюта магазина
ПараметрОписаниеПример
Result URLСерверный endpoint для уведомленийhttps://domain.com/robokassa/result
Success URLСтраница «Спасибо за оплату»https://t.me/your_bot
Fail URLСтраница «Оплата не прошла»https://t.me/your_bot
MerchantLoginЛогин магазинаmy_shop
Password1Пароль для подписи запросовsecret_pass_1
Password2Пароль для проверки ответовsecret_pass_2

Хеш-подпись: алгоритм MD5 vs SHA256

Robokassa использует хеш-подпись для верификации запросов и ответов. Это ключевой элемент безопасности — и самый частый источник ошибок.

Формирование подписи запроса

Подпись запроса формируется из конкатенации параметров через двоеточие:

Формат:

CODE
 1MerchantLogin:OutSum:InvId:Password1[:ФДП]

Пример (MD5):

Python
 1import hashlib
 2
 3def generate_signature_md5(login: str, out_sum: str, inv_id: int, password: str, 
 4                            shp_params: dict = None) -> str:
 5    """Генерация подписи для запроса оплаты (MD5)"""
 6    # Базовая строка подписи
 7    signature_string = f"{login}:{out_sum}:{inv_id}:{password}"
 8    
 9    # Добавляем shp_ параметры (в алфавитном порядке!)
10    if shp_params:
11        sorted_params = sorted(shp_params.items())
12        for key, value in sorted_params:
13            signature_string += f":{key}={value}"
14    
15    return hashlib.md5(signature_string.encode()).hexdigest()
16
17# Пример использования
18signature = generate_signature_md5(
19    login="my_shop",
20    out_sum="1500.00",
21    inv_id=12345,
22    password="password1",
23    shp_params={"user_id": "123456789", "order_id": "abc"}
24)
25# Результат: "a1b2c3d4e5f6..."

Критически важно: • Параметры shp_ добавляются в алфавитном порядке ключей • Пароль добавляется после всех параметров • Десятичный разделитель — точка (не запятая) • Регистр MerchantLogin — как в личном кабинете

Формирование подписи ответа (Result URL)

Когда клиент оплачивает, Robokassa отправляет запрос на Result URL с подписью. Нужно проверить подпись, используя Password2:

Python
 1def verify_signature_md5(out_sum: str, inv_id: int, password: str, 
 2                          shp_params: dict = None) -> str:
 3    """Генерация ожидаемой подписи для проверки ответа"""
 4    signature_string = f"{out_sum}:{inv_id}:{password}"
 5    
 6    if shp_params:
 7        sorted_params = sorted(shp_params.items())
 8        for key, value in sorted_params:
 9            signature_string += f":{key}={value}"
10    
11    return hashlib.md5(signature_string.encode()).hexdigest()
12
13# Проверка подписи
14expected_signature = verify_signature_md5(
15    out_sum="1500.00",
16    inv_id=12345,
17    password="password2",  # Пароль №2!
18    shp_params={"user_id": "123456789", "order_id": "abc"}
19)
20
21if expected_signature == received_signature:
22    print("Подпись верна!")
23else:
24    print("Подпись НЕ верна! Возможна подделка.")

Разница между запросом и ответом: • Запрос (к Robokassa): MerchantLogin:OutSum:InvId:Password1 • Ответ (от Robokassa): OutSum:InvId:Password2 (без MerchantLogin!)

MD5 vs SHA256: что выбрать

Robokassa поддерживает два алгоритма хеширования:

ПараметрMD5SHA256
БезопасностьСлабая (коллизии найдены)Высокая
СкоростьБыстрееНемного медленнее
СовместимостьВсе версии APIНовые версии API
РекомендацияТолько для legacy✅ Рекомендуется

Рекомендация: используйте SHA256 для новых проектов. MD5 — только если интегрируете с legacy-системой.

Python
 1import hashlib
 2
 3# SHA256
 4signature_sha = hashlib.sha256(signature_string.encode()).hexdigest()
 5
 6# MD5
 7signature_md5 = hashlib.md5(signature_string.encode()).hexdigest()

В личном кабинете Robokassa можно выбрать алгоритм подписи. Для новых магазинов по умолчанию SHA256.

Создание платежа через Robokassa

Robokassa использует HTTP-redirect для создания платежей. Нет REST API — формируется URL, на который перенаправляется пользователь.

Формирование URL оплаты

URL оплаты формируется из параметров:

Python
 1import hashlib
 2from urllib.parse import urlencode
 3
 4MERCHANT_LOGIN = "my_shop"
 5PASSWORD1 = "password1"
 6ROBOKASSA_URL = "https://auth.robokassa.ru/Merchant/Index.aspx"
 7
 8def create_payment_url(out_sum: float, inv_id: int, description: str, 
 9                        shp_params: dict = None) -> str:
10    """Формирование URL для оплаты через Robokassa"""
11    
12    # Формируем подпись
13    signature_string = f"{MERCHANT_LOGIN}:{out_sum:.2f}:{inv_id}:{PASSWORD1}"
14    
15    if shp_params:
16        sorted_params = sorted(shp_params.items())
17        for key, value in sorted_params:
18            signature_string += f":{key}={value}"
19    
20    signature = hashlib.sha256(signature_string.encode()).hexdigest()
21    
22    # Параметры запроса
23    params = {
24        "MerchantLogin": MERCHANT_LOGIN,
25        "OutSum": f"{out_sum:.2f}",
26        "InvId": inv_id,
27        "Description": description,
28        "SignatureValue": signature,
29    }
30    
31    # Добавляем shp_ параметры
32    if shp_params:
33        for key, value in shp_params.items():
34            params[f"shp_{key} = value"
35    
36    return f"{ROBOKASSA_URL}?{urlencode(params)}"
37
38# Использование
39url = create_payment_url(
40    out_sum=1500.00,
41    inv_id=12345,
42    description="Курс по йоге",
43    shp_params={"user_id": "123456789", "order_id": "abc"}
44)
45print(url)
46# https://auth.robokassa.ru/Merchant/Index.aspx?MerchantLogin=...

Бот отправляет этот URL пользователю как кнопку. Пользователь переходит и оплачивает.

Параметры запроса

ПараметрТипОбязательныйОписание
MerchantLoginstringЛогин магазина
OutSumstringСумма (формат: "1500.00")
InvIdintНомер заказа (генерируется магазином)
DescriptionstringОписание заказа
SignatureValuestringПодпись (MD5 или SHA256)
CulturestringЯзык интерфейса ("ru", "en")
EncodingstringКодировка ("utf-8")
shp_*stringДополнительные параметры (до 10)

shp_ параметры — пользовательские параметры, которые передаются в URL и возвращаются в Result URL. Используются для передачи user_id, order_id и других данных.

Интеграция с aiogram 3.x

Пример обработчика «Купить» в Telegram-боте:

Python
 1from aiogram import Router, F
 2from aiogram.types import Message, InlineKeyboardMarkup, InlineKeyboardButton
 3
 4router = Router()
 5
 6@router.message(F.text == "🛒 Купить")
 7async def buy_handler(message: Message):
 8    """Обработчик кнопки «Купить»"""
 9    user_id = message.from_user.id
10    order_id = generate_order_id()
11    amount = 1500.00
12    
13    # Генерируем URL оплаты
14    payment_url = create_payment_url(
15        out_sum=amount,
16        inv_id=order_id,
17        description="Курс по йоге — базовый уровень",
18        shp_params={"user_id": str(user_id), "order_id": str(order_id)}
19    )
20    
21    # Сохраняем заказ в БД
22    await save_order(order_id, user_id, amount, "pending")
23    
24    keyboard = InlineKeyboardMarkup(inline_keyboard=[
25        [InlineKeyboardButton(
26            text=f"💳 Оплатить {amount:.0f} ₽",
27            url=payment_url
28        )]
29    ])
30    
31    await message.answer(
32        "🛒 **Курс по йоге — базовый уровень**\n\n"
33        f"Стоимость: {amount:.0f} ₽\n"
34        "Доступ: навсегда\n\n"
35        "Нажмите кнопку ниже для оплаты:",
36        reply_markup=keyboard,
37        parse_mode="Markdown"
38    )

Обработка Result URL (webhook от Robokassa)

Result URL — аналог webhook в Robokassa. Когда клиент оплачивает, Robokassa отправляет GET-запрос на ваш Result URL с параметрами платежа.

Обработка Result URL в aiohttp

Полный пример обработки Result URL:

Python
 1from aiohttp import web
 2import hashlib
 3
 4PASSWORD2 = "password2"
 5
 6async def handle_result_url(request: web.Request) -> web.Response:
 7    """Обработка Result URL от Robokassa"""
 8    # Получаем параметры из GET-запроса
 9    out_sum = request.query.get("OutSum")
10    inv_id = request.query.get("InvId")
11    received_signature = request.query.get("SignatureValue")
12    
13    # Собираем shp_ параметры
14    shp_params = {}
15    for key, value in request.query.items():
16        if key.startswith("shp_"):
17            shp_params[key] = value
18    
19    # Формируем ожидаемую подпись
20    signature_string = f"{out_sum}:{inv_id}:{PASSWORD2}"
21    
22    if shp_params:
23        sorted_params = sorted(shp_params.items())
24        for key, value in sorted_params:
25            signature_string += f":{key}={value}"
26    
27    expected_signature = hashlib.sha256(
28        signature_string.encode()
29    ).hexdigest()
30    
31    # Проверяем подпись
32    if expected_signature != received_signature:
33        return web.Response(
34            text="Invalid signature",
35            status=400
36        )
37    
38    # Подпись верна — обрабатываем платёж
39    user_id = shp_params.get("shp_user_id")
40    order_id = shp_params.get("shp_order_id")
41    
42    # Обновляем статус заказа
43    await update_order_status(int(inv_id), "paid")
44    
45    # Выдаём товар пользователю
46    await give_access(int(user_id), order_id)
47    
48    # Уведомляем пользователя
49    await bot.send_message(
50        int(user_id),
51        f"✅ Оплата получена! Сумма: {out_sum} ₽"
52    )
53    
54    # ВАЖНО: возвращаем текст с InvId
55    return web.Response(text=f"OK{inv_id}")
56
57# Настройка маршрутов
58app = web.Application()
59app.router.add_get('/robokassa/result', handle_result_url)

Критически важно: • Ответ должен быть текстовым: OK{InvId} (не JSON!) • Если ответ не содержит OK{InvId} — Robokassa будет повторять запрос • Проверяйте подпись ДО обработки платежа

Обработка Result URL в FastAPI

Альтернативный пример на FastAPI:

Python
 1from fastapi import FastAPI, Query, HTTPException
 2import hashlib
 3
 4app = FastAPI()
 5PASSWORD2 = "password2"
 6
 7@app.get("/robokassa/result")
 8async def robokassa_result(
 9    OutSum: str = Query(...),
10    InvId: str = Query(...),
11    SignatureValue: str = Query(...),
12    # shp_ параметры
13    shp_user_id: str = Query(None),
14    shp_order_id: str = Query(None),
15):
16    """Обработка Result URL от Robokassa"""
17    # Формируем подпись
18    sig_string = f"{OutSum}:{InvId}:{PASSWORD2}"
19    
20    if shp_user_id and shp_order_id:
21        sig_string += f":shp_order_id={shp_order_id}:shp_user_id={shp_user_id}"
22    
23    expected = hashlib.sha256(sig_string.encode()).hexdigest()
24    
25    if expected != SignatureValue:
26        raise HTTPException(status_code=400)
27    
28    # Обработка платежа
29    await process_payment(InvId, OutSum, shp_user_id)
30    
31    return f"OK{InvId}"

Robokassa для цифровых товаров в Telegram

Robokassa особенно удобна для продажи цифровых товаров: курсы, электронные книги, шаблоны, подписки.

Полный цикл: от выбора товара до выдачи

Архитектура для цифровых товаров:

  1. 1.Клиент выбирает товар в Telegram-боте
  2. 2.Бот генерирует уникальный InvId и URL оплаты
  3. 3.Клиент переходит по URL → оплачивает
  4. 4.Robokassa → Result URL → бот получает подтверждение
  5. 5.Бот выдаёт товар: ссылку, файл, доступ
  6. 6.Бот отправляет чек (фискализация Robokassa)

Преимущество Robokassa для цифровых товаров: • Поддержка электронных кошельков (Qiwi, WebMoney) — удобно для молодой аудитории • Минимальная комиссия 15 ₽ — выгодно для товаров до 500 ₽ • Мультивалюта — можно продавать в USD/EUR для международной аудитории

Тип товараСредний чекЛучший способ оплатыКомиссия
Электронная книга300–500 ₽Карты, Qiwi15 ₽ мин.
Онлайн-курс2 000–10 000 ₽Карты2,5–3,5%
Подписка (месяц)500–2 000 ₽Карты, рекурренты2,5–3,5%
Шаблон/плагин500–3 000 ₽Карты, WebMoney2,5–3,5%
Консультация3 000–15 000 ₽Карты, СБП2,5–3,5%

Пример: бот для продажи курсов с Robokassa

Полный пример бота для продажи курсов:

Python
 1from aiogram import Router, F
 2from aiogram.types import Message, InlineKeyboardMarkup, InlineKeyboardButton
 3import hashlib
 4import uuid
 5
 6router = Router()
 7
 8COURSES = {
 9    "yoga_basic": {"name": "Йога — базовый", "price": 2500.00},
10    "yoga_advanced": {"name": "Йога — продвинутый", "price": 4500.00},
11    "yoga_master": {"name": "Йога — мастер", "price": 8000.00},
12}
13
14@router.message(F.text == "📚 Курсы")
15async def show_courses(message: Message):
16    """Показать каталог курсов"""
17    keyboard = InlineKeyboardMarkup(inline_keyboard=[
18        [InlineKeyboardButton(
19            text=f"{c['name']} — {c['price']:.0f} ₽",
20            callback_data=f"buy:{course_id}"
21        )]
22        for course_id, c in COURSES.items()
23    ])
24    
25    await message.answer(
26        "📚 **Наши курсы:**\nВыберите курс для покупки:",
27        reply_markup=keyboard,
28        parse_mode="Markdown"
29    )
30
31@router.callback_query(F.data.startswith("buy:"))
32async def buy_course(callback):
33    """Обработка покупки курса"""
34    course_id = callback.data.split(":")[1]
35    course = COURSES[course_id]
36    user_id = callback.from_user.id
37    inv_id = int(uuid.uuid4().int % 1000000)
38    
39    # Генерируем URL оплаты
40    payment_url = create_payment_url(
41        out_sum=course['price'],
42        inv_id=inv_id,
43        description=course['name'],
44        shp_params={
45            "user_id": str(user_id),
46            "course_id": course_id
47        }
48    )
49    
50    keyboard = InlineKeyboardMarkup(inline_keyboard=[
51        [InlineKeyboardButton(
52            text=f"💳 Оплатить {course['price']:.0f} ₽",
53            url=payment_url
54        )]
55    ])
56    
57    await callback.message.answer(
58        f"🛒 **{course['name']}**\n\n"
59        f"Стоимость: {course['price']:.0f} ₽\n"
60        "Доступ: навсегда\n\n"
61        "Нажмите кнопку для оплаты:",
62        reply_markup=keyboard,
63        parse_mode="Markdown"
64    )

Мультивалютные платежи через Robokassa

Robokassa поддерживает 15 валют — это уникальное преимущество перед ЮKassa.

Поддерживаемые валюты

КодВалютаСпособ оплаты
RUBРоссийский рубльКарты, кошельки, терминалы
USDДоллар СШАКарты Visa/MC
EURЕвроКарты Visa/MC
UAHУкраинская гривнаКарты, кошельки
KZTКазахстанский тенгеКарты
BYNБелорусский рубльКарты
UZSУзбекский сумКарты
KGSКиргизский сомКарты
TJSТаджикский сомониКарты
MDLМолдавский лейКарты
AZNАзербайджанский манатКарты
GELГрузинский лариКарты
AMDАрмянский драмКарты
BRLБразильский реалКарты
CNYКитайский юаньКарты

Использование: укажите параметр Currency в URL оплаты:

Python
 1params = {
 2    "MerchantLogin": MERCHANT_LOGIN,
 3    "OutSum": "50.00",
 4    "InvId": inv_id,
 5    "Currency": "USD",  # Валюта оплаты
 6    "SignatureValue": signature,
 7}

Важно: курс конвертации устанавливает Robokassa. Сумма в валюте может отличаться от ожидаемой.

Типичные ошибки при интеграции Robokassa

За 15+ интеграций я собрал коллекцию ошибок, которые чаще всего допускают разработчики.

Ошибки хеш-подписи (самые частые)

Ошибка 1: Неправильный порядок параметров. shp_ параметры должны быть отсортированы по ключу в алфавитном порядке. shp_b идёт перед shp_a — неверно. shp_a идёт перед shp_b — верно.

Ошибка 2: Использование Password1 для проверки ответа. Для Result URL используется Password2, а не Password1. Это разные пароли с разными назначениями.

Ошибка 3: Десятичный разделитель — запятая. Robokassa ожидает точку: "1500.00", а не "1500,00".

Ошибка 4: Отсутствие MerchantLogin в подписи запроса. Подпись запроса: Login:Sum:InvId:Password1. Подпись ответа: Sum:InvId:Password2 (без Login!).

Ошибка 5: Неверный формат ответа. Ответ на Result URL должен быть текстовым: OK{InvId}, а не JSON.

Ошибки бизнес-логики

Ошибка 6: Обработка платежа до проверки подписи. Всегда проверяйте подпись ДО обработки. Иначе мошенники могут отправить поддельный Result URL.

Ошибка 7: Нет обработки дублей. Robokassa может отправить Result URL несколько раз. Используйте InvId для идемпотентности: если заказ уже оплачен — не выдавайте товар повторно.

Ошибка 8: Нет логирования. Логируйте каждый Result URL: InvId, OutSum, SignatureValue, IP-адрес.

ОшибкаПоследствиеКак избежать
Неверный порядок shp_Подпись не совпадаетsorted() по ключам
Password1 вместо 2Подпись не совпадаетРазные переменные
Запятая вместо точкиСумма не распознаетсяf"{sum:.2f}"
Нет проверки подписиМошенничествоПроверять ДО обработки
Нет идемпотентностиДвойная выдачаПроверять статус заказа
JSON вместо текстаRobokassa повторяетreturn f"OK{inv_id}"

Чек-лист запуска Robokassa в продакшен

Перед переключением из тестового режима в production проверьте все пункты.

Чек-лист

#ПунктСтатус
1Production MerchantLogin, Password1, Password2 настроены
2Result URL настроен на HTTPS
3Подпись ответа проверяется (Password2)
4Подпись запроса формируется корректно (Password1)
5shp_ параметры сортируются по ключу
6Ответ на Result URL: текст "OK{InvId}"
7Идемпотентность: дубли не обрабатываются
8Фискализация настроена (чеки)
9Логирование всех Result URL
10Обработка ошибок (неверная подпись, таймаут)
11Тестовые платежи пройдены
12Success URL и Fail URL настроены

Если все 12 пунктов отмечены — можно запускать в production.

🔧 Нужна помощь с интеграцией Robokassa? Напишите мне — интегрирую за 3–5 дней от 15 000 ₽.

Читайте также

Нужна интеграция Robokassa в вашего бота?

✅ Полная интеграция: платежи, Result URL, возвраты, мультивалюта

✅ Хеш-подпись SHA256, фискализация, чеки

✅ Бесплатная поддержка 30 дней

Написать мне в Telegram →

Частые вопросы

Ответы на самые популярные вопросы о интеграция robokassa

Нужна интеграция Robokassa? От 15 000 ₽

Интегрирую Robokassa в Telegram-бота за 3–5 дней. Хеш-подпись, Result URL, мультивалюта. Поддержка 30 дней

Или посмотрите наши услуги по разработке ботов

Примеры реализованных проектов

Посмотрите мои работы: Telegram-боты, сервисы, CRM и автоматизация для бизнеса

Похожие статьи

Telegram бот для приёма заявок

Telegram бот для приёма заявок от 7 000 ₽. Автоматическая обработка заявок 24/7, уведомления, интеграция с CRM. ROI 300%...

Читать далее

Telegram бот для интернет-магазина

Telegram бот для интернет-магазина от 50 000 ₽. Каталог, корзина, оплата, интеграция с 1С и складом. Бесплатная оценка з...

Читать далее

Как сделать Telegram бота на Python

Разработка Telegram бота на Python от 7 000 ₽. Пошаговое руководство с кодом, aiogram, webhook. Бесплатная оценка за 24 ...

Читать далее