Thu tiền từ bot Telegram với VietQR và AgentPay

2026-08-26 · AgentPay VN

agentpayvietqrpythontelegramai-agents

Bài toán thực tế: Bot bán hàng của bạn đang thua lỗ vì không thể thu tiền

Bạn vừa xây dựng một bot Telegram bán khoá học tiếng Anh online. Mỗi ngày có 15-20 khách hỏi, nhưng khi họ muốn thanh toán, bạn bị kẹt. Gửi tài khoản ngân hàng để chuyển khoản? Quá chậm, không professional, và khách hay "quên". Dùng payment gateway quốc tế? Phí 3-5%, chưa kể thủ tục rắc rối. Bạn cần cách nhanh, đơn giản, an toàn để bot tự động yêu cầu thanh toán và xác nhận ngay lập tức—tất cả trong Telegram.

Đây chính là lúc AgentPay VN ra tay giúp bạn.

AgentPay là gì? Tại sao nó khác biệt?

AgentPay VN là một bộ công cụ mã nguồn mở (giấy phép MIT) được thiết kế riêng cho các AI agent và bot muốn thu tiền từ khách Việt Nam qua VietQR. Điểm đặc biệt:

Quy trình thanh toán 3 bước đơn giản

AgentPay hoạt động theo sơ đồ này:

Bot tạo yêu cầu thanh toán
         ↓
Khách quét QR VietQR
         ↓
Tiền chuyển vào TK ngân hàng của bạn
         ↓
AgentPay nhận thông báo từ ngân hàng
         ↓
Bot gửi khoá học/hàng hóa cho khách

Cả quá trình diễn ra trong 30-60 giây, khách không cần rời Telegram.

Cài đặt AgentPay SDK cho Python

Bước đầu tiên, cài đặt package từ PyPI:

pip install agentpay-vn

Nếu bạn muốn sử dụng AgentPay qua MCP server (để kết nối với Claude hoặc các AI agent khác):

pip install agentpay-mcp

Verify cài đặt:

python -c "import agentpay; print(agentpay.__version__)"

Viết code cho bot Telegram: Quy trình thanh toán

Dưới đây là một ví dụ hoàn chỉnh—bot bán khoá học tiếng Anh:

Bước 1: Tạo yêu cầu thanh toán

from agentpay import PaymentRequest, create_payment_request
import asyncio

# Thông tin sản phẩm
PRODUCT_NAME = "Khoá học Tiếng Anh giao tiếp - 10 buổi"
PRICE = 500000  # VND
MERCHANT_ACCOUNT = "1234567890"  # số tài khoản ngân hàng bạn
MERCHANT_BANK = "TCB"  # Techcombank, hoặc "VIB", "MB", "ACB" v.v.

# Tạo yêu cầu thanh toán
payment_req = create_payment_request(
    amount=PRICE,
    description=f"Thanh toán {PRODUCT_NAME}",
    order_id="ORDER_20250128_001",  # ID đơn hàng duy nhất
    merchant_account=MERCHANT_ACCOUNT,
    merchant_bank=MERCHANT_BANK,
    customer_name="Nguyễn Văn A",  # Lấy từ Telegram user
    customer_phone="0987654321"      # Lấy từ Telegram user
)

print(f"QR Code URL: {payment_req.checkout_url}")
print(f"Payment ID: {payment_req.id}")

Giải thích từng dòng: - create_payment_request(): Hàm chính tạo yêu cầu thanh toán, trả về object có chứa checkout_url (link QR VietQR) và id (định danh duy nhất để tracking). - order_id: Phải unique để AgentPay tracking. Bạn có thể dùng f"{user_id}_{int(time.time())}". - merchant_account + merchant_bank: Tài khoản + ngân hàng của bạn (người bán), không phải khách hàng.

from telegram import Bot, InputMediaPhoto
import asyncio

TELEGRAM_BOT_TOKEN = "YOUR_BOT_TOKEN_HERE"
bot = Bot(token=TELEGRAM_BOT_TOKEN)

async def send_payment_to_customer(chat_id, payment_req):
    """
    Gửi mã QR thanh toán cho khách qua Telegram.
    """
    message_text = f"""
🛒 **Đơn hàng của bạn:**
{PRODUCT_NAME}

💰 **Giá:** {PRICE:,} VND

📲 **Hướng dẫn thanh toán:**
1. Bấm nút "Thanh toán" bên dưới
2. Mở ứng dụng ngân hàng
3. Quét mã QR
4. Xác nhận thanh toán

⏱️ Bạn có **15 phút** để thanh toán.
    """

    # Gửi mã QR dưới dạng ảnh hoặc link
    await bot.send_message(
        chat_id=chat_id,
        text=message_text,
        reply_markup={
            "inline_keyboard": [
                [
                    {
                        "text": "💳 Thanh toán ngay",
                        "url": payment_req.checkout_url
                    }
                ]
            ]
        }
    )

# Gọi hàm
# await send_payment_to_customer(chat_id=123456789, payment_req=payment_req)

Bước 3: Chờ xác nhận thanh toán

from agentpay import await_settlement
import asyncio

async def wait_for_payment(payment_id, timeout_seconds=900):
    """
    Chờ tiền về tài khoản.
    """
    try:
        result = await await_settlement(
            payment_id=payment_id,
            timeout=timeout_seconds,  # 15 phút
            poll_interval=5  # Kiểm tra mỗi 5 giây
        )

        if result.success:
            print(f"✅ Thanh toán thành công!")
            print(f"   Số tiền: {result.amount:,} VND")
            print(f"   Thời gian: {result.timestamp}")
            return True
        else:
            print(f"❌ Thanh toán thất bại: {result.error_message}")
            return False

    except asyncio.TimeoutError:
        print("⏱️ Hết thời gian chờ (khách chưa thanh toán)")
        return False

# Sử dụng trong handler Telegram
async def handle_buy_course(update, context):
    chat_id = update.effective_chat.id
    user = update.effective_user

    # Bước 1: Tạo yêu cầu thanh toán
    payment_req = create_payment_request(
        amount=PRICE,
        description=PRODUCT_NAME,
        order_id=f"ORDER_{chat_id}_{int(time.time())}",
        merchant_account=MERCHANT_ACCOUNT,
        merchant_bank=MERCHANT_BANK,
        customer_name=user.first_name,
        customer_phone=user.phone_number or "unknown"
    )

    # Bước 2: Gửi QR
    await send_payment_to_customer(chat_id, payment_req)

    # Bước 3: Chờ thanh toán
    is_paid = await wait_for_payment(payment_req.id)

    if is_paid:
        # Gửi khoá học cho khách
        await bot.send_message(
            chat_id=chat_id,
            text="🎉 Thanh toán thành công! Khoá học của bạn đã sẵn sàng.\n\n" +
                 "📚 Truy cập: https://course.example.com/access?token=XXX"
        )
    else:
        await bot.send_message(
            chat_id=chat_id,
            text="Thanh toán bị hủy hoặc hết hạn. Vui lòng thử lại."
        )

Cấu hình AgentPay MCP cho Claude

Nếu bạn muốn sử dụng AgentPay qua Claude (AI agent), hãy thêm cấu hình này vào claude_desktop_config.json:

{
  "mcpServers": {
    "agentpay": {
      "command": "python",
      "args": ["-m", "agentpay_mcp"],
      "env": {
        "AGENTPAY_MERCHANT_ACCOUNT": "1234567890",
        "AGENTPAY_MERCHANT_BANK": "TCB",
        "AGENTPAY_API_KEY": "your_api_key_if_needed"
      }
    }
  }
}

Sau đó, Claude có thể gọi trực tiếp AgentPay để tạo yêu cầu thanh toán mà không cần code trung gian.

Ví dụ kịch bản thực tế: Quán cà phê bán online

Quán cà phê "Cà Phê Sáng" muốn bán cà phê qua Telegram, khách đặt hàng và thanh toán trực tiếp:

Quy trình: 1. Khách: /order → chọn "Cà phê đen đá (30K)" 2. Bot: Tạo yêu cầu thanh toán, gửi QR VietQR 3. Khách: Quét QR, chuyển 30K 4. Bot: Nhận thông báo từ ngân hàng → xác nhận 5. Bot: Gửi voucher pickup, in đơn hàng cho quán

Code snippet:

MENU = {
    "1": {"name": "Cà phê đen đá", "price": 30000},
    "2": {"name": "Cà phê sữa nóng", "price": 35000},
    "3": {"name": "Trà dâu tây", "price": 25000},
}

async def order_coffee(update, context):
    choice = update.message.text  # "1", "2", hoặc "3"
    item = MENU.get(choice)

    if not item:
        await update.message.reply_text("Lựa chọn không hợp lệ")
        return

    payment_req = create_payment_request(
        amount=item["price"],
        description=f"Đơn hàng: {item['name']}",
        order_id=f"CAFE_{update.effective_user.id}_{int(time.time())}",
        merchant_account=MERCHANT_ACCOUNT,
        merchant_bank=MERCHANT_BANK,
        customer_name=update.effective_user.first_name
    )

    await update.message.reply_text(
        f"☕ {item['name']} - {item['price']:,} VND\n" +
        f"Bấm để thanh toán: {payment_req.checkout_url}"
    )

    if await wait_for_payment(payment_req.id):
        voucher_code = f"PICKUP_{payment_req.id[:8]}"
        await update.message.reply_text(
            f"✅ Thanh toán thành công!\n" +
            f"📍 Mã lấy hàng: {voucher_code}\n" +
            f"⏱️ Hàng sẽ sẵn sàng trong 10 phút"
        )

Nên làm gì & Không nên làm gì

✅ Nên ❌ Không nên
Lưu order_id để tracking đơn hàng Để timeout = 0 (khách không có thời gian thanh toán)
Kiểm tra payment_req.success trước khi gửi hàng Gửi hàng khi chưa xác nhận tiền
Dùng unique order_id cho mỗi giao dịch Tái sử dụng order_id
Ghi log tất cả thanh toán để audit Tin tưởng callback mà không verify
Gửi xác nhận chi tiết cho khách Chỉ gửi "OK" mà không có voucher/thông tin
Cấu hình timeout hợp lý (10-15 phút) Set timeout quá lâu (>1 giờ)

Câu hỏi thường gặp (FAQ)

Q: Tiền sẽ về TK ngân hàng mất bao lâu? A: Nếu dùng VietQR (chuyển khoản trong nội bộ ngân hàng), tiền về trong 1-3 phút. Nếu khách chuyển từ ngân hàng khác, mất 1-2 giờ. AgentPay không giữ tiền, nó chỉ nhận thông báo từ ngân hàng của bạn.

Q: Phí là bao nhiêu? A: AgentPay miễn phí. Bạn chỉ trả phí chuyển khoản thông thường của ngân hàng (thường 0-3K/lần). VietQR còn miễn phí chuyển khoản nội bộ.

Q: Có cần API key hay tài khoản nào không? A: Không. AgentPay tạo QR VietQR dựa trên số tài khoản + ngân hàng của bạn. Chỉ cần cấu hình 1 lần là xong.

Q: Khách có thể "lừa" và không thanh toán được không? A: Không. Vì mã QR trỏ trực tiếp vào TK ngân hàng của bạn (thông qua VietQR), khách phải thanh toán để tiền xuất hiện. AgentPay chỉ xác nhận khi tiền thực sự về.

Q: Có hỗ trợ nhiều tài khoản ngân hàng không? A: Có. Bạn có thể tạo nhiều instance của PaymentRequest với merchant_account + merchant_bank khác nhau. Ví dụ: TK chính dùng cho hóa đơn lớn, TK phụ cho tip/donate.

Tóm tắt nhanh

Bước tiếp theo

Sẵn sàng thử AgentPay chưa?

  1. Cài đặt ngay: pip install agentpay-vn
  2. Xem tài liệu chi tiết: https://agentpay.servicesai.vn/v1/docs
  3. Xem code trên GitHub: https://github.com/phuocdu/agentpay-vn
  4. Thử ví dụ Telegram: Fork repo, thay MERCHANT_ACCOUNT + MERCHANT_BANK, chạy bot của bạn.

Dùng AgentPay, bạn không chỉ tiết kiệm phí, mà còn giảm thời gian xác nhận từ hàng phút xuống vài giây. Bot của bạn sẽ tự động gửi hàng/dịch vụ ngay khi tiền về—trải nghiệm khách hàng không thể tốt hơn! 🚀

Bắt đầu →

← Tất cả bài