Thu tiền từ bot Telegram bằng VietQR và AgentPay
Bài toán thực tế: Bạn là ai và tại sao lại cần thu tiền từ bot?
Hình dung một ngày bình thường: bạn vừa tạo một bot Telegram để bán khoá học lập trình trực tuyến. Bạn nhận được 15 tin nhắn từ khách hỏi mua khoá "Làm chủ Python trong 30 ngày" với giá 299.000 đ. Vấn đề là: làm sao nhận được tiền từ họ mà không cần tích hợp Stripe (phí quốc tế cao), không cần Paypal (phức tạp), và chắc chắn không phải hỏi khách chuyển tiền thủ công?
Or một kịch bản khác: bạn là chủ quán cà phê, muốn bot Telegram giúp khách đặt hàng và thanh toán ngay tức thì thay vì phải chuyển khoản qua tin nhắn riêng biệt.
Đó chính là lúc AgentPay VN trở nên cực kỳ hữu ích. Nó giúp bạn nhận thanh toán VietQR (phổ biến nhất Việt Nam) mà hoàn toàn không giữ tiền — tiền chuyển thẳng vào tài khoản ngân hàng của bạn.
Tại sao AgentPay lại khác biệt?
Có rất nhiều SDK thanh toán, nhưng AgentPay được thiết kế đặc biệt cho AI agents và bots. Ba điểm nổi bật:
-
Không giữ tiền: AgentPay chỉ tạo QR code trỏ trực tiếp tới tài khoản ngân hàng của bạn. Khác với các nền tảng kiếm lời từ việc giữ tiền khách, AgentPay MIT License (open-source) không lấy commission.
-
Xác nhận thanh toán tự động: Sau khi khách quét QR và chuyển tiền, bank feed (kết nối ngân hàng thực) tự động xác nhận settlement, bot lập tức biết tiền đã về.
-
Tích hợp với MCP server: Bạn có thể dùng với Claude hay bất kỳ AI nào hỗ trợ MCP, mở ra khả năng agents tự động xử lý luồng thanh toán.
Cài đặt AgentPay SDK — 2 phút là xong
Bước 1: Cài đặt Python package
pip install agentpay-vn
Thế là xong! Không cần key, không cần config phức tạp lúc đầu.
Bước 2: Cài đặt MCP server (tùy chọn nhưng khuyến khích)
Nếu bạn dùng Claude hoặc AI agent khác:
pip install agentpay-mcp
Sau đó tạo file claude_desktop_config.json (macOS/Linux: ~/.config/Claude/claude_desktop_config.json):
{
"mcpServers": {
"agentpay-vn": {
"command": "python",
"args": ["-m", "agentpay_mcp.server"]
}
}
}
Restart Claude Desktop, bạn sẽ thấy AgentPay tools xuất hiện.
Luồng thanh toán cơ bản (3 bước)
AgentPay hoạt động theo mô hình siêu đơn giản:
# Bước 1: Tạo yêu cầu thanh toán
from agentpay_vn import create_payment_request
payment = create_payment_request(
amount=299000, # VND
merchant_name="Khoá học Python",
reference_id="order_12345",
description="Khoá học Làm chủ Python trong 30 ngày"
)
print(f"Checkout URL: {payment.checkout_url}")
print(f"Payment ID: {payment.payment_id}")
# Bước 2: Gửi checkout_url cho khách (qua tin nhắn Telegram)
# bot.send_message(chat_id, f"Vui lòng thanh toán tại: {payment.checkout_url}")
# Bước 3: Chờ xác nhận thanh toán
from agentpay_vn import await_settlement
result = await_settlement(
payment_id=payment.payment_id,
timeout_seconds=600 # Chờ tối đa 10 phút
)
if result.status == "settled":
print(f"✓ Tiền đã về tài khoản! Số tiền: {result.amount}")
# Cấp quyền truy cập khoá học cho khách
else:
print(f"✗ Thanh toán hết hạn hoặc bị huỷ")
Giải thích từng dòng:
- create_payment_request(): Tạo một session thanh toán duy nhất, trả về object chứa checkout_url (QR code) và payment_id (ID để theo dõi).
- amount=299000: Số tiền theo đơn vị VND.
- reference_id: ID đơn hàng của bạn, dùng để match với database riêng.
- await_settlement(): Chặn (blocking) cho tới khi thanh toán được xác nhận qua bank feed, hoặc hết timeout.
Ví dụ thực tế: Bot Telegram bán khoá học online
Dưới đây là kịch bản đầy đủ bot bán khoá học:
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes
from agentpay_vn import create_payment_request, await_settlement
import asyncio
BOT_TOKEN = "your_telegram_bot_token"
# Database khóa học (trong thực tế dùng DB thật)
COURSES = {
"python101": {
"name": "Làm chủ Python trong 30 ngày",
"price": 299000,
"content": "30 bài học video + 50 bài tập thực hành"
},
"django101": {
"name": "Django REST Framework từ 0 đến 1",
"price": 399000,
"content": "Xây dựng API production-ready"
}
}
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
msg = "🎓 **Chào mừng đến cửa hàng khoá học!**\n\n"
msg += "Danh sách khoá học:\n"
for key, course in COURSES.items():
msg += f"• {course['name']}: {course['price']:,} VND\n"
msg += "\nGõ `/buy python101` để mua khoá Python"
await update.message.reply_text(msg, parse_mode="Markdown")
async def buy_course(update: Update, context: ContextTypes.DEFAULT_TYPE):
if not context.args or context.args[0] not in COURSES:
await update.message.reply_text("❌ Khoá học không tồn tại. Gõ /start để xem danh sách.")
return
course_id = context.args[0]
course = COURSES[course_id]
user_id = update.effective_user.id
# Tạo yêu cầu thanh toán
payment = create_payment_request(
amount=course["price"],
merchant_name="Cửa hàng khoá học",
reference_id=f"user_{user_id}_course_{course_id}",
description=course["name"]
)
msg = f"🛒 **{course['name']}**\n\n"
msg += f"Giá: {course['price']:,} VND\n"
msg += f"Nội dung: {course['content']}\n\n"
msg += f"**[Thanh toán ngay](checkout_url_placeholder)**\n\n"
msg += f"QR code sẽ xuất hiện khi bạn click link trên. Quét và chuyển khoản."
await update.message.reply_text(msg, parse_mode="Markdown")
# Chờ thanh toán trong background
asyncio.create_task(wait_and_grant_access(user_id, payment, context))
async def wait_and_grant_access(user_id: int, payment, context):
try:
result = await_settlement(
payment_id=payment.payment_id,
timeout_seconds=600
)
if result.status == "settled":
msg = f"✅ **Thanh toán thành công!**\n\n"
msg += f"Tiền đã được xác nhận: {result.amount:,} VND\n\n"
msg += f"🔗 **Link truy cập khoá học:** https://example.com/access/{result.reference_id}\n"
msg += f"**Mật khẩu:** password123\n\n"
msg += f"Bắt đầu học ngay nhé! 🚀"
await context.bot.send_message(chat_id=user_id, text=msg, parse_mode="Markdown")
else:
await context.bot.send_message(
chat_id=user_id,
text="⏱️ Thanh toán hết hạn hoặc bị huỷ. Vui lòng thử lại."
)
except Exception as e:
await context.bot.send_message(chat_id=user_id, text=f"❌ Lỗi: {str(e)}")
# Setup bot
app = Application.builder().token(BOT_TOKEN).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("buy", buy_course))
if __name__ == "__main__":
app.run_polling()
Quy trình khi khách dùng bot:
1. Gõ /start → Xem danh sách khoá học
2. Gõ /buy python101 → Nhận link thanh toán
3. Click link → Quét QR → Chuyển tiền
4. Tiền về tài khoản ngân hàng → Bot tự động gửi link truy cập khoá học
So sánh AgentPay với các giải pháp khác
| Yếu tố | AgentPay | Stripe | Paypal | Chuyển khoản thủ công |
|---|---|---|---|---|
| Phí giao dịch | 0% (open-source) | 2.9% + 0.3$ | 2.2% | 0% |
| Hỗ trợ VietQR | ✅ | ❌ | ❌ | ✅ |
| Bank feed tự động | ✅ | ✅ | ❌ | ❌ |
| Giữ tiền | ❌ Không | ✅ Có | ✅ Có | ❌ Không |
| Setup phức tạp | ❌ Đơn giản | ✅ Rất phức | ✅ Rất phức | N/A |
| Dành cho bots/AI | ✅ Có MCP | ❌ Không | ❌ Không | N/A |
| Thích hợp cho SV/Startup | ✅ Rất tốt | ❌ Phí cao | ❌ Phí cao | ❌ Thủ công |
Kết luận: Nếu bạn ở Việt Nam, làm bot/AI agent, và muốn không bận tâm về phí, AgentPay là lựa chọn tối ưu.
Cấu hình AgentPay cho Claude Desktop (MCP)
Nếu bạn muốn Claude giúp tạo payment request, hãy config như sau:
{
"mcpServers": {
"agentpay-vn": {
"command": "python",
"args": ["-m", "agentpay_mcp.server"],
"env": {
"AGENTPAY_LOG_LEVEL": "INFO"
}
}
}
}
Sau khi config, bạn có thể yêu cầu Claude như:
"Tạo một payment request cho khách mua khoá học Python giá 299,000 VND, user_id là 12345"
Claude sẽ tự động gọi hàm AgentPay và trả về checkout URL cho bạn.
Những điều nên làm / Không nên làm
✅ Nên:
- Lưu trữ payment_id vào database để theo dõi đơn hàng
- Thiết lập timeout hợp lý (5-10 phút tùy loại hàng)
- Gửi thông báo nhắc nhở nếu khách quên thanh toán
- Xử lý ngoại lệ (network error, timeout) với try-except
- Test với số tiền nhỏ trước khi deploy lên production
- Đọc kỹ docs tại https://agentpay.servicesai.vn/v1/docs
❌ Không nên:
- Không bao giờ lưu trữ payment_id dài hạn mà không xử lý (sẽ tích tiền lỗi)
- Không gửi QR code qua email không an toàn (QR code = trực tiếp tới tài khoản bạn)
- Không quên handle trường hợp khách hủy thanh toán (cần refund logic)
- Không sử dụng
await_settlementcho timeout quá dài (bot sẽ bị "treo")
Câu hỏi thường gặp (FAQ)
1. Tiền có thể bị mất không nếu dùng AgentPay?
Không. Tiền chuyển thẳng vào tài khoản ngân hàng của bạn qua VietQR. AgentPay chỉ tạo QR và xác nhận, không giữ tiền ở giữa.
2. Phải trả phí commission hay subscription không?
Không. AgentPay là MIT License (open-source), hoàn toàn miễn phí. Bạn chỉ trả phí ngân hàng bình thường (nếu có) khi khách chuyển tiền.
3. Có thể tích hợp với Zalo Pay, Momo không?
Hiện tại AgentPay tập trung vào VietQR. Nếu cần Zalo Pay/Momo, bạn có thể tích hợp các SDK khác song song.
4. Cần API key hoặc authentication gì không?
Tuỳ bạn. Nếu chỉ test locally, không cần. Nếu dùng bank feed (xác nhận thanh toán tự động), cần thiết lập kết nối ngân hàng riêng — chi tiết xem docs.
5. Độ trễ xác nhận thanh toán bao lâu?
Thường 1-5 phút tùy ngân hàng. Mã đơn được trả về ngay khi khách quét QR, nhưng tiền vào tài khoản và xác nhận mất chút thời gian (như chuyển khoản thường).
Tóm tắt nhanh
- 🎯 AgentPay VN = SDK Python + MCP server cho bots/AI agents nhận VietQR
- 💰 Không giữ tiền, 0% phí, bank feed tự động xác nhận
- ⚡ Cài đặt siêu nhanh:
pip install agentpay-vn - 3️⃣ 3 bước thanh toán: create_payment_request → gửi checkout_url → await_settlement
- 🤖 Tích hợp Claude/AI: Dùng MCP server để agents tự động xử lý
- 📚 Ví dụ thực tế: Bot bán khoá học, quán cà phê, shop online
- ✅ Miễn phí, open-source, bảo mật — tiền thẳng vào tài khoản bạn
Bước tiếp theo
Bạn đã hiểu cách hoạt động. Bây giờ:
- Cài đặt SDK:
pip install agentpay-vn - Xem docs chi tiết: https://agentpay.servicesai.vn/v1/docs
- Fork repo và test: https://github.com/phuocdu/agentpay-vn
- Tích hợp vào bot của bạn theo ví dụ trên
- Triển khai và bắt đầu nhận tiền từ khách tự động!
Nếu có thắc mắc, tìm người duy trì AgentPay hoặc mở issue trên GitHub. Chúc bạn kiếm tiền hiệu quả! 🚀