Logo
Bot Telegram bán hàng thanh toán VietQR: tự tạo mã QR, tự xác nhận đơn

Bot Telegram bán hàng thanh toán VietQR: tự tạo mã QR, tự xác nhận đơn

tobi
tobi•• … views

Nếu bạn bán hàng online qua tin nhắn, chắc bạn quen cảnh: khách hỏi giá, bạn gửi số tài khoản, khách chuyển khoản, bạn mở app ngân hàng dò xem tiền vào chưa, rồi mới trả hàng hoặc gửi mã. Một bot Telegram bán hàng làm thay gần hết chuỗi việc đó: khách tự chọn sản phẩm, bot tạo mã QR chuyển khoản đúng số tiền, đúng nội dung, tiền vào là đơn được xác nhận và bạn nhận thông báo ngay.

Bài này giải thích cách một bot Telegram thanh toán VietQR hoạt động ở mức khái niệm, kiến trúc thường dùng, một đoạn code minh hoạ, và quan trọng nhất là những điểm bảo mật mà nhiều bot làm vội hay bỏ qua.

1. Một bot Telegram bán hàng làm được những gì?

Một bot bán hàng thực tế thường có các chức năng sau:

Chức năng Mô tả
Danh mục sản phẩm Khách gõ lệnh hoặc bấm nút để xem sản phẩm, giá, mô tả, ảnh
Đặt đơn Chọn sản phẩm, số lượng, nhập thông tin cần thiết (tên, số điện thoại, địa chỉ)
Mã QR thanh toán Bot gửi ảnh mã VietQR có sẵn số tài khoản, số tiền và mã đơn
Tự xác nhận Khi tiền vào đúng số tiền và đúng nội dung, đơn tự chuyển sang “đã thanh toán”
Giao hàng số Với sản phẩm số (mã kích hoạt, tài liệu, tài khoản dịch vụ hợp lệ), bot gửi ngay sau khi xác nhận
Báo chủ shop Mỗi đơn mới, đơn đã thanh toán đều được báo vào nhóm hoặc tài khoản Telegram của chủ shop
Hỗ trợ khách Trả lời câu hỏi thường gặp, tra cứu trạng thái đơn, chuyển cho người thật khi cần

Điểm đáng giá nhất là bot chạy 24/7: khách đặt lúc 2 giờ sáng vẫn được xử lý, còn bạn chỉ cần nhìn thông báo.

2. VietQR hoạt động thế nào?

VietQR là chuẩn mã QR chuyển khoản liên ngân hàng tại Việt Nam, do NAPAS cùng các ngân hàng triển khai. Hầu hết app ngân hàng hiện nay quét được mã này. Một mã VietQR có thể chứa:

  • Ngân hàng và số tài khoản nhận.
  • Số tiền cần chuyển.
  • Nội dung chuyển khoản.

Mẹo then chốt của bot bán hàng là dùng mã đơn làm nội dung chuyển khoản. Mỗi đơn có một mã riêng, ví dụ DH1024, và bot tạo một mã QR riêng cho đơn đó. Khách chỉ cần quét và bấm xác nhận, không phải gõ tay số tài khoản hay nội dung, nên gần như không có chuyện chuyển nhầm số tiền hoặc quên ghi nội dung.

Có hai cách tạo ảnh QR: tự sinh chuỗi dữ liệu theo chuẩn rồi vẽ thành ảnh bằng thư viện QR, hoặc dùng dịch vụ tạo ảnh QR qua đường link có tham số (ví dụ dịch vụ Quick Link của VietQR.io). Cách nào cũng được, miễn là số tiền và nội dung được tạo ở phía máy chủ từ dữ liệu đơn hàng, không lấy từ những gì khách gửi lên.

Minh họa bot Telegram bán hàng trên điện thoại với mã QR thanh toán VietQR

3. Tự động xác nhận thanh toán hoạt động ra sao?

Đây là phần “ma thuật” nhưng nguyên lý khá đơn giản:

  1. Tài khoản ngân hàng nhận tiền được kết nối với một dịch vụ thông báo biến động số dư. Tuỳ trường hợp, đó có thể là API dành cho doanh nghiệp của chính ngân hàng hoặc một dịch vụ trung gian được ngân hàng hỗ trợ.
  2. Mỗi khi có giao dịch tiền vào, dịch vụ đó gửi một webhook (một yêu cầu HTTP) tới máy chủ của bạn, kèm số tiền, nội dung chuyển khoản, mã giao dịch.
  3. Máy chủ tìm mã đơn trong nội dung chuyển khoản, đối chiếu với đơn đang chờ thanh toán, kiểm tra số tiền khớp.
  4. Khớp thì cập nhật đơn sang “đã thanh toán”, bot nhắn khách, giao hàng (nếu là hàng số) và báo chủ shop.
  5. Không khớp (thiếu tiền, sai nội dung, không có mã đơn) thì đưa vào danh sách “cần kiểm tra tay” và báo chủ shop.

Mình cố ý không nêu tên dịch vụ cụ thể, vì mỗi ngân hàng hỗ trợ những phương thức khác nhau và điều kiện thay đổi theo thời gian. Khi làm bot, việc đầu tiên là kiểm tra ngân hàng của bạn hỗ trợ cách nhận thông báo giao dịch nào một cách chính thức. Tránh mọi giải pháp yêu cầu bạn đưa mật khẩu internet banking cho bên thứ ba.

4. Kiến trúc của một bot Telegram bán hàng

Một kiến trúc gọn, dễ vận hành gồm bốn phần:

Khách hàng ── Telegram ──> [Webhook bot]  ─┐
                                          ├──> [Ứng dụng xử lý đơn] <──> [Cơ sở dữ liệu]
Ngân hàng ── dịch vụ báo giao dịch ──> [Webhook thanh toán] ─┘          │
                                                                        └──> Thông báo chủ shop
  • Bot Telegram: tạo qua BotFather để lấy bot token. Nên dùng chế độ webhook (Telegram đẩy tin nhắn tới máy chủ của bạn) thay vì hỏi liên tục, vì nhanh và nhẹ hơn.
  • Ứng dụng xử lý: viết bằng Python hoặc Node.js, nhận tin nhắn từ Telegram và webhook từ dịch vụ thanh toán.
  • Cơ sở dữ liệu: SQLite đủ cho shop nhỏ, PostgreSQL hoặc MySQL khi đơn nhiều. Lưu sản phẩm, đơn, giao dịch, nhật ký.
  • VPS: chạy 24/7, có tên miền và HTTPS (Telegram yêu cầu webhook dùng HTTPS). Nếu bạn không muốn tự lo phần máy chủ, mảng quản trị máy chủ của mình sẽ cài đặt, giám sát và sao lưu giúp bạn.

5. Đoạn code minh hoạ: gửi mã QR cho khách

Dưới đây là đoạn Python rút gọn, minh hoạ việc bot gửi tin nhắn và ảnh QR cho một đơn. Ảnh QR được truyền dưới dạng URL; phương thức sendPhoto của Telegram Bot API chấp nhận URL ảnh trên Internet.

import os
import requests
from urllib.parse import quote

BOT_TOKEN = os.environ["BOT_TOKEN"]          # không bao giờ ghi cứng trong code
API = f"https://api.telegram.org/bot{BOT_TOKEN}"

BANK_ID = os.environ["BANK_ID"]              # mã ngân hàng nhận
ACCOUNT_NO = os.environ["ACCOUNT_NO"]        # số tài khoản nhận

def send_payment_qr(chat_id: int, order_code: str, amount: int):
    # Số tiền và nội dung lấy từ đơn trong database, không lấy từ tin nhắn của khách
    qr_url = (
        f"https://img.vietqr.io/image/{BANK_ID}-{ACCOUNT_NO}-compact2.png"
        f"?amount={amount}&addInfo={quote(order_code)}"
    )
    requests.post(f"{API}/sendMessage", json={
        "chat_id": chat_id,
        "text": f"Đơn {order_code}: {amount:,}đ. Quét mã bên dưới để thanh toán, "
                "giữ nguyên nội dung chuyển khoản.",
    }, timeout=10)
    requests.post(f"{API}/sendPhoto", json={
        "chat_id": chat_id,
        "photo": qr_url,
        "caption": f"Nội dung chuyển khoản: {order_code}",
    }, timeout=10)

Trong thực tế còn cần xử lý lỗi, thử lại khi mạng chập chờn, nút bấm (inline keyboard) để chọn sản phẩm, và hàng đợi để không bị giới hạn tốc độ của Telegram khi gửi nhiều tin cùng lúc.

6. Bảo mật: những điều không được làm ẩu

Bot dính tới tiền thì bảo mật là bắt buộc, không phải tuỳ chọn:

  1. Giữ bí mật bot token: ai có token là điều khiển được bot. Lưu trong biến môi trường hoặc kho bí mật, không đưa lên GitHub, không gửi qua chat. Lộ token thì thu hồi và cấp lại ngay trong BotFather.
  2. Xác thực webhook Telegram: khi gọi setWebhook, đặt tham số secret_token; Telegram sẽ gửi kèm header X-Telegram-Bot-Api-Secret-Token, máy chủ kiểm tra header này và từ chối yêu cầu không khớp.
  3. Xác thực webhook thanh toán: dùng chữ ký, khoá bí mật hoặc cơ chế xác thực mà dịch vụ thông báo giao dịch cung cấp. Không có xác thực thì ai cũng có thể gửi một yêu cầu giả “đã nhận tiền”.
  4. Xử lý trùng lặp (idempotency): webhook có thể bị gửi lại nhiều lần. Lưu mã giao dịch và bỏ qua giao dịch đã xử lý, để một lần chuyển tiền không bị tính thành hai đơn.
  5. Không tin phía khách hàng: ảnh chụp màn hình “đã chuyển khoản” không phải bằng chứng. Giá, số tiền, trạng thái đơn chỉ được quyết định ở máy chủ.
  6. Kiểm tra số tiền chính xác: chuyển thiếu thì không xác nhận tự động, đưa vào danh sách kiểm tra tay.
  7. Ghi log và sao lưu: mọi giao dịch, mọi thay đổi trạng thái đơn đều có nhật ký, cơ sở dữ liệu được sao lưu định kỳ.

7. Giới hạn cần biết trước

  • Phụ thuộc dịch vụ báo giao dịch: nếu dịch vụ đó chậm hoặc gián đoạn, đơn sẽ chưa được xác nhận. Bot nên có cơ chế để chủ shop xác nhận tay.
  • Khách ghi sai nội dung: dù đã có QR, vẫn có khách sửa nội dung hoặc chuyển từ app không hỗ trợ quét. Cần quy trình xử lý thủ công cho các trường hợp này.
  • Hoàn tiền vẫn làm tay: bot xác nhận tiền vào, nhưng việc trả lại tiền thường vẫn do bạn thực hiện.
  • Tuân thủ quy định: bot chỉ nên bán hàng hoá, dịch vụ hợp pháp, và bạn vẫn có trách nhiệm về thuế, hoá đơn như khi bán bình thường.
  • Telegram không phải kênh của mọi khách: nếu khách của bạn chủ yếu dùng Zalo hay Facebook, bot Telegram nên là một kênh bổ sung, hoặc kết hợp với website bán hàng.

8. Khi nào nên làm bot, khi nào nên làm website?

Bot Telegram hợp với shop bán hàng số, cộng đồng khách đã quen Telegram, hoặc khi bạn cần nhận đơn nhanh với chi phí vận hành thấp. Nếu cần SEO, cần khách mới tìm thấy bạn trên Google, bạn vẫn cần một website. Hai thứ kết hợp rất tốt: website giới thiệu và đưa khách vào bot, bot lo đặt đơn và thanh toán. Đọc thêm về cách chọn nền tảng làm website và tự động hoá công việc bằng tool để thấy bức tranh rộng hơn.

Minh họa quy trình tự xác nhận thanh toán từ ngân hàng về bot Telegram

Kết luận

Một bot Telegram bán hàng có VietQR giúp bạn bỏ hẳn khâu gửi số tài khoản, dò tin nhắn ngân hàng và xác nhận đơn bằng tay. Cốt lõi rất đơn giản: mỗi đơn một mã, mã đó nằm trong nội dung chuyển khoản, và máy chủ đối chiếu giao dịch thật từ ngân hàng. Làm đúng phần bảo mật (giấu token, xác thực webhook, chống trùng, không tin phía khách) thì bot chạy ổn định và an toàn.

Nếu bạn muốn có một bot như vậy cho shop của mình, xem phần code tool theo yêu cầu trên trang dịch vụ thiết kế website, hoặc nhắn mô tả quy trình bán hàng qua Telegram hay Zalo. Mình tư vấn miễn phí, báo giá theo yêu cầu, bàn giao mã nguồn.

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

Bot Telegram bán hàng có cần VPS không? Nên có. Bot cần chạy liên tục và nhận webhook qua HTTPS, nên một VPS nhỏ có tên miền là cách ổn định nhất. Shop rất nhỏ có thể bắt đầu với nền tảng serverless, nhưng VPS dễ kiểm soát hơn khi có cơ sở dữ liệu.

Mã VietQR có quét được bằng mọi ngân hàng không? Phần lớn app ngân hàng tại Việt Nam hỗ trợ quét VietQR. Dù vậy, bot nên hiển thị thêm số tài khoản và nội dung chuyển khoản dạng chữ cho khách nào không quét được.

Khách chuyển khoản sai nội dung thì sao? Giao dịch không khớp mã đơn sẽ được đưa vào danh sách cần kiểm tra và báo cho chủ shop để xác nhận tay. Đây là trường hợp bắt buộc phải tính trước khi làm bot.

Bot có tự hoàn tiền được không? Thường là không. Bot xác nhận tiền vào và giao hàng; hoàn tiền vẫn do chủ shop thực hiện trên app ngân hàng.

Có cần đưa mật khẩu ngân hàng cho bot không? Không bao giờ. Việc xác nhận thanh toán dựa trên thông báo giao dịch từ kênh chính thức được ngân hàng hỗ trợ, không cần và không nên chia sẻ mật khẩu internet banking.

Nguồn tham khảo

Chuyên mục:Tricks

Bình luận (0)

+ =
Zalo