Complete Revolut Pro payment webhook receiver system with multi-seller marketplace integration.
/home/deployer/projects/
โโโ revolut-webhook/ # Main webhook system
โ โโโ app/
โ โ โโโ main.py # FastAPI application
โ โ โโโ database.py # Database operations
โ โ โโโ telegram.py # Telegram bot handlers
โ โ โโโ seller_integration.py # Seller logic
โ โ โโโ models.py # Data models
โ โโโ .env # Environment variables
โ โโโ requirements.txt # Python dependencies
โ โโโ revolut-webhook.service # Systemd service
โโโ seller-04-bot/ # Seller #04 bot
โ โโโ handlers/
โ โ โโโ shop.py # Shop functionality
โ โ โโโ admin.py # Admin panel
โ โ โโโ payments.py # Payment processing
โ โโโ config.py # Bot configuration
โ โโโ main.py # Bot entry point
โ โโโ keyboards.py # Telegram keyboards
โโโ obfuscated-docs/ # This documentation
โโโ index.html
revolut.thevirtum.com/revolut/tasker/notificationHost: 127.0.0.1:5432
Database: revolut_db
Username: revolut_user
Password: xK9#mN2$pL7@qR4w
Connection URL: postgresql://revolut_user:xK9%23mN2%24pL7%40qR4w@127.0.0.1:5432/revolut_db
CREATE TABLE payment_events (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
event_type VARCHAR(50) NOT NULL,
amount DECIMAL(10,2),
currency VARCHAR(3),
merchant_name VARCHAR(255),
payment_method VARCHAR(100),
sender_name VARCHAR(255),
net_amount DECIMAL(10,2),
fee_amount DECIMAL(10,2),
raw_data JSONB,
fingerprint VARCHAR(64) UNIQUE,
seller_code VARCHAR(2),
tasker_data JSONB,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sellers (
id SERIAL PRIMARY KEY,
seller_code VARCHAR(2) UNIQUE NOT NULL,
name VARCHAR(100) NOT NULL,
bot_token VARCHAR(255),
chat_id BIGINT,
description TEXT,
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE orders (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id BIGINT NOT NULL,
username VARCHAR(255),
first_name VARCHAR(255),
last_name VARCHAR(255),
product_code VARCHAR(10) NOT NULL,
currency VARCHAR(3) NOT NULL,
amount DECIMAL(10,2) NOT NULL,
status VARCHAR(20) DEFAULT 'pending',
payment_url TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
completed_at TIMESTAMP WITH TIME ZONE
);
Main webhook endpoint for Revolut payments
Headers:
Content-Type: application/json
Authorization: Bearer revolutProOrder
Body: Revolut webhook JSON payload
Tasker Android app notification receiver
{
"source": "tasker",
"event": "notification",
"app": {"name": "Revolut"},
"notification": {
"title": "โฌ2.04 from John Doe",
"text": "Received via Revolut"
},
"timestamp": "2025-09-18 03:45:12"
}
Notify seller bots about completed payments
{
"seller_code": "04",
"user_id": 123456789,
"amount": 2.04,
"currency": "EUR",
"order_id": "uuid-here"
}
Health check endpoint
Response: {"status": "healthy", "timestamp": "..."}
Token: 7853823106:AAE1MiljeIChLBzuxa6BTSFK1-4oXhqD5uw
Chat ID: 877659798 (Main admin)
Webhook Secret: RevolutWebhookSecret2024
/start - Main menu/last - Last 10 payments/today - Today's statistics/find [amount] - Find payment/start - Welcome message/admin - Admin panelSellers are identified by the last 2 cents of payment amounts:
Example: โฌ12.04 โ Seller #04, $15.07 โ Seller #07
Bot Token: 8140594673:AAEAcE_sDUSp_EbEWjAiSzARTPgYggf8XlM
Chat ID: 7948563551
Username: @TianTianApp_bot
Name: ็็&Virtum
# /etc/caddy/Caddyfile
revolut.thevirtum.com {
@revolut_get {
path /revolut
method GET PUT DELETE PATCH
}
respond @revolut_get "Method not allowed" 405
reverse_proxy 127.0.0.1:8000
log {
output file /var/log/caddy/revolut.log
format json
}
header {
-Server
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-XSS-Protection "1; mode=block"
Referrer-Policy strict-origin-when-cross-origin
}
}
obfuscated.thevirtum.com {
root * /home/deployer/projects/obfuscated-docs
file_server
}
# /home/deployer/projects/revolut-webhook/.env
REV_PUSH_TOKEN=revolutProOrder
DATABASE_URL=postgresql://revolut_user:xK9%23mN2%24pL7%40qR4w@127.0.0.1:5432/revolut_db
TG_BOT_TOKEN=7853823106:AAE1MiljeIChLBzuxa6BTSFK1-4oXhqD5uw
TG_CHAT_ID=877659798
TG_WEBHOOK_SECRET=RevolutWebhookSecret2024
# Seller configuration
SELLER_04_BOT_TOKEN=8140594673:AAEAcE_sDUSp_EbEWjAiSzARTPgYggf8XlM
SELLER_04_CHAT_ID=7948563551
# revolut-webhook.service
[Unit]
Description=Revolut Webhook Receiver
After=network.target postgresql.service
[Service]
Type=simple
User=deployer
WorkingDirectory=/home/deployer/projects/revolut-webhook
Environment=PATH=/home/deployer/projects/revolut-webhook/venv/bin
ExecStart=/home/deployer/projects/revolut-webhook/venv/bin/python -m uvicorn app.main:app --host 0.0.0.0 --port 8000
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Android Tasker app configuration for Revolut notifications:
Trigger: Notification from "Revolut" app
Action: HTTP POST to revolut.thevirtum.com/tasker/notification
Body Template:
{
"source": "tasker",
"event": "notification",
"app": {"name": "%anapp"},
"notification": {
"title": "%antitle",
"text": "%antext"
},
"timestamp": "%DATE %TIME"
}
# Service management
sudo systemctl start revolut-webhook
sudo systemctl stop revolut-webhook
sudo systemctl restart revolut-webhook
sudo systemctl status revolut-webhook
# Caddy management
sudo systemctl reload caddy
sudo caddy fmt --overwrite /etc/caddy/Caddyfile
# Database access
PGPASSWORD='xK9#mN2$pL7@qR4w' psql -U revolut_user -d revolut_db -h localhost
# Log monitoring
tail -f /var/log/caddy/revolut.log
journalctl -u revolut-webhook -f
# Bot management (seller #04)
cd /home/deployer/projects/seller-04-bot
python3 main.py