
بسیاری از سرویسهای VPN از طریق تلگرام میفروشند: مشتری از قبل در چت است، پس خرید هم باید همانجا انجام شود. این راهنما نشان میدهد چطور یک ربات آماده را روی سرور خودتان راهاندازی کنید: مشتری پلن را انتخاب میکند، با USDT روی شبکههای TRC20، ERC20 یا BEP20 یا با کوین دیگری پرداخت میکند و ربات کاربر را در پنل Marzban، 3x-ui یا Remnawave شما میسازد یا تمدید میکند و لینک اشتراک را در همان چت میفرستد. به کیف پول یا نود بلاکچین نیازی نیست: پول به موجودی فروشنده شما در SnapEX Pay میرسد.
فروش چطور انجام میشود
customer → /start → taps a plan
bot → SnapEX Pay: invoice → "Pay" button
customer → pays on the SnapEX Pay page
SnapEX Pay → signed webhook → bot
bot → GET invoice from the API → paid?
bot → panel: create or extend user
bot → customer: subscription link
-
/startپلنهای شما را به شکل دکمه نشان میدهد. هر لمس دکمه یک فاکتور SnapEX Pay میسازد و ربات با دکمه Pay (پرداخت) پاسخ میدهد. - مشتری در صفحه پرداخت کوین را انتخاب و پرداخت میکند. وقتی فاکتور پرداخت شد، SnapEX Pay یک وبهوک امضاشده به ربات میفرستد.
- ربات امضا را بررسی میکند، فاکتور را از API SnapEX Pay میپرسد و فقط اگر وضعیت آنجا
paidباشد و فاکتور متعلق به سفارشی باشد که خود ربات ساخته، کاربر را فعال میکند.
نام کاربری در پنل tg<telegram_id> است، پس هر حساب تلگرام دقیقاً به یک کاربر VPN وصل است.
چه چیزهایی لازم است
- توکن ربات از @BotFather.
- دسترسی مدیر به پنل Marzban، 3x-ui (MHSanaei) یا Remnawave (نسخه 2.x یا 3.x). بدون پنل، ربات فقط پرداخت میگیرد (
PANEL_TYPE=none) و دسترسی را خودتان میدهید. - سروری با Docker Compose (یا Python 3.12).
- یک آدرس عمومی HTTPS برای وبهوک: SnapEX Pay وبهوک را فقط به آدرسهای
https://میفرستد. - حساب فروشنده SnapEX Pay: ثبتنام در pay.snapex.pro.
ربات از long polling استفاده میکند، پس تلگرام به پورت باز روی سرور شما نیاز ندارد؛ فقط پورت وبهوک پشت HTTPS باید در دسترس باشد.
گام ۱. دانلود ربات
آرشیو snapexpay-telegram-vpn-bot-1.1.0.zip را دانلود کنید (مجوز MIT، رایگان) و فایل تنظیمات را بسازید:
curl -fsSLO https://pay.snapex.pro/downloads/telegram-vpn-bot/snapexpay-telegram-vpn-bot-1.1.0.zip
unzip snapexpay-telegram-vpn-bot-1.1.0.zip
cd snapexpay-telegram-vpn-bot-1.1.0
cp .env.example .env
همه تنظیمات در .env است. توکن ربات را در TELEGRAM_BOT_TOKEN و نام فروشگاه را در SHOP_NAME بگذارید؛ این نام در پیام /start و در توضیح فاکتور نمایش داده میشود.
گام ۲. دریافت کلید API
در پنل فروشنده SnapEX Pay صفحه Developers را باز کنید و یک کلید API صادر کنید. کلید فقط یک بار نمایش داده میشود؛ همان لحظه آن را در SNAPEX_API_KEY کپی کنید. کلیدی که در پنل صادر میشود همه دسترسیهای Merchant API را دارد، از جمله invoices.read و invoices.write که ربات لازم دارد. صدور دوباره کلید، کلید قبلی را فوراً باطل میکند؛ پس همان لحظه .env را هم بهروز کنید.
دو تنظیم دیگر پرداخت:
-
SNAPEX_FEE_ON: merchant(پیشفرض)، مشتری دقیقاً قیمت پلن را میپردازد و کارمزدها از مبلغ دریافتی شما کم میشود؛customer، کارمزدها روی مبلغ اضافه میشود. بیشتر: کارمزد فاکتور کریپتو را چه کسی میپردازد. -
SNAPEX_EXPIRES_MINUTES: چند دقیقه فاکتور قابل پرداخت است؛ پیشفرض ۶۰ دقیقه (از ۱ تا ۱۴۴۰).
گام ۳. تعریف پلنها
پلنها یک خط در PLANS هستند: id:days:price_usd:traffic_bytes، جداشده با ویرگول. مقدار 0 بایت یعنی ترافیک نامحدود.
PLANS=week:7:2.00:0,month:30:5.00:0,quarter:90:12.00:107374182400
اینجا quarter یعنی ۹۰ روز با ۱۰۰ GiB ترافیک. id روی دکمه نمایش داده میشود («month — $5.00 / 30d»)، پس کوتاهش کنید: حروف لاتین، ارقام، _ و -. قیمتها به دلار است؛ حداقل مبلغ فاکتور 0.50 USD است.
هر سفارش یک نسخه از پلن خودش را نگه میدارد، پس بعداً میتوانید قیمتها را عوض کنید بدون اینکه به سفارشهای پرداختشده دست بزنید.
گام ۴. اتصال پنل
PANEL_TYPE و اطلاعات دسترسی پنل خود را تنظیم کنید.
Marzban: PANEL_TYPE=marzban:
-
MARZBAN_URL،MARZBAN_USERNAME،MARZBAN_PASSWORD: آدرس پنل و ورود مدیر (یا یک توکن مدیر آماده درMARZBAN_TOKEN). -
MARZBAN_SUB_URL: فقط اگر Marzban لینکهای نسبی/sub/<token>برمیگرداند (XRAY_SUBSCRIPTION_URL_PREFIXخالی است)؛ پایه عمومی لینک.
3x-ui: PANEL_TYPE=3xui:
-
XUI_URL: آدرس پنل همراه با web base path، اگر تنظیمش کردهاید (https://xui.example.com:2053/secretpath). -
XUI_USERNAME،XUI_PASSWORD: احراز هویت دومرحلهای برای این حساب باید خاموش باشد. -
XUI_INBOUND_ID: اینباندی که کلاینتهای جدید به آن اضافه میشوند (vless، vmess، trojan یا shadowsocks). -
XUI_SUB_URL: پایه اشتراک، مثلاًhttps://xui.example.com:2096/sub. بدون آن ربات فقطsubIdرا میفرستد.
Remnawave: PANEL_TYPE=remnawave:
-
REMNAWAVE_URLوREMNAWAVE_TOKEN: آدرس پنل و یک توکن API از بخش API Tokens. -
REMNAWAVE_SQUAD_UUIDS: اسکوادهای داخلی برای کاربران جدید، جداشده با ویرگول. بدون اسکواد، کاربر جدید هیچ سروری ندارد.
گام ۵. اجرای ربات پشت HTTPS
docker compose up -d --build
docker compose logs -f bot
ربات روی پورت 8080 گوش میدهد: /webhook برای SnapEX Pay و /health برای بررسی سلامت. آن را پشت یک پروکسی معکوس با TLS قرار دهید، مثلاً Caddy:
pay-bot.example.com {
reverse_proxy 127.0.0.1:8080
}
پروکسی باید بدنه درخواست را بدون تغییر عبور دهد؛ امضا روی بدنه خام محاسبه میشود.
گام ۶. تنظیم وبهوک
در پنل فروشنده، در صفحه Developers، آدرس وبهوک https://pay-bot.example.com/webhook را وارد و ذخیره کنید. رمز امضای whsec_… فقط یک بار، درست پس از اولین ذخیره، نمایش داده میشود؛ آن را در SNAPEX_WEBHOOK_SECRET کپی کنید و ربات را ریاستارت کنید: docker compose up -d.
در پنل فروشنده برای هر حساب یک آدرس وبهوک وجود دارد و همه رویدادها به آن میرسند. ربات فقط به رویدادهای فاکتور واکنش نشان میدهد و دریافت بقیه را تأیید میکند.
ربات اعلان را اینطور بررسی میکند:
- هدر
Webhook-Signature: HMAC-SHA256 از{Webhook-Timestamp}.{raw request body}با رمز شما؛ درخواستهای بدون امضا یا دستکاریشده401میگیرند؛ - اختلاف
Webhook-Timestampبا ساعت سرور حداکثر ۵ دقیقه؛ NTP را روشن نگه دارید؛ - خود فاکتور که با کلید شما دوباره از API SnapEX Pay خوانده میشود: کاربر فقط وقتی فعال میشود که وضعیت آنجا
paidباشد.
اگر پنل یا API SnapEX Pay در آن لحظه در دسترس نباشد، ربات 502 پاسخ میدهد و SnapEX Pay ارسال را دوباره تلاش میکند (تا ۵ بار). ارسالهای تکراری و همزمان، فاکتور را فقط یک بار اعمال میکنند. درباره امضا و تلاشهای دوباره: وبهوک پرداخت کریپتو.
گام ۷. خرید تست بدون پول واقعی
-
SNAPEX_ENVIRONMENT=testرا تنظیم و ریاستارت کنید:docker compose up -d. - از حساب تلگرام خودتان به ربات
/startبفرستید و یک پلن را بزنید. - Pay را بزنید. صفحه SnapEX Pay برچسب Test دارد. هر کوین و شبکهای را انتخاب کنید: صفحه یک آدرس تست نشان میدهد و حدود ۱۰ ثانیه بعد پرداخت خودبهخود تأیید میشود. لازم نیست چیزی بفرستید.
- ربات باید «Payment received» (پرداخت دریافت شد) و لینک اشتراک را بفرستد و کاربر
tg<your telegram id>باید در پنل ظاهر شود. اگر نشد،docker compose logs -f botو گزارش ارسالها در صفحه Developers را ببینید. -
SNAPEX_ENVIRONMENT=liveرا تنظیم و ریاستارت کنید.
تا وقتی ربات روی test است، هر پلنی که از طریق آن خریده شود بدون پول فعال میشود؛ پس تست را کوتاه نگه دارید. بیشتر: چگونه پرداخت کریپتو را بدون پول واقعی تست کنیم.
مشتری چه میبیند
-
/start: نام فروشگاه شما، یک خط درباره پرداخت با USDT (TRC20 / ERC20 / BEP20) یا کوینهای دیگر، و دکمههای پلن. - پس از لمس دکمه: پلن، تعداد روزها، قیمت و شماره فاکتور، بهعلاوه دکمه «Pay $5.00 with crypto» (پرداخت $5.00 با کریپتو).
- صفحه SnapEX Pay با انتخاب کوین: USDT روی TRC20، ERC20 و BEP20 و کوینهای دیگر (در مجموع بیش از ۵۰) وقتی SnapEX Pay آنها را برای مبلغ فاکتور ارائه میدهد.
- پس از پرداخت: «Payment received» (پرداخت دریافت شد) و لینک اشتراک در همان چت. با
PANEL_TYPE=noneپیام میگوید که مدیر بهزودی دسترسی را میفرستد.
پیامهای خود ربات به انگلیسی است؛ فقط نام فروشگاه و نام پلنها از شماست.
مشتری بازگشتی از همان حساب تلگرام پرداخت میکند و کاربرش از تاریخ پایان فعلی تمدید میشود (یا از اکنون اگر آن تاریخ گذشته باشد)؛ پلن دارای محدودیت ترافیک سهمیه تازهای شروع میکند. جزئیات: تمدید اشتراک VPN با کریپتو.
اگر مشتری کمتر از مبلغ کل بفرستد، کاربر فعال نمیشود: ربات فقط برای فاکتور paid دسترسی میدهد. مبلغ دریافتشده به موجودی SnapEX Pay شما میرسد و باقی را خودتان با مشتری حل میکنید. کمپرداخت چطور کار میکند: مشتری کمتر از مبلغ فاکتور فرستاد.
اگر چیزی کار نکرد
- پس از زدن پلن «Payment is unavailable right now» (پرداخت در حال حاضر در دسترس نیست). ربات نتوانست فاکتور بسازد:
SNAPEX_API_KEY(کلید اشتباه یا باطلشده) و لاگها را بررسی کنید. - وبهوک 401 «bad webhook signature» میگیرد.
SNAPEX_WEBHOOK_SECRETمطابقت ندارد یا پروکسی بدنه درخواست را تغییر میدهد. همگام بودن ساعت سرور را هم بررسی کنید. - مشتری پرداخت کرده اما چیزی نگرفته. در لاگها دنبال
provision failedبگردید. SnapEX Pay ارسال را دوباره تلاش میکند؛ وقتی پنل دوباره کار کند، ارسال بعدی کاربر را فعال میکند، یا میتوانید ارسال را از گزارش در پنل فروشنده دوباره بفرستید. - Marzban لینک بدون هاست میفرستد.
XRAY_SUBSCRIPTION_URL_PREFIXرا در Marzban یاMARZBAN_SUB_URLرا در ربات تنظیم کنید. - 3x-ui: «login failed».
XUI_URL(همراه با web base path) و اطلاعات ورود را بررسی کنید و احراز هویت دومرحلهای را برای آن حساب خاموش کنید. - Remnawave: کاربر ساخته میشود اما اشتراک خالی است.
REMNAWAVE_SQUAD_UUIDSرا روی اسکوادهایی بگذارید که نودهای شما در آنها هستند. - چند نسخه از ربات. برای هر
DATA_DIRفقط یک نمونه اجرا کنید: محافظت در برابر تکرار در یک پروسه و فایل SQLite آن کار میکند.
هزینه
۱٪ برای هر پرداخت، بدون هزینه راهاندازی و بدون هزینه ماهانه. ربات رایگان است.
صفحه ربات: ربات تلگرام VPN. بهجای آن از فروشگاه خود پنل میفروشید؟ ببینید: پرداخت کریپتو در Xboard و V2Board. مرور برای سرویسهای VPN: پرداخت کریپتو برای VPN. ثبتنام: pay.snapex.pro.