feat: Интеграция DePay для криптовалютных платежей (USDT/Polygon)

- Добавлены endpoints для DePay: callback, success, rate, history
- Заменена система проверки чеков на CryptoPayment
- Переименована модель Check в CryptoPayment в Prisma схеме
- Обновлен billing.tsx для работы с DePay виджетом
- Все секреты вынесены в .env файлы
- Интеграция с CoinGecko API для курса USDT/RUB
- Добавлена RSA верификация webhook от DePay
This commit is contained in:
2026-01-10 23:23:38 +03:00
parent 501e858c06
commit 95780564a6
15 changed files with 4448 additions and 384 deletions

View File

@@ -0,0 +1,19 @@
-- Rename Check table to CryptoPayment
RENAME TABLE `check` TO `crypto_payment`;
-- Add new columns for crypto payments
ALTER TABLE `crypto_payment`
ADD COLUMN `transactionHash` VARCHAR(191) NULL,
ADD COLUMN `blockchain` VARCHAR(191) DEFAULT 'polygon',
ADD COLUMN `token` VARCHAR(191) DEFAULT 'USDT',
ADD COLUMN `cryptoAmount` DECIMAL(20, 8) NULL,
ADD COLUMN `exchangeRate` DECIMAL(10, 2) NULL COMMENT 'USDT to RUB rate',
ADD COLUMN `paymentProvider` VARCHAR(191) DEFAULT 'depay',
MODIFY COLUMN `status` VARCHAR(191) DEFAULT 'pending' COMMENT 'pending, completed, failed',
MODIFY COLUMN `fileUrl` VARCHAR(191) NULL COMMENT 'Not used for crypto payments';
-- Update foreign key name if needed
ALTER TABLE `crypto_payment`
DROP FOREIGN KEY `check_userId_fkey`,
ADD CONSTRAINT `crypto_payment_userId_fkey`
FOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

View File

@@ -23,7 +23,7 @@ model User {
isAdmin Boolean @default(false)
tickets Ticket[] @relation("UserTickets")
responses Response[] @relation("OperatorResponses")
checks Check[] @relation("UserChecks")
cryptoPayments CryptoPayment[] @relation("UserCryptoPayments")
balance Float @default(0)
notifications Notification[]
pushSubscriptions PushSubscription[]
@@ -46,16 +46,22 @@ model User {
@@map("user")
}
model Check {
id Int @id @default(autoincrement())
userId Int
amount Float
status String @default("pending") // pending, approved, rejected
fileUrl String
createdAt DateTime @default(now())
user User @relation("UserChecks", fields: [userId], references: [id])
model CryptoPayment {
id Int @id @default(autoincrement())
userId Int
amount Float // Amount in RUB credited to balance
cryptoAmount Float? // Amount in USDT paid
exchangeRate Float? // USDT to RUB exchange rate at payment time
status String @default("pending") // pending, completed, failed
transactionHash String? // Blockchain transaction hash
blockchain String @default("polygon") // polygon, ethereum, bsc, etc.
token String @default("USDT") // USDT, USDC, ETH, etc.
paymentProvider String @default("depay") // depay
fileUrl String? // Not used for crypto payments (legacy from Check)
createdAt DateTime @default(now())
user User @relation("UserCryptoPayments", fields: [userId], references: [id], onDelete: Cascade)
@@map("check")
@@map("crypto_payment")
}
model Service {