API VA theo Đơn hàng cho BIDV doanh nghiệp

API VA (Virtual Account) theo đơn hàng là giải pháp tự động hóa xác nhận thanh toán cho ngân hàng BIDV tài khoản doanh nghiệp. Thay vì sử dụng một VA cố định, mỗi đơn hàng sẽ được cấp một VA riêng với số tiền khớp chính xác.


Bạn có thể làm gì với API này?

SePay cho phép bạn thực hiện những truy vấn sau với VA theo đơn hàng:

GET
https://my.sepay.vn/userapi/bidv/{bank_account_id}/orders
POST
https://my.sepay.vn/userapi/bidv/{bank_account_id}/orders
GET
https://my.sepay.vn/userapi/bidv/{bank_account_id}/orders/{order_id}
POST
https://my.sepay.vn/userapi/bidv/{bank_account_id}/orders/{order_id}/va
DELETE
https://my.sepay.vn/userapi/bidv/{bank_account_id}/orders/{order_id}
DELETE
https://my.sepay.vn/userapi/bidv/{bank_account_id}/orders/{order_id}/va/{va_number}

Bắt đầu

Để sử dụng API VA theo đơn hàng, bạn cần:

  • Tạo một API Token để xác thực các yêu cầu API của bạn.
  • Lấy bank_account_id của tài khoản BIDV doanh nghiệp từ API Tài khoản ngân hàng hoặc lấy trực tiếp từ giao diện quản lý tài khoản ngân hàng trên SePay.
Payment Flow Diagram
Nhấn để phóng to
Payment method screen

Thanh toán từng phần (Partially Payment)

SePay hỗ trợ thanh toán từng phần cho đơn hàng thông qua cơ chế Virtual Account (VA). Khi sử dụng chức năng này:

  • Bạn có thể tạo đơn hàng với số tiền đầy đủ, nhưng cho phép khách hàng thanh toán theo nhiều đợt bằng cách:
    • Thiết lập amount nhỏ hơn số tiền đơn hàng khi tạo VA mới
    • Đặt amount là null để VA có thể nhận nhiều lần thanh toán với bất kỳ số tiền nào cho đến khi đạt tổng số tiền đơn hàng
  • Khi khách hàng thanh toán một phần, trạng thái đơn hàng sẽ chuyển thành Partially
  • Khi tổng số tiền thanh toán đạt đủ số tiền đơn hàng, trạng thái đơn hàng sẽ tự động chuyển thành Paid và VA sẽ không còn nhận thêm thanh toán

Tính năng này đặc biệt hữu ích cho các đơn hàng có giá trị lớn hoặc khi khách hàng cần thanh toán theo đợt.


Lấy danh sách đơn hàng

GET
https://my.sepay.vn/userapi/bidv/{bank_account_id}/orders

Code mẫu

>
>
>
curl --request GET \
--url https://my.sepay.vn/userapi/bidv/123456/orders \
--header 'Authorization: Bearer REPLACE_BEARER_TOKEN'

Response

Response 200 - Danh sách đơn hàng
{
  "status": "success",
  "data": {
    "orders": [
      {
        "id": "b64247d3-c343-11ef-9c27-52c7e9b4f41b",
        "order_code": "ORD123456789",
        "amount": 2000,
        "paid_amount": 2000,
        "status": "Paid",
        "created_at": "2024-12-26 11:41:46",
        "bank_name": "BIDV",
        "account_number": "1234567890",
        "account_holder_name": "NGO QUOC DAT",
        "va": [
          {
            "va_number": "963NQDORDRSIKYXYPTZ",
            "va_holder_name": "NGO QUOC DAT",
            "amount": 2000,
            "status": "Paid",
            "expired_at": "2024-12-26 11:51:45",
            "paid_at": "2024-12-26 11:42:12"
          }
        ]
      }
    ],
    "pagination": {
      "total": 1,
      "per_page": 20,
      "current_page": 1,
      "last_page": 1
    }
  }
}
statusstring

Trạng thái (success/error)

messagestring

Thông báo

dataobject

Tạo đơn hàng mới

POST
https://my.sepay.vn/userapi/bidv/{bank_account_id}/orders

Tham số yêu cầu

statusstring

Trạng thái (success/error)

messagestring

Thông báo

dataobject
Lưu ý

Tham số va_holder_name chỉ hỗ trợ cho các tài khoản BIDV doanh nghiệp được SePay bật tính năng custom tên hiển thị. Vui lòng liên hệ hỗ trợ bên SePay để được bật tính năng này.

Code mẫu

>
>
>
>
>
curl --request POST \
--url https://my.sepay.vn/userapi/bidv/123456/orders \
--header 'Authorization: Bearer REPLACE_BEARER_TOKEN' \
--header 'content-type: application/json' \
--data '{"amount":1000000,"order_code":"ORDER123","duration":600,"va_holder_name":"NGUYEN VAN A","with_qrcode":true}'

Response

Response 200 - Tạo đơn hàng thành công
{
  "status": "success",
  "message": "Order created successfully",
  "data": {
    "order_id": "f23cc0fe-c343-11ef-9c27-52c7e9b4f41b",
    "order_code": "ORD123456789",
    "va_number": "963NQDORDZVTBPJ3Z7H",
    "va_holder_name": "NGO QUOC DAT",
    "amount": 2000,
    "status": "Pending",
    "bank_name": "BIDV",
    "account_holder_name": "NGO QUOC DAT",
    "account_number": "1234567890",
    "expired_at": "2024-12-26 11:53:26",
    "qr_code": "data:image/png;base64,...==",
    "qr_code_url": "https://qr.sepay.vn/img?acc=..."
  }
}
statusstring

Trạng thái (success/error)

messagestring

Thông báo

dataobject

Chi tiết đơn hàng

GET
https://my.sepay.vn/userapi/bidv/{bank_account_id}/orders/{order_id}

Lấy thông tin chi tiết của một đơn hàng theo ID.

Tham số đường dẫn

statusstring

Trạng thái (success/error)

messagestring

Thông báo

dataobject

Code mẫu

>
>
>
curl --request GET \
--url https://my.sepay.vn/userapi/bidv/123456/orders/b64247d3-c343-11ef-9c27-52c7e9b4f41b \
--header 'Authorization: Bearer REPLACE_BEARER_TOKEN'

Response

Response 200 - Chi tiết đơn hàng
{
  "status": "success",
  "data": {
    "id": "b64247d3-c343-11ef-9c27-52c7e9b4f41b",
    "order_code": "ORD123456789",
    "amount": 2000,
    "paid_amount": 2000,
    "status": "Paid",
    "created_at": "2024-12-26 11:41:46",
    "bank_name": "BIDV",
    "account_number": "1234567890",
    "account_holder_name": "NGO QUOC DAT",
    "va": [
      {
        "va_number": "963NQDORDRSIKYXYPTZ",
        "va_holder_name": "NGO QUOC DAT",
        "amount": 2000,
        "status": "Paid",
        "expired_at": "2024-12-26 11:51:45",
        "paid_at": "2024-12-26 11:42:12"
      }
    ]
  }
}
statusstring

Trạng thái (success/error)

messagestring

Thông báo

dataobject

Tạo thêm VA

POST
https://my.sepay.vn/userapi/bidv/{bank_account_id}/orders/{order_id}/va

Tạo thêm một VA mới cho đơn hàng đã tồn tại.

Tham số đường dẫn

statusstring

Trạng thái (success/error)

messagestring

Thông báo

dataobject

Tham số yêu cầu

statusstring

Trạng thái (success/error)

messagestring

Thông báo

dataobject

Code mẫu

>
>
>
>
>
curl --request POST \
--url https://my.sepay.vn/userapi/bidv/123456/orders/b64247d3-c343-11ef-9c27-52c7e9b4f41b/va \
--header 'Authorization: Bearer REPLACE_BEARER_TOKEN' \
--header 'content-type: application/json' \
--data '{"amount":500000,"va_holder_name":"NGUYEN VAN A","duration":600}'

Response

Response 200 - Tạo VA thành công
{
  "status": "success",
  "message": "VA created successfully",
  "data": {
    "va_number": "963NQDORD8DTYFPW5MV",
    "va_holder_name": "NGUYEN VAN A",
    "amount": 500000,
    "status": "Unpaid",
    "expired_at": "2024-12-26 11:55:55"
  }
}
statusstring

Trạng thái (success/error)

messagestring

Thông báo

dataobject

Hủy đơn hàng

DELETE
https://my.sepay.vn/userapi/bidv/{bank_account_id}/orders/{order_id}

Tham số đường dẫn

statusstring

Trạng thái (success/error)

messagestring

Thông báo

dataobject

Code mẫu

>
>
>
curl --request DELETE \
--url https://my.sepay.vn/userapi/bidv/123456/orders/b64247d3-c343-11ef-9c27-52c7e9b4f41b \
--header 'Authorization: Bearer REPLACE_BEARER_TOKEN'

Response

Response 200 - Hủy đơn hàng thành công
{
  "status": "success",
  "message": "Order cancelled successfully",
  "data": {
    "status": "Cancelled"
  }
}

Hủy VA

DELETE
https://my.sepay.vn/userapi/bidv/{bank_account_id}/orders/{order_id}/va/{va_number}

Tham số đường dẫn

statusstring

Trạng thái (success/error)

messagestring

Thông báo

dataobject

Code mẫu

>
>
>
curl --request DELETE \
--url https://my.sepay.vn/userapi/bidv/123456/orders/b64247d3-c343-11ef-9c27-52c7e9b4f41b/va/963NQDORD8DTYFPW5MV \
--header 'Authorization: Bearer REPLACE_BEARER_TOKEN'

Response

Response 200 - Hủy VA thành công
{
  "status": "success",
  "message": "VA cancelled successfully",
  "data": {
    "status": "Cancelled"
  }
}

Xử lý Webhook thông báo thanh toán

Khi khách hàng thanh toán thành công vào VA của đơn hàng, SePay sẽ gửi webhook thông báo đến website của bạn. Dữ liệu webhook sẽ bao gồm trường code chứa mã đơn hàng của VA đó.

Ví dụ dữ liệu webhook khi VA được thanh toán:

{
  "id": 92704,
  "gateway": "BIDV",
  "transactionDate": "2024-01-07 14:02:37",
  "code": "ORD123456789",
  "transferAmount": 2277000,
  "transferType": "in"
}

Website của bạn cần kiểm tra trường code để xác định đơn hàng được thanh toán và cập nhật trạng thái phù hợp.

Chi tiết về cách thiết lập và xử lý webhook, bạn có thể tham khảo Hướng dẫn tích hợp WebHooks.


Định nghĩa trạng thái

Trạng thái đơn hàng

Trạng tháiMô tả
PendingĐơn hàng chưa thanh toán
PaidĐơn hàng đã thanh toán
PartiallyĐơn hàng đã thanh toán một phần
CancelledĐơn hàng đã bị hủy

Trạng thái VA

Trạng tháiMô tả
UnpaidVA chưa thanh toán
PaidVA đã thanh toán
CancelledVA đã bị hủy

Giới hạn request

SePay giới hạn số lượng request API theo đơn hàng như sau:

  • 2 request/giây cho mỗi IP
  • Vượt quá giới hạn sẽ nhận response mã 429
  • Header X-SePay-UserApi-Retry-After chỉ ra thời gian cần đợi trước khi thử lại

Mã lỗi

400Bad Request

Tham số không hợp lệ hoặc thiếu.

401Unauthorized

Token không hợp lệ.

404Not Found

Không tìm thấy tài nguyên.

429Too Many Requests

Vượt quá giới hạn request.


Tạo đơn hàng không giới hạn số tiền và thời gian

Bạn có thể tạo đơn hàng không giới hạn số tiền và thời gian thanh toán bằng cách:

  • Đặt amountnull để đơn hàng và VA không hạn chế số lần thanh toán
  • Đặt durationnull để đơn hàng không hạn chế thời gian thanh toán

Ví dụ:

JScURL
1
2
3
4
5
6
7
curl -X POST "https://my.sepay.vn/userapi/bidv/123456/orders" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"amount": null,
"duration": null
}'

Khi đơn hàng được tạo, bạn có thể tạo VA mới cho đơn hàng bằng cách gọi API Tạo thêm VA.