Vũ Văn HảiFull-stack · AI-native
Hướng dẫnBlog
Trao đổi dự án

© 2026 Vũ Văn Hải · Viết từ kinh nghiệm triển khai thật.

Trang chủHướng dẫnBlogRSS
  1. Hướng dẫn
  2. /Tích hợp
  3. /Cấu hình webhook và API key SePay để nhận thanh toán

Cấu hình webhook và API key SePay để nhận thanh toán

Lấy đủ 4 biến môi trường từ SePay.vn để tích hợp thanh toán chuyển khoản bằng mã QR tĩnh (VietQR) và webhook: thêm tài khoản ngân hàng, tạo webhook có chứng thực API Key và xử lý các lỗi thường gặp.

Cập nhật: 21 thg 9, 20264 phút đọc
Thanh toánWebhookSePay
Mục lục
  • Tóm tắt nhanh
  • 1. Thêm tài khoản ngân hàng
  • 2. Cấu hình webhook và lấy API key
  • Vì sao không cần SEPAY_API_TOKEN?
  • Xử lý sự cố

Bài này hướng dẫn từng bước lấy các thông tin cấu hình từ SePay để tích hợp thanh toán chuyển khoản vào backend: sinh mã QR tĩnh (VietQR) và nhận webhook mỗi khi có tiền vào tài khoản. Kết quả cuối cùng là 4 biến môi trường trong file .env.

Trong toàn bài, thay <bank-account-number>, <account-holder>, <api-key> bằng giá trị thật của bạn; https://api.example.com/webhooks/sepay là URL webhook ví dụ của backend, <ngrok-url> là địa chỉ tunnel khi chạy local.

Tóm tắt nhanh

Ứng dụng cần 4 biến môi trường sau để hoạt động:

SEPAY_BANK_NAME="MBBank"                        # Hoặc tên viết tắt ngân hàng khác (VD: Vietcombank, ACB)
SEPAY_ACCOUNT_NUMBER="<bank-account-number>"    # Số tài khoản
SEPAY_ACCOUNT_NAME="<account-holder>"           # Tên tài khoản
SEPAY_WEBHOOK_API_KEY="<api-key>"               # Tạo trong phần Tích hợp Webhook => Kiểu chứng thực: API Key

1. Thêm tài khoản ngân hàng

Thông tin này dùng để sinh mã QR hoặc đối soát giao dịch ngân hàng.

  1. Đăng nhập SePay.
  2. Vào menu Tài khoản ngân hàng, bấm Thêm tài khoản ngân hàng.
  3. Điền ngân hàng và số tài khoản. Hệ thống thường tự động kiểm tra tên tài khoản.
  4. Lấy thông tin điền vào .env:
    • SEPAY_BANK_NAME: dùng tên viết tắt hoặc mã BIN của ngân hàng (VD: MBBank, Vietcombank, Techcombank).
    • SEPAY_ACCOUNT_NUMBER: số tài khoản của bạn.
    • SEPAY_ACCOUNT_NAME: tên hiển thị trên tài khoản.

2. Cấu hình webhook và lấy API key

Webhook giúp SePay "bắn" thông báo về server của bạn mỗi khi có người chuyển khoản thành công. Chuỗi chứng thực tạo ở bước này chính là biến SEPAY_WEBHOOK_API_KEY.

  1. Vào menu Tích hợp Webhook, bấm Thêm Webhook.
  2. Cấu hình các mục như sau:
    • Tên: đặt tùy ý (VD: MyApp Webhook).
    • (1) Chọn sự kiện: ở mục "Bắn WebHooks khi", chọn Có tiền vào.
    • (2) Chọn điều kiện:
      • Chọn tài khoản ngân hàng đã thêm ở bước 1.
      • Ở mục "Bỏ qua nếu nội dung giao dịch không có Code?", chọn Không (server sẽ tự bóc tách).
    • (3) Thuộc tính WebHooks:
      • Gọi đến URL: đường dẫn webhook của backend (VD: https://<ngrok-url>/webhooks/sepay khi chạy local, hoặc https://api.example.com/webhooks/sepay trên production).
      • Là WebHooks xác thực thanh toán?: chọn Không.
      • Gọi lại WebHooks khi?: tích chọn HTTP Status Code không nằm trong phạm vi từ 200 đến 299 (để SePay retry nếu server bị lỗi tạm thời).
    • (4) Cấu hình chứng thực WebHooks (BẮT BUỘC):
      • Kiểu chứng thực: chọn API Key (hoặc Bearer Token).
      • Giá trị: một chuỗi mật khẩu sinh ngẫu nhiên, hoặc bạn tự chọn. Bạn sẽ copy chuỗi này vào .env.
      • Request Content type: application/json.
    • Trạng thái: Kích hoạt.
  3. Bấm Thêm / Lưu.
  4. Copy chuỗi giá trị ở mục (4), dán vào biến SEPAY_WEBHOOK_API_KEY trong file .env.

Luôn bật chứng thực cho webhook và để backend so khớp key này trên mỗi request. Nếu không, bất kỳ ai biết URL đều có thể gửi thông báo thanh toán giả tới server của bạn.

Vì sao không cần SEPAY_API_TOKEN?

Với mô hình tạo QR tĩnh (VietQR) và nhận kết quả thanh toán từ SePay qua webhook, bạn không cần đến API key để gọi ngược lên hệ thống SePay (SEPAY_API_TOKEN). Mã QR tự sinh được từ các thông tin gốc (số tài khoản, ngân hàng, tên người nhận, số tiền), còn SEPAY_WEBHOOK_API_KEY dùng để kiểm tra auth khi SePay gửi webhook đến server của bạn - như vậy là đủ bảo mật.

Xử lý sự cố

Triệu chứngCách xử lý
Webhook không hoạt động (không ghi nhận thanh toán)Vào mục Lịch sử Webhook trên my.sepay.vn, kiểm tra SePay có đang gửi đi không và server của bạn đang trả về HTTP status code nào
Test ở môi trường local không nhận được webhookCần một công cụ như Ngrok / LocalTunnel để chuyển public URL về localhost
Hiển thị sai ngân hàng hoặc mã QR bị lỗiKiểm tra SEPAY_BANK_NAME đã dùng đúng tên viết tắt chính thức trên SePay chưa. Nếu gõ nhầm (VD: MB Bank thay vì MBBank), hệ thống VietQR sẽ sinh sai hoặc không sinh được QR
Bài trướcGửi email bằng Brevo API khi VPS chặn cổng SMTPBài tiếp theoCấu hình Google OAuth cho domain mới (Next.js và .NET API)

Bài liên quan

  • Cấu hình Vertex AI để gọi Gemini API (keyless và service account)

    Thiết lập Google Cloud Vertex AI (nay là Gemini Enterprise Agent Platform) để gọi model Gemini: enable API, tạo service account, xác thực keyless bằng ADC hoặc JSON key, cài SDK google-genai và xử lý các lỗi org policy, 429, 404.

    Tích hợp

    Tích hợp
  • Kiểm tra và xóa cache ảnh OG trên các mạng xã hội

    Buộc Facebook, Messenger, Twitter/X, Telegram, Zalo và LinkedIn quét lại Open Graph tags sau khi deploy để preview link hiển thị đúng ảnh OG mới, kèm checklist thẻ meta chuẩn và cách xử lý khi ảnh không hiện.

    Tích hợp

    Tích hợp

Viết bởi Vũ Văn Hải

Tôi là Hải, full-stack developer ở TP. Hồ Chí Minh. Các bài ở đây đúc kết từ những hệ thống tôi tự dựng và vận hành. Cần dựng hoặc gỡ rối một hệ thống tương tự? Cứ nhắn tôi.

Trao đổi dự ánXem thêm hướng dẫn

Thấy sai sót hoặc lệnh không còn chạy? Báo cho tôi

Mục lục

  • Tóm tắt nhanh
  • 1. Thêm tài khoản ngân hàng
  • 2. Cấu hình webhook và lấy API key
  • Vì sao không cần SEPAY_API_TOKEN?
  • Xử lý sự cố