Skip to content

Tài liệu tham khảo API MQ-Pay

Tài liệu tham khảo API đầy đủ cho tích hợp thanh toán MQ-Pay.

URL Cơ sở

Production: https://api.your-domain.com/api/mq-pay
Development: http://localhost:3000/api/mq-pay

Điểm cuối Thanh toán

Tạo Thanh toán

http
POST /payments/checkout
Content-Type: application/json

{
  "source": {
    "type": "Order",
    "id": "order-uuid-123",
    "uid": "ORD-2024-001"
  },
  "payment": {
    "provider": "VNPAY_QR_MMS",
    "method": "100_QR_CODE",
    "total": 100000,
    "currency": "VND"
  },
  "expiration": {
    "mode": "duration",
    "milliseconds": 300000
  }
}

Phản hồi (200 OK)

json
{
  "transaction": {
    "id": "txn-uuid-001",
    "number": "TXN001",
    "status": "100_NEW",
    "total": "100000.0000",
    "paid": "0.0000"
  },
  "attempt": {
    "id": "att-uuid-001",
    "code": "ATT001",
    "status": "204_SENT",
    "provider": "VNPAY_QR_MMS",
    "method": "100_QR_CODE"
  },
  "payment": {
    "qrCode": "00020101021238...",
    "qrUrl": "https://...",
    "expiresAt": "2024-01-15T10:35:00Z"
  }
}

Xác nhận Thanh toán Hệ thống

http
POST /payments/system/ipn
Content-Type: application/json

{
  "attempt": { "id": "att-uuid-001" },
  "tendered": 100000,
  "note": "Thanh toán tiền mặt"
}

Phản hồi (200 OK)

json
{
  "transaction": {
    "id": "txn-uuid-001",
    "status": "304_SETTLED",
    "paid": "100000.0000"
  },
  "attempt": {
    "id": "att-uuid-001",
    "status": "302_SUCCESS",
    "tendered": "100000.0000"
  },
  "change": "0.0000"
}

Hủy Lần thử Thanh toán

http
POST /payments/cancel
Content-Type: application/json

{
  "attemptId": "att-uuid-001",
  "reason": "Khách hàng đổi phương thức thanh toán"
}

Phản hồi (200 OK)

json
{
  "transaction": {
    "id": "txn-uuid-001",
    "status": "100_NEW"
  },
  "cancelledAttempts": [
    {
      "id": "cancel-att-uuid",
      "type": "200_CANCEL_PAYMENT",
      "status": "302_SUCCESS",
      "parentId": "att-uuid-001"
    }
  ]
}

NOTE

Bạn cũng có thể hủy tất cả attempts cho giao dịch bằng cách gửi { "transactionId": "txn-uuid-001" } thay vì attemptId.

Xác minh Lần thử Thanh toán

http
POST /payments/verify
Content-Type: application/json

{
  "attemptId": "att-uuid-001"
}

Phản hồi (200 OK)

json
{
  "attempt": {
    "id": "att-uuid-001",
    "status": "302_SUCCESS",
    "provider": "VNPAY_QR_MMS"
  },
  "providerStatus": {
    "responseCode": "00",
    "message": "Success"
  }
}

Hoàn tiền Thanh toán

http
POST /payments/refund
Content-Type: application/json

{
  "attemptId": "att-uuid-001",
  "amount": 50000,
  "reason": "Hoàn tiền một phần cho mặt hàng trả lại"
}

Phản hồi (200 OK)

json
{
  "refundAttempt": {
    "id": "refund-att-uuid",
    "type": "300_REFUND_PAYMENT",
    "status": "302_SUCCESS",
    "amount": "50000.0000",
    "parentId": "att-uuid-001"
  }
}

IMPORTANT

Số tiền hoàn không thể vượt quá sốTiềnGốc - đãHoànTiền. Attempt gốc phải ở trạng thái 302_SUCCESS.

Điểm cuối Giao dịch (CRUD)

Tự động tạo qua ControllerFactory tại đường dẫn cơ sở /transactions.

Phương thứcĐường dẫnMô tả
GET/transactionsLiệt kê giao dịch (hỗ trợ filter, phân trang, sắp xếp)
GET/transactions/:idLấy giao dịch theo ID
GET/transactions/countĐếm giao dịch khớp với filter
POST/transactionsTạo giao dịch
PATCH/transactions/:idCập nhật giao dịch
DELETE/transactions/:idXóa mềm giao dịch

Ví dụ Filter:

http
GET /transactions?filter={"where":{"sourceType":"Order","sourceId":"order-uuid"}}

Điểm cuối Lần thử Thanh toán (CRUD)

Tự động tạo qua ControllerFactory tại đường dẫn cơ sở /payment-attempts.

Phương thứcĐường dẫnMô tả
GET/payment-attemptsLiệt kê lần thử thanh toán
GET/payment-attempts/:idLấy lần thử theo ID
GET/payment-attempts/countĐếm lần thử khớp với filter
POST/payment-attemptsTạo lần thử
PATCH/payment-attempts/:idCập nhật lần thử
DELETE/payment-attempts/:idXóa mềm lần thử

Điểm cuối Kết quả Thanh toán (CRUD)

Tự động tạo qua ControllerFactory tại đường dẫn cơ sở /payment-results.

Phương thứcĐường dẫnMô tả
GET/payment-resultsLiệt kê kết quả thanh toán
GET/payment-results/:idLấy kết quả theo ID
GET/payment-results/countĐếm kết quả khớp với filter
POST/payment-resultsTạo kết quả
PATCH/payment-results/:idCập nhật kết quả
DELETE/payment-results/:idXóa mềm kết quả

Điểm cuối Mặt hàng Giao dịch (CRUD)

Tự động tạo qua ControllerFactory tại đường dẫn cơ sở /transaction-items.

Phương thứcĐường dẫnMô tả
GET/transaction-itemsLiệt kê mặt hàng giao dịch
GET/transaction-items/:idLấy mặt hàng theo ID
GET/transaction-items/countĐếm mặt hàng khớp với filter
POST/transaction-itemsTạo mặt hàng
PATCH/transaction-items/:idCập nhật mặt hàng
DELETE/transaction-items/:idXóa mềm mặt hàng

Mã Trạng thái

Trạng thái Giao dịch

Trạng tháiMô tả
NEW100_NEWĐã tạo, chưa thanh toán
PARTIAL300_PARTIALThanh toán một phần
SETTLED304_SETTLEDĐã thanh toán đầy đủ
CANCELLED505_CANCELLEDTất cả attempts bị hủy
BLOCKED403_BLOCKEDBị chặn tạm thời
CLOSED404_CLOSEDĐã đóng vĩnh viễn

Trạng thái Lần thử

Trạng tháiMô tả
NEW100_NEWĐã tạo, chưa gửi
SENT204_SENTĐã gửi đến nhà cung cấp
SUCCESS302_SUCCESSThanh toán đã xác nhận
FAIL500_FAILLỗi nhà cung cấp
EXPIRED501_EXPIREDHết thời gian chờ

Phản hồi Lỗi

json
{
  "error": {
    "code": "INVALID_TRANSACTION_STATUS",
    "message": "Không thể thêm thanh toán vào giao dịch đã hoàn tất"
  }
}

Các Mã lỗi Thường gặp

Mô tả
INVALID_TRANSACTION_STATUSTrạng thái giao dịch sai
PAYMENT_ATTEMPT_NOT_FOUNDKhông tìm thấy ID lần thử
PROVIDER_NOT_CONFIGUREDNhà cung cấp chưa được kích hoạt
SIGNATURE_MISMATCHXác minh IPN thất bại
REFUND_EXCEEDS_REMAININGSố tiền hoàn > phần còn lại có thể hoàn
ATTEMPT_NOT_SUCCESSKhông thể hoàn tiền lần thử chưa thành công

Liên quan

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.