Tạo form thanh toán

API tạo đơn hàng cho phép bạn tạo các giao dịch thanh toán một lần hoặc thanh toán định kỳ thông qua SePay. Bạn cần submit form HTML với các tham số và chữ ký đến endpoint checkout/init để chuyển hướng khách hàng đến trang thanh toán.


Đơn hàng là gì ?
  • Trong cổng thanh toán SePay, đơn hàng (order) là gói thông tin mô tả yêu cầu thanh toán với các thuộc tính chính như số tiền, mô tả giao dịch, mã hóa đơn, khách hàng và các URL callback để hệ thống xử lý.

  • API khởi tạo form thanh toán sử dụng gói thông tin này để tạo giao dịch một lần; bạn chỉ cần tạo form HTML hợp lệ và submit tới endpoint checkout/init để chuyển hướng khách hàng đến trang thanh toán.

Luồng xử lý tạo đơn hàng

  1. Khách hàng chọn thanh toán: Người dùng click nút thanh toán trên website
  2. Website tạo form HTML: Server tạo form HTML với các tham số cần thiết
  3. Thu thập thông tin đơn hàng: Lấy thông tin từ database hoặc session
  4. Chuẩn bị dữ liệu form: Sắp xếp các tham số theo đúng format
  5. Tạo signature: Sử dụng thuật toán HMAC-SHA256 để tạo chữ ký
  6. Thêm signature vào form: Đưa chữ ký vào form như một hidden field
  7. Submit form: Gửi POST request đến endpoint checkout/init
  8. Xác thực signature: SePay kiểm tra tính hợp lệ của chữ ký
  9. Chuyển hướng: Nếu hợp lệ, chuyển hướng đến trang thanh toán
  10. Thanh toán: Khách hàng thực hiện thanh toán trên trang SePay
  11. Callback: SePay gọi về URL IPN với kết quả

Endpoint

POST
https://pay-sandbox.sepay.vn/v1/checkout/init
Lưu ý

Đây là endpoint để submit form, không phải endpoint để gọi API.


Danh sách tham số

TênLoạiBắt buộcMô tả
merchant
stringBắt buộc
ID merchant của bạn (Ví dụ: MERCHANT_123)
currency
stringBắt buộc
Mã tiền tệ (chỉ hỗ trợ VND)
order_amount
stringBắt buộc
Số tiền đơn hàng (đơn vị nhỏ nhất)
operation
stringBắt buộc
Loại giao dịch (PURCHASE hoặc VERIFY)
order_description
stringBắt buộc
Mô tả đơn hàng
order_invoice_number
stringBắt buộc
Mã hóa đơn (bắt buộc cho PURCHASE, ví dụ: INV_20231201_001)
payment_method
stringKhông bắt buộc
Phương thức thanh toán (CARD, BANK_TRANSFER, NAPAS_BANK_TRANSFER)
customer_id
stringKhông bắt buộc
ID khách hàng
success_url
stringKhông bắt buộc
URL chuyển hướng khi thành công (Ví dụ: https://yoursite.com/success)
error_url
stringKhông bắt buộc
URL chuyển hướng khi lỗi (Ví dụ: https://yoursite.com/error)
cancel_url
stringKhông bắt buộc
URL chuyển hướng khi hủy (Ví dụ: https://yoursite.com/cancel)
Lưu ý

Các tham số success_url, error_url, và cancel_url chỉ hoạt động khi ứng dụng của bạn đang chạy trên domain hoặc IP có thể truy cập công khai (public). Nếu bạn đang phát triển trên môi trường localhost, hãy sử dụng các công cụ giúp public môi trường cục bộ như ngrok, localtunnel, hoặc tương tự.


Ví dụ tạo đơn hàng cơ bản

  • Tạo form HTML
Lưu ý quan trọng về thứ tự input trong HTML

Khi tự dựng form HTML, hãy giữ đúng thứ tự các input như form mẫu ngay bên dưới để quá trình ký và xử lý phía SePay khớp tuyệt đối; đổi vị trí trường có thể khiến signature sai.

Form HTML
<form method="POST" action="https://pay-sandbox.sepay.vn/v1/checkout/init">
    <input type="hidden" name="merchant" value="MERCHANT_123">
    <input type="hidden" name="currency" value="VND">
    <input type="hidden" name="order_amount" value="100000">
    <input type="hidden" name="operation" value="PURCHASE">
    <input type="hidden" name="order_description" value="Thanh toán đơn hàng #12345">
    <input type="hidden" name="order_invoice_number" value="INV_20231201_001">
    <input type="hidden" name="customer_id" value="CUST_001">
    <input type="hidden" name="success_url" value="https://yoursite.com/payment/success">
    <input type="hidden" name="error_url" value="https://yoursite.com/payment/error">
    <input type="hidden" name="cancel_url" value="https://yoursite.com/payment/cancel">
    <input type="hidden" name="signature" value="a1b2c3d4e5f6...">
</form>
  • Response:

Sau khi submit form, hệ thống sẽ chuyển hướng người dùng đến trang thanh toán của SePay:

https://pgapi-sandbox.sepay.vn?merchant=MERCHANT_123&currency=VND&order_amount=100000&operation=PURCHASE&order_description=Thanh%20toán%20đơn%20hàng%20%2312345&order_invoice_number=INV_20231201_001&customer_id=CUST_001&success_url=https%3A%2F%2Fyoursite.com%2Fpayment%2Fsuccess&error_url=https%3A%2F%2Fyoursite.com%2Fpayment%2Ferror&cancel_url=https%3A%2F%2Fyoursite.com%2Fpayment%2Fcancel&signature=a1b2c3d4e5f6...
Lưu ý

Trang thanh toán sẽ hiển thị các phương thức thanh toán khả dụng dựa trên cấu hình merchant của bạn.


Xác thực chữ ký

Lưu ý quan trọng về các trường khi tạo chữ ký

Khi tạo signature, hãy giữ nguyên thứ tự các field trong signedFields đúng như đoạn code mẫu (không sắp xếp lại) để chuỗi ký trùng với phía SePay.

  • Signature được tạo từ các tham số form theo quy tắc sau:
  1. Lọc các trường cần ký: Chỉ ký các trường được phép trong danh sách: merchant, operation, payment_method, order_amount, currency, order_invoice_number, order_description, customer_id, success_url, error_url, cancel_url
  2. Tạo chuỗi ký: field1=value1,field2=value2,field3=value3...
  3. Mã hóa: base64_encode(hash_hmac('sha256', $signedString, $secretKey, true))
  • Ví dụ tạo chữ ký:
Hàm ký dữ liệu PHP
function signFields(array $fields, string $secretKey): string {
    $signed = [];
    $signedFields = array_values(array_filter(array_keys($fields), fn ($field) => in_array($field, [
        'merchant','operation','payment_method','order_amount','currency',
        'order_invoice_number','order_description','customer_id',
        'success_url','error_url','cancel_url'
    ])));

    foreach ($signedFields as $field) {
        if (! isset($fields[$field])) continue;
        $signed[] = $field . '=' . ($fields[$field] ?? '');
    }

    return base64_encode(hash_hmac('sha256', implode(',', $signed), $secretKey, true));
}
  • Ví dụ chuỗi chữ ký: merchant=MERCHANT_123,operation=PURCHASE,order_amount=100000,currency=VND,order_invoice_number=INV_20231201_001,order_description=Thanh toán đơn hàng #12345,customer_id=CUST_001,success_url=https://yoursite.com/success,error_url=https://yoursite.com/error,cancel_url=https://yoursite.com/cancel

Lưu ý quan trọng
  1. Mã hóa đơn hàng: order_invoice_number phải là duy nhất và không được trùng lặp
  2. Số tiền: Chỉ hỗ trợ VND, số tiền phải > 0 cho giao dịch PURCHASE
  3. URL callback: Phải là URL công khai có thể truy cập từ internet
  4. Chữ ký: Luôn kiểm tra chữ ký để đảm bảo tính toàn vẹn dữ liệu
  5. Môi trường: Sử dụng sandbox cho testing, production cho giao dịch thực