Chuyển tới nội dung chính

POST - Tạo hóa đơn

Tạo một hóa đơn thanh toán crypto. Merchant gửi số tiền (USD), thông tin đơn hàng và callback URL; hệ thống trả về trans_idurl_payment để chuyển khách đến trang thanh toán.

Endpoint

POST https://api.payerscan.com/payment/crypto

Headers

HeaderBắt buộcMô tả
Content-Typeapplication/json
x-api-keyAPI Key của Store

Request Body (JSON)

TrườngKiểuBắt buộcGiới hạnMô tả
merchant_idstringKhông rỗngMã merchant của Store (phải khớp với API Key).
amountnumber | string> 0≤ 1,000,000Số tiền thanh toán (USD). Ví dụ: 100, "100".
callback_urlstringKhuyến nghịTối đa 500 ký tự, URL hợp lệURL nhận webhook khi trạng thái completed hoặc expired.
completed_urlstringKhôngTối đa 500 ký tự, URL hợp lệURL chuyển hướng sau khi khách thanh toán thành công.
expired_urlstringKhôngTối đa 500 ký tự, URL hợp lệURL chuyển hướng khi hóa đơn hết hạn.
namestringKhôngTối đa 255 ký tựTên/title hóa đơn.
descriptionstringKhôngTối đa 1000 ký tựMô tả hóa đơn.
request_idstringKhôngTối đa 255 ký tựID đơn hàng bên Merchant để đối chiếu (trả lại trong response và webhook). Cũng dùng cho idempotency — xem ghi chú bên dưới.

Ví dụ request

{
"merchant_id": "MID-XXXXXXXXXX",
"amount": 100,
"name": "Top-up balance",
"description": "Top-up the balance for username: [USERNAME]",
"callback_url": "https://your-server.com/webhook/payment",
"completed_url": "https://your-website.com/thank-you",
"expired_url": "https://your-website.com/",
"request_id": "ORDER_123456"
}

Response

Thành công (HTTP 200)

{
"status": "success",
"data": {
"request_id": "ORDER_123456",
"trans_id": "TID-ABC123DEF4567890",
"status": "waiting",
"amount": "100",
"url_payment": "https://app.payerscan.com/bill/TID-ABC123DEF4567890",
"expires_in_minutes": 15
}
}
TrườngMô tả
request_idGiá trị bạn đã gửi trong request.
trans_idMã hóa đơn duy nhất, dùng để tra cứu và đối chiếu webhook.
statusLuôn là "waiting" khi mới tạo.
amountSố tiền USD (string).
url_paymentURL trang thanh toán — redirect khách đến đây.
expires_in_minutesThời gian hết hạn hóa đơn (phút).

Lỗi (4xx / 5xx)

Tất cả lỗi có dạng:

{
"status": "error",
"message": "Mô tả lỗi",
"error_code": "ERROR_CODE",
"request_id": "ORDER_123456",
"details": { }
}
HTTPerror_codeMô tả
400VALIDATION_ERRORBody không hợp lệ (thiếu trường bắt buộc, sai kiểu, vượt giới hạn). details.errors có chi tiết.
400INVALID_MERCHANT_IDmerchant_id không khớp với Store của API Key.
400NO_PAYMENT_METHODStore chưa cấu hình phương thức thanh toán. Thêm ít nhất một ví hoặc cấu hình sàn giao dịch trước khi tạo hóa đơn.
401MISSING_API_KEYKhông có header x-api-key.
401INVALID_API_KEYAPI key không hợp lệ hoặc không tồn tại.
403ACCOUNT_INACTIVETài khoản liên kết với API key này đã bị vô hiệu hóa.
403STORE_INACTIVEStore liên kết với API key này đã bị vô hiệu hóa.
402INSUFFICIENT_BALANCESố dư Store không đủ trả phí. detailscurrent_balance, required_fee, shortage, fee_rate_percent, discount_percent, invoice_amount.
429RATE_LIMIT_EXCEEDEDVượt giới hạn request (burst hoặc sustained). Có limit_type, retry_after_seconds.
500INTERNAL_ERRORLỗi server.

Chi tiết mã lỗi: Mã lỗi API.

Rate Limit

  • Burst: 5 request/giây (theo API Key hoặc IP).
  • Sustained: 60 request/phút (theo API Key hoặc IP).

Vượt limit → HTTP 429, body có error_code: "RATE_LIMIT_EXCEEDED", retry_after_seconds.

Lưu ý

  • Phương thức thanh toán: Store phải cấu hình ít nhất một địa chỉ ví hoặc sàn giao dịch (Binance Pay, OKX, Bybit, MEXC, Gate.io, Bitget, v.v.) trước khi tạo hóa đơn. Nếu chưa có, API sẽ trả lỗi NO_PAYMENT_METHOD.
  • Idempotency: Nếu bạn gửi request_id đã tồn tại cho cùng store, API sẽ trả về hóa đơn cũ thay vì tạo mới. Response sẽ có idempotent: true để cho biết điều này. Điều này ngăn tạo hóa đơn trùng lặp khi retry.
  • Phí: Phí được tính trên amount (USD) và trừ vào balance của Store. Cần đảm bảo balance đủ trước khi tạo hóa đơn. Trong thời gian dùng thử miễn phí, phí được miễn.
  • Callback: Nên luôn gửi callback_url để nhận webhook completed/expired; nếu không có, bạn chỉ có thể tra cứu qua GET https://api.payerscan.com/invoice/:trans_id.
  • request_id: Nên gửi để dễ ghép webhook với đơn hàng nội bộ và hỗ trợ idempotency.