- Создан модуль FreeKassa с обработкой платежей, webhook, IP whitelist, MD5 подписью - Переписан frontend billing.tsx для формы оплаты FreeKassa - Удалены файлы и зависимости DePay (depay.routes.ts, @depay/widgets) - Полностью удалена система проверки чеков операторами: * Удален backend модуль /modules/check/ * Удалена frontend страница checkverification.tsx * Очищены импорты, маршруты, WebSocket события * Удалено поле checkId из Notification схемы * Удалены переводы для чеков - Добавлена поддержка спецсимволов в секретных словах FreeKassa - Добавлена документация PAYMENT_MIGRATION.md
9.5 KiB
Миграция оплаты: DePay → FreeKassa
✅ Выполненные изменения
Backend
-
Создан новый модуль FreeKassa (
backend/src/modules/payment/freekassa.routes.ts)- ✅ Endpoint уведомлений:
GET /payment/freekassa/notification - ✅ Успешная оплата:
GET /payment/freekassa/sucess - ✅ Неудачная оплата:
GET /payment/freekassa/failure - ✅ Создание платежа:
POST /payment/freekassa/create-payment - ✅ История платежей:
GET /payment/freekassa/history - ✅ IP whitelist проверка (4 IP FreeKassa)
- ✅ MD5 подпись для формы и уведомлений
- ✅ Endpoint уведомлений:
-
Обновлен main router (
backend/src/index.ts)- ✅ Заменен импорт:
depayRoutes→freekassaRoutes - ✅ Изменен маршрут:
/payment/depay→/payment
- ✅ Заменен импорт:
-
Обновлен .env (
backend/.env)- ✅ Удалены переменные DePay:
DEPAY_PUBLIC_KEY,DEPAY_FALLBACK_RATE - ✅ Добавлены переменные FreeKassa (требуют заполнения):
FK_MERCHANT_ID=YOUR_MERCHANT_ID FK_SECRET_WORD_1=YOUR_SECRET_WORD_1 FK_SECRET_WORD_2=YOUR_SECRET_WORD_2
- ✅ Удалены переменные DePay:
-
Удален старый модуль DePay
- ✅ Удален файл:
backend/src/modules/payment/depay.routes.ts
- ✅ Удален файл:
-
Обновлена схема Prisma (
backend/prisma/schema.prisma)- ✅ Удалено поле
checkIdиз моделиNotification - ⚠️ Требуется миграция БД (см. раздел "Развертывание")
- ✅ Удалено поле
-
Очищены ссылки на систему чеков
- ✅ Удалено событие
check:statusиз WebSocket events - ✅ Удалено поле
checkIdиз notification controller - ✅ Удален модуль
backend/src/modules/check/
- ✅ Удалено событие
Frontend
-
Переписан компонент оплаты (
frontend/src/pages/dashboard/billing.tsx)- ✅ Удален DePay виджет
- ✅ Добавлена форма для редиректа на FreeKassa
- ✅ Динамическое создание формы с подписью
- ✅ Открытие оплаты в новой вкладке
-
Обновлен package.json (
frontend/package.json)- ✅ Удалена зависимость:
@depay/widgets
- ✅ Удалена зависимость:
-
Обновлен .env (
frontend/.env)- ✅ Удалена переменная:
VITE_DEPAY_INTEGRATION_ID
- ✅ Удалена переменная:
-
Удалена система проверки чеков
- ✅ Удален файл:
frontend/src/pages/dashboard/checkverification.tsx - ✅ Удален импорт и маршрут из
mainpage.tsx - ✅ Удалена вкладка из панели администратора
- ✅ Удалено событие
check:statusиз WebSocket - ✅ Удалено поле
checkIdиз типов уведомлений - ✅ Удалены переводы для чеков (en.ts, ru.ts)
- ✅ Удален файл:
🔧 Развертывание
1. Заполнить credentials FreeKassa
Откройте merchant.freekassa.com → Настройки → Магазины
В файле backend/.env замените:
FK_MERCHANT_ID=12345 # ID вашего магазина
FK_SECRET_WORD_1=your_secret_1 # Секретное слово 1 (для формы)
FK_SECRET_WORD_2=your_secret_2 # Секретное слово 2 (для уведомлений)
2. Настроить URL в FreeKassa панели
В настройках магазина на FreeKassa укажите:
- Result URL (уведомления):
https://ospab.host/payment/freekassa/notification - Success URL:
https://ospab.host/payment/freekassa/sucess - Failure URL:
https://ospab.host/payment/freekassa/failure
⚠️ Важно: В скриншоте была опечатка /frekassa/ вместо /freekassa/. Убедитесь, что используете правильный путь!
3. Применить миграцию БД
После обновления schema.prisma нужно создать миграцию:
cd backend
npx prisma migrate dev --name remove_checkid_field
Или для production:
npx prisma migrate deploy
4. Переустановить зависимости
# Frontend
cd ospabhost/frontend
npm install
# Backend (если нужно)
cd ../backend
npm install
5. Пересобрать проекты
# Backend
cd backend
npm run build
# Frontend
cd ../frontend
npm run build
6. Перезапустить сервисы
# Если используется PM2
pm2 restart all
# Или через systemd
sudo systemctl restart ospab-backend
sudo systemctl restart ospab-frontend
🧪 Тестирование
1. Проверка создания платежа
curl -X POST https://api.ospab.host/payment/freekassa/create-payment \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"amount": 100}'
Ожидаемый ответ:
{
"status": "success",
"data": {
"merchantId": "12345",
"amount": 100,
"orderId": "user123_1234567890",
"signature": "abc123...",
"currency": "RUB",
"email": "user@example.com"
}
}
2. Проверка уведомлений (webhook)
FreeKassa отправит GET запрос на /payment/freekassa/notification с параметрами:
MERCHANT_ID- ID магазинаAMOUNT- сумма платежаintid- ID транзакции FreeKassaMERCHANT_ORDER_ID- ваш order IDSIGN- MD5 подпись
Backend проверит:
- ✅ IP адрес отправителя (whitelist)
- ✅ MD5 подпись (через SECRET_WORD_2)
- ✅ Уникальность платежа (не был обработан ранее)
- ✅ Создаст запись в CryptoPayment
- ✅ Увеличит баланс пользователя
- ✅ Создаст транзакцию
- ✅ Отправит уведомление
- ✅ Вернет "YES"
3. Ручное тестирование
- Войдите в личный кабинет
- Перейдите в раздел "Billing"
- Введите сумму (минимум 50 ₽)
- Нажмите "Пополнить"
- Откроется форма FreeKassa в новой вкладке
- Выберите способ оплаты и оплатите
- После оплаты FreeKassa отправит уведомление на backend
- Баланс должен автоматически обновиться
⚠️ Важные замечания
Безопасность
-
IP Whitelist: Backend проверяет, что уведомления приходят только с IP FreeKassa:
168.119.157.136168.119.60.227178.154.197.7951.250.54.238
-
MD5 подпись: Все уведомления проверяются на валидность подписи
-
Идемпотентность: Повторная обработка одного платежа блокируется
Отличия от DePay
| Параметр | DePay | FreeKassa |
|---|---|---|
| Тип интеграции | Виджет (JavaScript) | Форма (POST redirect) |
| Валюта | Криптовалюта | RUB |
| Открытие | Модальное окно | Новая вкладка |
| Callback | WebSocket | GET webhook |
| Подпись | RSA | MD5 |
База данных
Используется существующая таблица CryptoPayment:
blockchain='freekassa'token='RUB'status='completed'
📝 Удаленные функции
Система проверки чеков операторами
✅ Полностью удалена:
- Backend модуль
/modules/check/ - Frontend страница
checkverification.tsx - Маршруты и импорты в mainpage
- WebSocket события
check:status - Поле
checkIdв уведомлениях - Переводы для чеков
- Вкладка в админ-панели
🔍 Логи для отладки
Backend логирует все этапы обработки платежа:
# Посмотреть логи PM2
pm2 logs ospab-backend --lines 100
# Grep для FreeKassa
pm2 logs | grep FreeKassa
Ключевые логи:
[FreeKassa] Notification received- получено уведомление[FreeKassa] IP check failed- неверный IP[FreeKassa] Invalid signature- неверная подпись[FreeKassa] Payment already exists- дубликат[FreeKassa] Payment processed successfully- успешно обработано
📞 Поддержка
Если возникли проблемы:
- Проверьте логи backend:
pm2 logs ospab-backend - Проверьте настройки FreeKassa (URL, секретные слова)
- Убедитесь, что миграция БД применена
- Проверьте, что переменные окружения заполнены
Документация FreeKassa: wiki.freekassa.com