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.
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
- Khách hàng chọn thanh toán: Người dùng click nút thanh toán trên website
- Website tạo form HTML: Server tạo form HTML với các tham số cần thiết
- Thu thập thông tin đơn hàng: Lấy thông tin từ database hoặc session
- Chuẩn bị dữ liệu form: Sắp xếp các tham số theo đúng format
- Tạo signature: Sử dụng thuật toán HMAC-SHA256 để tạo chữ ký
- Thêm signature vào form: Đưa chữ ký vào form như một hidden field
- Submit form: Gửi POST request đến endpoint
checkout/init - Xác thực signature: SePay kiểm tra tính hợp lệ của chữ ký
- Chuyển hướng: Nếu hợp lệ, chuyển hướng đến trang thanh toán
- Thanh toán: Khách hàng thực hiện thanh toán trên trang SePay
- Callback: SePay gọi về URL IPN với kết quả
Endpoint
https://pay-sandbox.sepay.vn/v1/checkout/initĐây là endpoint để submit form, không phải endpoint để gọi API.
Danh sách tham số
| Tên | Loại | Bắt buộc | Mô tả |
|---|---|---|---|
merchant | string | Bắt buộc | ID merchant của bạn (Ví dụ: MERCHANT_123) |
currency | string | Bắt buộc | Mã tiền tệ (chỉ hỗ trợ VND) |
order_amount | string | Bắt buộc | Số tiền đơn hàng (đơn vị nhỏ nhất) |
operation | string | Bắt buộc | Loại giao dịch (PURCHASE hoặc VERIFY) |
order_description | string | Bắt buộc | Mô tả đơn hàng |
order_invoice_number | string | Bắt buộc | Mã hóa đơn (bắt buộc cho PURCHASE, ví dụ: INV_20231201_001) |
payment_method | string | Không bắt buộc | Phương thức thanh toán (CARD, BANK_TRANSFER, NAPAS_BANK_TRANSFER) |
customer_id | string | Không bắt buộc | ID khách hàng |
success_url | string | Không bắt buộc | URL chuyển hướng khi thành công (Ví dụ: https://yoursite.com/success) |
error_url | string | Không bắt buộc | URL chuyển hướng khi lỗi (Ví dụ: https://yoursite.com/error) |
cancel_url | string | Không bắt buộc | URL chuyển hướng khi hủy (Ví dụ: https://yoursite.com/cancel) |
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
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 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¤cy=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...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ý
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:
- 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 - Tạo chuỗi ký:
field1=value1,field2=value2,field3=value3... - Mã hóa:
base64_encode(hash_hmac('sha256', $signedString, $secretKey, true))
- Ví dụ tạo chữ ký:
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
- Mã hóa đơn hàng:
order_invoice_numberphải là duy nhất và không được trùng lặp - Số tiền: Chỉ hỗ trợ VND, số tiền phải > 0 cho giao dịch
PURCHASE - URL callback: Phải là URL công khai có thể truy cập từ internet
- Chữ ký: Luôn kiểm tra chữ ký để đảm bảo tính toàn vẹn dữ liệu
- Môi trường: Sử dụng sandbox cho testing, production cho giao dịch thực