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

Get Transaction Details

Lấy thông tin chi tiết về một giao dịch cụ thể. API này cho phép truy vấn giao dịch bằng transactionId hoặc bằng cặp orderId + referenceId.

Use Case

Nếu App không nhận được notify, Mini App/Payment SDK có thể tự gọi GET /api/payments/v1/transactions để lấy kết quả thanh toán.

Endpoint

GET /api/payments/v1/transactions

Authentication

API yêu cầu xác thực bằng Payment API Key. API này dành cho OrderBackend và các service nội bộ.

Headers

HeaderBắt buộcKiểu dữ liệuMô tả
X-Payment-API-KeyStringPayment API Key để xác thực service

Query Parameters

Phải cung cấp ít nhất một trong các tổ hợp sau:

  • transactionId (khuyến nghị)
  • orderId + referenceId
ParameterBắt buộcKiểu dữ liệuMô tảVí dụ
transactionIdKhông*String (UUID)ID của giao dịch550e8400-e29b-41d4-a716-446655440000
orderIdKhông*StringMã đơn hàngOrderId_001
referenceIdKhông*StringMã tham chiếuRefId_001

*Phải cung cấp transactionId HOẶC cả orderIdreferenceId

Response

Giao dịch từ luồng thanh toán tập trung (Payment Session) hoặc có nhiều nguồn tiền (VPoint, voucher, cổng…) có thể kèm data.items[].breakdown. Field này optional — không có trong mọi giao dịch. Cấu trúc giống IPN và API chi tiết session: xem Breakdown trong IPN.

Success Response (200 OK)

{
"code": 0,
"message": "string",
"data": {
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"referenceId": "ORDER_123456",
"orderId": "ORDER_123456",
"amount": 100000,
"currency": "VND",
"status": "COMPLETED",
"description": "Payment for order #123456",
"expiresAt": "2024-01-15T11:00:00Z",
"createdAt": "2024-01-15T10:45:00Z",
"updatedAt": "2024-01-15T10:45:00Z",
"merchant": {
"code": "GSM_VN",
"name": "GSM Vietnam"
},
"providerTransactionId": "ONEPAY_TXN_789",
"providerInvoiceId": "ONEPAY_INVOICE_789",
"paymentMethod": {
"id": "1",
"code": "CREDIT_CARD",
"name": "Credit Card",
"type": "CARD"
},
"provider": {
"id": "1",
"name": "OnePay"
},
"bankName": "Vietcombank",
"accountHolderName": "NGUYEN VAN A",
"cardNo": "411111******1111",
"orderInfo": {
"customerName": "Nguyen Van A",
"customerEmail": "[email protected]",
"customerPhone": "+84901234567",
"orderCreatedAt": 1640995200000,
"notes": "Giao hàng vào buổi sáng, gọi trước khi giao",
"items": [
{
"name": "Product A",
"sku": "Sku 001",
"quantity": 2,
"unitPrice": 50000,
"description": "High quality product"
}
]
}
}
]
}
}

Response Fields

FieldKiểu dữ liệuMô tả
codeIntegerMã trạng thái (0 = thành công)
messageStringThông báo kết quả
data.itemsArrayDanh sách giao dịch (thường là 1 item nếu query bằng transactionId)
data.items[].idString (UUID)ID giao dịch
data.items[].referenceIdStringMã tham chiếu
data.items[].orderIdStringMã đơn hàng
data.items[].amountIntegerSố tiền (minor unit, VD: 100000 = 100,000 VND)
data.items[].currencyStringLoại tiền tệ (VD: VND, USD)
data.items[].statusStringTrạng thái giao dịch: PENDING, PROCESSING, HOLDING, COMPLETED, FAILED, CANCELLED
data.items[].descriptionStringMô tả giao dịch
data.items[].expiresAtString (ISO 8601)Thời gian hết hạn giao dịch
data.items[].createdAtString (ISO 8601)Thời gian tạo giao dịch
data.items[].updatedAtString (ISO 8601)Thời gian cập nhật gần nhất
data.items[].merchantObjectThông tin merchant
data.items[].merchant.codeStringMã merchant
data.items[].merchant.nameStringTên merchant
data.items[].providerTransactionIdString/NullID giao dịch từ payment provider
data.items[].providerInvoiceIdString/NullID invoice trả về cho PayCollect (OnePay: provider_invoice_id; có thể null)
data.items[].paymentMethodObjectThông tin phương thức thanh toán
data.items[].paymentMethod.idStringID phương thức thanh toán
data.items[].paymentMethod.codeStringMã phương thức thanh toán (VD: CREDIT_CARD, WALLET, BANK_TRANSFER)
data.items[].paymentMethod.nameStringTên phương thức (VD: Credit Card, E-Wallet)
data.items[].paymentMethod.typeStringLoại phương thức (CARD, WALLET, BANK_TRANSFER, etc.)
data.items[].providerObjectThông tin payment provider
data.items[].provider.idStringID provider
data.items[].provider.nameStringTên provider (VD: OnePay, VNPay, Momo)
data.items[].bankNameString/NullTên ngân hàng phát hành thẻ/tài khoản (có thể null)
data.items[].accountHolderNameString/NullTên chủ thẻ/chủ tài khoản (có thể null)
data.items[].cardNoString/NullSố thẻ đã masking (VD: 411111******1111), không trả full PAN (có thể null)
data.items[].breakdownArray / Null(Optional) Phân bổ nguồn tiền (PAYMENT, VOUCHER, VPOINT…); thường có khi giao dịch gắn Payment Session / nhiều allocation. Cùng contract Breakdown trong IPN
data.items[].breakdown[].typeStringLoại dòng breakdown (VD: PAYMENT, VOUCHER, VPOINT)
data.items[].breakdown[].amountIntegerSố tiền dòng đó (minor unit, cùng quy ước amount giao dịch)
data.items[].breakdown[].statusStringTrạng thái từng item trong breakdown: PENDING, SUCCESS, FAILED, CANCELLED — xem Breakdown trong IPN
data.items[].breakdown[].referenceIdString / Null(Optional) ID tham chiếu downstream cho dòng đó
data.items[].breakdown[].referenceTypeString / Null(Optional) TRANSACTION | RESERVATION | REDEMPTION… — xem tài liệu IPN
data.items[].breakdown[].detailsObject (map) / Null(Optional) Map key-value theo type; không phải mảng ở root — xem payment-ipn.
data.items[].orderInfoObject/NullThông tin đơn hàng liên quan đến giao dịch (có thể null)
data.items[].orderInfo.customerNameStringTên khách hàng
data.items[].orderInfo.customerEmailStringEmail khách hàng
data.items[].orderInfo.customerPhoneStringSố điện thoại khách hàng
data.items[].orderInfo.orderCreatedAtNumberUnix timestamp (milliseconds) khi đơn hàng được tạo
data.items[].orderInfo.notesStringGhi chú về đơn hàng (dạng text)
data.items[].orderInfo.itemsArrayDanh sách sản phẩm/dịch vụ trong đơn hàng
data.items[].orderInfo.items[].nameStringTên sản phẩm
data.items[].orderInfo.items[].skuStringMã SKU sản phẩm
data.items[].orderInfo.items[].quantityIntegerSố lượng
data.items[].orderInfo.items[].unitPriceNumberĐơn giá (minor unit)
data.items[].orderInfo.items[].descriptionStringMô tả sản phẩm
data.items[].orderInfo.items[].categoryCodeStringMã danh mục/ngành hàng (optional)
data.items[].orderInfo.items[].categoryNameStringTên danh mục/ngành hàng (optional)

Error Responses

HTTP StatusCodeMessageMô tả
4004661Invalid get transaction detail requestThiếu parameters bắt buộc hoặc format không đúng
4014101X-API-Key header is requiredThiếu X-Payment-API-Key header
4014100Invalid API keyAPI Key không hợp lệ hoặc đã bị revoke
4034200Resource does not belong to this userGiao dịch không thuộc merchant/terminal của API Key
4044301Transaction not foundKhông tìm thấy giao dịch với thông tin đã cung cấp
429429Too Many RequestsVượt quá rate limit
5005000Internal server errorLỗi hệ thống
5005001Database errorLỗi kết nối hoặc truy vấn database

Cấu trúc Error Response

{
"code": 4301,
"message": "Transaction not found"
}

Lưu ý: HTTP status code được set ở response header tương ứng với error code.

Examples

Query bằng Transaction ID

Request:

curl -X GET "https://api.example.com/api/v1/payments/transactions?transactionId=550e8400-e29b-41d4-a716-446655440000" \
-H "X-Payment-API-Key: <your_payment_api_key_here>"

Success Response (200):

{
"code": 0,
"message": "Success",
"data": {
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"referenceId": "ORDER_123456",
"orderId": "ORDER_123456",
"amount": 100000,
"currency": "VND",
"status": "COMPLETED",
"description": "Payment for order #123456",
"expiresAt": "2024-01-15T11:00:00Z",
"createdAt": "2024-01-15T10:45:00Z",
"updatedAt": "2024-01-15T10:45:00Z",
"merchant": {
"code": "GSM_VN",
"name": "GSM Vietnam"
},
"providerTransactionId": "ONEPAY_TXN_789",
"paymentMethod": {
"id": "1",
"code": "CREDIT_CARD",
"name": "Credit Card",
"type": "CARD"
},
"provider": {
"id": "1",
"name": "OnePay"
},
"orderInfo": {
"customerName": "Nguyen Van A",
"customerEmail": "[email protected]",
"customerPhone": "+84901234567",
"orderCreatedAt": 1640995200000,
"notes": "Giao hàng vào buổi sáng, gọi trước khi giao",
"items": [
{
"name": "Product A",
"sku": "Sku 001",
"quantity": 2,
"unitPrice": 50000,
"description": "High quality product"
}
]
}
}
]
}
}

Query bằng Order ID và Reference ID

Request:

curl -X GET "https://api.example.com/api/payments/v1/transactions?orderId=ORDER_123456&referenceId=ORDER_123456" \
-H "X-Payment-API-Key: <your_payment_api_key_here>"

Success Response (200):

{
"code": 0,
"message": "Success",
"data": {
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"referenceId": "ORDER_123456",
"orderId": "ORDER_123456",
"amount": 100000,
"currency": "VND",
"status": "PENDING",
"description": "Payment for order #123456",
"expiresAt": "2024-01-15T11:00:00Z",
"createdAt": "2024-01-15T10:45:00Z",
"updatedAt": "2024-01-15T10:45:00Z",
"merchant": {
"code": "GSM_VN",
"name": "GSM Vietnam"
},
"providerTransactionId": null,
"paymentMethod": {
"id": "1",
"code": "E_WALLET",
"name": "E-Wallet",
"type": "WALLET"
},
"provider": {
"id": "1",
"name": "OnePay"
},
"orderInfo": {
"customerName": "Nguyen Van A",
"customerEmail": "[email protected]",
"customerPhone": "+84901234567",
"orderCreatedAt": 1640995200000,
"notes": "Giao hàng vào buổi sáng, gọi trước khi giao",
"items": [
{
"name": "Product A",
"sku": "Sku 001",
"quantity": 2,
"unitPrice": 50000,
"description": "High quality product"
}
]
}
}
]
}
}

Error Response Examples

Missing API Key (401):

{
"code": 4101,
"message": "X-API-Key header is required"
}

Transaction Not Found (404):

{
"code": 4301,
"message": "Transaction not found"
}

Ownership Mismatch (403):

{
"code": 4200,
"message": "Resource does not belong to this user"
}

Invalid Request (400):

{
"code": 4661,
"message": "Invalid get transaction detail request"
}

Routing qua Mule (Payment Hub)

Quan trọng: API lấy transaction được gọi trực tiếp từ Order Backend của MiniApp tới Payment Hub thông qua MuleSoft, không được gọi trực tiếp tới Payment Hub.

Internal (PnL)

Kết nối Internal dành cho các PnL trong Vingroup.

Base URL trên Mule (endpoint tới Payment Hub):

  • DEV: {MULE_INTERNAL_BASE_URL}/payment-hub/
  • SIT: {MULE_INTERNAL_BASE_URL}/sit/payment-hub/
  • UAT: {MULE_INTERNAL_BASE_URL}/uat/payment-hub/
  • Production: {MULE_INTERNAL_PROD_URL}/payment-hub/

Lưu ý: Với môi trường Production, các bên kết nối sẽ được team Mule cấp key riêng (client_idclient_secret). Với môi trường DEV/SIT/UAT dùng chung key.

Ví dụ gọi API lấy transaction (Internal - UAT Environment):

curl --location '{MULE_INTERNAL_BASE_URL}/payment-hub/api/payments/v1/transactions?transactionId=b68405a4-690f-4ab5-8d3b-0b202568be38' \
--header 'accept: */*' \
--header 'X-Payment-API-Key: <YOUR_PAYMENT_API_KEY>' \
--header 'X-Request-ID: 123123123' \
--header 'X-User-ID: 857652265' \
--header 'X-Auth-Audience: v-app' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'client_id: YOUR_CLIENT_ID' \
--header 'client_secret: YOUR_CLIENT_SECRET' \
--header 'Content-Type: application/json'

Ví dụ gọi API lấy transaction (Internal - Production Environment):

curl --location '{MULE_INTERNAL_PROD_URL}/payment-hub/api/payments/v1/transactions?transactionId=b68405a4-690f-4ab5-8d3b-0b202568be38' \
--header 'accept: */*' \
--header 'X-Payment-API-Key: <YOUR_PAYMENT_API_KEY>' \
--header 'X-Request-ID: 123123123' \
--header 'X-User-ID: 857652265' \
--header 'X-Auth-Audience: v-app' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'client_id: YOUR_CLIENT_ID' \
--header 'client_secret: YOUR_CLIENT_SECRET' \
--header 'Content-Type: application/json'

External (Đối tác)

Kết nối External dành cho các đối tác bên ngoài Vingroup. Chỉ hỗ trợ 2 môi trường: ProductionUAT.

Base URL trên Mule (endpoint tới Payment Hub):

  • UAT: https://test-api.vingroup.net:7445/payment-hub/
  • Production: https://api-cloud.vingroup.net/payment-hub/

Yêu cầu kết nối External:

  • Tất cả các request từ đối tác external cần cung cấp danh sách IPs để whitelist
  • Phía Mule sẽ cấp client_idclient_secret riêng cho từng đối tác
  • Có whitelist và limit access theo endpoint

Ví dụ gọi API lấy transaction (External - UAT Environment):

curl --location 'https://test-api.vingroup.net:7445/payment-hub/api/payments/v1/transactions?transactionId=b68405a4-690f-4ab5-8d3b-0b202568be38' \
--header 'accept: */*' \
--header 'X-Payment-API-Key: <YOUR_PAYMENT_API_KEY>' \
--header 'X-Request-ID: 123123123' \
--header 'X-User-ID: 857652265' \
--header 'X-Auth-Audience: v-app' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'client_id: YOUR_CLIENT_ID' \
--header 'client_secret: YOUR_CLIENT_SECRET' \
--header 'Content-Type: application/json'

Ví dụ gọi API lấy transaction (External - Production Environment):

curl --location 'https://api-cloud.vingroup.net/payment-hub/api/payments/v1/transactions?transactionId=b68405a4-690f-4ab5-8d3b-0b202568be38' \
--header 'accept: */*' \
--header 'X-Payment-API-Key: <YOUR_PAYMENT_API_KEY>' \
--header 'X-Request-ID: 123123123' \
--header 'X-User-ID: 857652265' \
--header 'X-Auth-Audience: v-app' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'client_id: YOUR_CLIENT_ID' \
--header 'client_secret: YOUR_CLIENT_SECRET' \
--header 'Content-Type: application/json'

Quy tắc chung:

  • Yêu cầu các header cơ bản: X-Payment-API-Key, X-Request-ID, X-Timestamp (hoặc theo từng API doc). Thêm header để pass MuleSoft: Authorization, client_id, client_secret, v.v.
  • Các request được forward qua Mule tới Payment Hub — đảm bảo token/client/config phù hợp với Mule khi gọi.

Lưu ý quan trọng

  • Xác thực quyền truy cập: Hệ thống sẽ verify giao dịch có thuộc về merchant/terminal tương ứng với Payment API Key hay không. Nếu không khớp sẽ trả về lỗi 403.

  • Service-to-service: API này dành cho OrderBackend và các service nội bộ, không dùng cho client trực tiếp.

  • Multiple results: Khi query bằng orderId + referenceId, có thể trả về nhiều giao dịch trong mảng items. Client cần xử lý trường hợp này.

  • Transaction Status: Các giá trị status bao gồm:

    • PENDING: Đang chờ xử lý
    • PROCESSING: Đang xử lý
    • HOLDING: Đang giữ tiền, chờ xác nhận
    • COMPLETED: Thành công
    • FAILED: Thất bại
    • CANCELLED: Đã hủy
  • Amount format: Giá trị amount được trả về dưới dạng integer minor unit (ví dụ: 100000 tương đương 100,000 VND).

  • breakdown: Khi có, ý nghĩa data.items[].amount so với tổng các dòng trong breakdown tuân cùng quy ước như Breakdown trong IPN (ví dụ amount item có thể là phần user trả qua cổng online khi có VPoint/voucher).

  • Timestamp format: Tất cả timestamps (createdAt, updatedAt, expiresAt) đều ở định dạng ISO 8601.

  • Rate limiting: API có giới hạn số lượng request. Khi vượt quá sẽ nhận HTTP 429.

Security Considerations

  • API sẽ được gọi qua MuleSoft. Xem phần "Routing qua Mule (Payment Hub)" ở trên để biết chi tiết về endpoint và authentication.