Thêm thanh toán VietQR cho AI agent trong 10 phút

2026-08-03 · AgentPay VN

aipythonmcpvietqragentpay

Bạn đang gặp bài toán nào?

Tưởng tượng bạn có một chatbot AI bán khoá học online, hoặc một agent tự động hỗ trợ khách hàng quán cà phê. Khách hàng muốn thanh toán ngay trong cuộc trò chuyện, nhưng bạn lại phải dừng lại để chuyển hướng đến một trang thanh toán bên ngoài, hoặc còn tệ hơn — phải xây dựng toàn bộ hệ thống thanh toán từ đầu?

Bây giờ hãy tưởng tượng một tình huống khác: bạn lo lắng về bảo mật. Nếu tích hợp cổng thanh toán vào bot, hệ thống của bạn có phải lưu trữ các thông tin thanh toán nhạy cảm không? Rủi ro bảo mật lập tức tăng gấp bội.

AgentPay VN sinh ra để giải quyết chính xác những bài toán này.


AgentPay VN là gì?

AgentPay VN là một SDK Python mã nguồn mở (MIT) kết hợp với MCP server, cho phép AI agent của bạn thu thập thanh toán VietQR một cách hoàn toàn an toàn.

Điểm mấu chốt: AgentPay KHÔNG bao giờ giữ tiền. QR code sinh ra sẽ trỏ thẳng vào tài khoản ngân hàng của merchant (người bán), và ngân hàng sẽ tự động xác nhận khi thanh toán hoàn tất. Bạn không phải lo về PCI compliance, tokenization, hay bất kỳ vấn đề bảo mật phức tạp nào.


Tại sao lại chọn AgentPay VN thay vì các giải pháp khác?

Tính năng AgentPay VN Cổng thanh toán truyền thống Tự xây dựng
Thời gian tích hợp 10 phút 2-3 tuần 1-3 tháng
Bảo mật (không giữ tiền) ✅ Hoàn toàn ❌ Phải lưu tiền tạm ❌ Cần xây dựng
Chi phí hạ tầng Miễn phí (open-source) $100-500/tháng $1000+
Tích hợp với AI agent ✅ Dễ dàng (MCP) ⚠️ Phức tạp ❌ Rất khó
Hỗ trợ VietQR ✅ Native ⚠️ Thường chỉ NAPAS ✅ Nếu bạn xây

Cài đặt — Chỉ cần 1 lệnh

pip install agentpay-vn

Đó là tất cả! SDK đã sẵn sàng trong môi trường Python của bạn.

Nếu bạn muốn sử dụng AgentPay như một MCP server (để tích hợp với Claude hoặc các agent framework khác), cài thêm:

pip install agentpay-mcp

Quy trình 3 bước cơ bản

AgentPay VN hoạt động theo một quy trình rất đơn giản:

  1. Tạo yêu cầu thanh toán (create_payment_request)
  2. Gửi URL checkout cho khách (send_checkout_url)
  3. Chờ xác nhận thanh toán từ ngân hàng (await_settlement)

Code thực tế: Ví dụ đầu tiên

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

from agentpay_vn import PaymentClient, PaymentRequest
import asyncio

# Khởi tạo client với thông tin merchant
payment_client = PaymentClient(
    merchant_id="MCH_KHOAHOC_123",
    account_name="Công ty Khoá học AI Việt",
    account_number="1234567890",  # Số tài khoản ngân hàng
    bank_code="970418"  # Mã SWIFT/BIN của ngân hàng (VD: TPBank = 970418)
)

# Bot nhận yêu cầu từ khách hàng
async def handle_course_purchase(customer_id: str, course_name: str, price_vnd: int):
    # Bước 1: Tạo yêu cầu thanh toán
    payment_request = PaymentRequest(
        order_id=f"ORD_{customer_id}_{course_name}",
        amount=price_vnd,
        description=f"Thanh toán khóa học: {course_name}",
        metadata={"customer_id": customer_id, "course": course_name}
    )

    # Tạo QR code và lấy URL checkout
    checkout_response = await payment_client.create_payment_request(payment_request)
    checkout_url = checkout_response["checkout_url"]
    qr_code_data = checkout_response["qr_code"]  # Dữ liệu VietQR

    print(f"🎓 Khách hàng {customer_id} vui lòng quét mã QR:")
    print(f"Giá: {price_vnd:,} VND")
    print(f"URL: {checkout_url}")

    # Bước 2 & 3: Gửi URL và chờ thanh toán (timeout 30 phút)
    try:
        settlement = await payment_client.await_settlement(
            order_id=payment_request.order_id,
            timeout_seconds=1800  # 30 phút
        )

        # Thanh toán thành công!
        print(f"✅ Thanh toán thành công! Mã giao dịch: {settlement['transaction_id']}")
        print(f"💰 Số tiền: {settlement['amount']} VND")

        # Cấp quyền truy cập khoá học
        await grant_course_access(customer_id, course_name)

        return {"status": "success", "transaction_id": settlement["transaction_id"]}

    except asyncio.TimeoutError:
        print(f"⏱️ Hết thời gian chờ thanh toán cho khách {customer_id}")
        return {"status": "timeout"}

# Gọi hàm
asyncio.run(handle_course_purchase("CUST_001", "Python_Advanced", 299000))

Giải thích từng phần:


Tích hợp với MCP Server (cho Claude & các AI agent)

Nếu bạn đang dùng Claude hoặc một agent framework hỗ trợ MCP (Model Context Protocol), hãy cấu hình AgentPay như một tool:

{
  "mcpServers": {
    "agentpay": {
      "command": "agentpay-mcp",
      "args": [
        "--merchant-id", "MCH_KHOAHOC_123",
        "--account-name", "Công ty Khoá học AI Việt",
        "--account-number", "1234567890",
        "--bank-code", "970418"
      ],
      "env": {
        "LOG_LEVEL": "info"
      }
    }
  }
}

Sau khi cấu hình, Claude sẽ có thể tự động gọi các hàm thanh toán mà không cần bạn can thiệp. Ví dụ, khi khách nói "Tôi muốn mua khóa học Python hôm nay", Claude có thể:

  1. Hiểu ý định của khách
  2. Tự động gọi create_payment_request
  3. Gửi QR code cho khách
  4. Chờ await_settlement và tự động cấp quyền truy cập

Tất cả mà bạn không phải viết một dòng logic xử lý đặc biệt.


Ví dụ kịch bản đời thực: Quán cà phê tự phục vụ

Hãy tưởng tượng bạn có một bot Telegram/Messenger cho quán cà phê "Cà Phê AI":

Khách: "Cho tôi 1 cà phê espresso và 1 bánh croissant"
Bot: "Được! Tổng cộng 85,000 VND. Vui lòng quét mã QR này để thanh toán."
[Bot hiển thị mã QR VietQR]
Khách: [Quét mã bằng app ngân hàng]
Bot (sau 3 giây): "✅ Cảm ơn! Đơn hàng của bạn sẽ được chuẩn bị. Mã đơn: #ORD_2024_001"

Code cho kịch bản này:

from agentpay_vn import PaymentClient, PaymentRequest
import asyncio

payment_client = PaymentClient(
    merchant_id="CAFE_AI_001",
    account_name="Cà phê AI Việt Nam",
    account_number="9876543210",
    bank_code="970403"  # Agribank
)

async def process_cafe_order(customer_phone: str, items: list, total_price: int):
    """Xử lý đơn hàng cà phê với thanh toán QR"""

    # Tạo ID đơn hàng
    order_id = f"CAFE_{customer_phone}_{int(asyncio.get_event_loop().time())}"

    # Tạo yêu cầu thanh toán
    payment_req = PaymentRequest(
        order_id=order_id,
        amount=total_price,
        description=f"Đơn hàng: {', '.join(items)}",
        metadata={
            "customer_phone": customer_phone,
            "items_count": len(items),
            "type": "cafe"
        }
    )

    # Tạo QR code
    response = await payment_client.create_payment_request(payment_req)

    print(f"\n📦 ĐƠN HÀNG MỚI")
    print(f"Khách: {customer_phone}")
    print(f"Sản phẩm: {', '.join(items)}")
    print(f"Tổng tiền: {total_price:,} VND")
    print(f"\nVui lòng quét mã QR: {response['qr_code']}\n")

    # Chờ khách thanh toán (timeout 10 phút cho cà phê)
    try:
        settlement = await payment_client.await_settlement(
            order_id=order_id,
            timeout_seconds=600
        )
        print(f"✅ THANH TOÁN THÀNH CÔNG")
        print(f"Mã giao dịch: {settlement['transaction_id']}")
        print(f"Đơn hàng {order_id} đang được chuẩn bị...\n")
        return True
    except asyncio.TimeoutError:
        print(f"⚠️ Khách {customer_phone} chưa thanh toán. Huỷ đơn.\n")
        return False

# Sử dụng
asyncio.run(process_cafe_order(
    "0912345678",
    ["Espresso", "Bánh Croissant"],
    85000
))

Nâng cao: Theo dõi nhiều đơn hàng cùng lúc

Nếu bot bạn nhận nhiều đơn hàng đồng thời (hoàn toàn bình thường với một quán cà phê bận rộn), hãy sử dụng asyncio.gather():

import asyncio
from agentpay_vn import PaymentClient

# Danh sách đơn hàng
orders = [
    {"phone": "0912345678", "items": ["Latte", "Bánh"], "price": 75000},
    {"phone": "0987654321", "items": ["Cappuccino"], "price": 45000},
    {"phone": "0901234567", "items": ["Americano", "Kem"], "price": 65000},
]

async def handle_all_orders():
    tasks = [
        process_cafe_order(order["phone"], order["items"], order["price"])
        for order in orders
    ]
    results = await asyncio.gather(*tasks)
    print(f"\n📊 Tóm tắt: {sum(results)}/{len(orders)} đơn hàng thanh toán thành công")

asyncio.run(handle_all_orders())

AgentPay VN được thiết kế để xử lý tình huống này một cách hiệu quả.


Danh sách kiểm tra: Nên làm / Không nên làm

✅ Nên: - Sử dụng metadata để lưu trữ thông tin đơn hàng (khách hàng, sản phẩm, địa chỉ). - Gọi await_settlement() trong một task async để không block bot chính. - Xử lý asyncio.TimeoutError để có logic fallback (ví dụ: huỷ đơn). - Lưu transaction_id từ settlement để audit và reconciliation. - Test với số tiền nhỏ trước (ví dụ: 10,000 VND) để đảm bảo workflow.

❌ Không nên: - Gọi await_settlement() mà không timeout — bot sẽ bị treo nếu khách không thanh toán. - Giữ lại tiền trong hệ thống của bạn. AgentPay gửi trực tiếp vào tài khoản ngân hàng. - Bỏ qua kiểm tra merchant_idbank_code. Sai một ký tự sẽ gây lỗi. - Công khai account_number trong code. Dùng biến môi trường (os.getenv()).


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

1. Tiền thanh toán đi đâu? Có an toàn không?

Tiền chuyển trực tiếp vào tài khoản ngân hàng của bạn (merchant) thông qua hệ thống VietQR của ngân hàng. AgentPay không bao giờ chạm vào tiền. Bạn không phải lo PCI compliance hay bảo mật dữ liệu thẻ tín dụng.

2. Mất bao lâu để tiền về tài khoản?

Thường 1-5 phút sau khi khách thanh toán. Tất cả phụ thuộc vào ngân hàng của khách. AgentPay sẽ thông báo ngay khi nhận xác nhận từ ngân hàng.

3. Phí giao dịch bao nhiêu?

AgentPay VN hoàn toàn miễn phí (mã nguồn mở MIT). Bạn chỉ phải trả phí giao dịch cho ngân hàng của mình (thường 0-3,000 VND per transaction, hoặc 0% tùy gói).

4. Nếu bot bị lỗi giữa chừng thì sao?

Vì QR code trỏ trực tiếp vào tài khoản ngân hàng, dù bot bị lỗi, khách vẫn có thể thanh toán bình thường. Bạn có thể await_settlement() lại lần sau. Không tiền mất, không dữ liệu mất.


Tóm tắt nhanh


Bắt đầu ngay hôm nay

Bạn chỉ cần 3 phút để cài đặt:

pip install agentpay-vn

Rồi copy ví dụ code ở trên, điền thông tin merchant của bạn (số tài khoản, mã ngân hàng), và chạy!

📚 Tài liệu chi tiết: https://agentpay.servicesai.vn/v1/docs

🔧 Mã nguồn & issue tracker: https://github.com/phuocdu/agentpay-vn

Nếu có câu hỏi, hãy tạo issue trên GitHub hoặc liên hệ qua tài liệu. Team AgentPay VN luôn sẵn sàng hỗ trợ!

Happy coding! 🚀

Bắt đầu →

← Tất cả bài