Lịch sử giao dịch
API dùng để truy vấn danh sách lịch sử giao dịch (ghi có và ghi nợ) của Merchant hoặc Shop. Bạn có thể lọc theo số tài khoản ảo (VA), mã ngân hàng, hoặc khoảng thời gian cụ thể để phục vụ việc đối soát.
POST
URLhttps://uat-open-api.tingee.vn/v1/transaction/get-paging
Truy vấn lịch sử giao dịch chi tiết. Kết quả trả về bao gồm thông tin số tiền, loại giao dịch, thời gian và nội dung chuyển khoản.
Header Request
| Header | Bắt buộc | Mô tả |
|---|---|---|
Content-Type | ✓ | application/json |
x-client-id | ✓ | Mã định danh của đối tác do TINGEE cung cấp. |
x-signature | ✓ | Chữ ký xác thực HMAC SHA512. Xem thêm tại Cách sinh chữ ký. |
x-request-timestamp | ✓ | Thời gian gửi request (format: yyyyMMddHHmmssSSS, múi giờ UTC+7) |
Body Parameter
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
filter | string | ✕ | Từ khóa tìm kiếm (mã giao dịch, nội dung...). |
skipCount | number | ✕ | Số bản ghi bỏ qua (phân trang). |
maxResultCount | number | ✕ | Số bản ghi tối đa mỗi trang. |
merchantId | number | ✕ | ID của Merchant (Bắt buộc nếu kết nối bằng tài khoản Master Merchant). |
shopIds | array | ✕ | Danh sách ID cửa hàng cần lọc. |
vaAccountNumbers | array | ✕ | Danh sách số tài khoản ảo cần lọc. |
bankBin | string | ✕ | Mã BIN ngân hàng. Xem tại Danh sách ngân hàng hỗ trợ. |
startTime | string | ✓ | Thời gian bắt đầu (format: yyyyMMddHHmmss, múi giờ UTC+7). |
endTime | string | ✓ | Thời gian kết thúc (format: yyyyMMddHHmmss, múi giờ UTC+7). |
Giới hạn khoảng thời gian truy vấn
Mỗi request chỉ được phép truy vấn trong khoảng tối đa 10 ngày. Khoảng cách giữa startTime và endTime không được vượt quá 10 ngày. Nếu cần lấy dữ liệu cho khoảng thời gian dài hơn, hãy chia thành nhiều request nhỏ.
Ví dụ mã nguồn
- cURL
- NestJS
- C#
- Java
- PHP
curl --location --request POST 'https://uat-open-api.tingee.vn/v1/transaction/get-paging' \
--header 'accept: application/json' \
--header 'x-signature: YOUR_SIGNATURE' \
--header 'x-request-timestamp: 20251110175110111' \
--header 'x-client-id: YOUR_CLIENT_ID' \
--header 'Content-Type: application/json' \
--data '{
"filter": "",
"skipCount": 0,
"maxResultCount": 10,
"merchantId": 0,
"shopIds": [0],
"vaAccountNumbers": ["string"],
"bankBin": "string",
"startTime": "2025-10-01T00:00:00Z",
"endTime": "2025-10-22T00:00:00Z"
}'
import axios from "axios";
import { createHmac } from "crypto";
import { format } from 'date-fns';
async function getTransactionHistory() {
const body = {
filter: "",
skipCount: 0,
maxResultCount: 10,
merchantId: 0,
shopIds: [0],
vaAccountNumbers: ["string"],
bankBin: "string",
startTime: "2025-10-01T00:00:00Z",
endTime: "2025-10-22T00:00:00Z",
};
const timestamp = format(new Date(), "yyyyMMddHHmmssSSS");
const secretKey = "YOUR_SECRET_KEY";
const message = `${timestamp}:${JSON.stringify(body)}`;
const signature = createHmac('sha512', secretKey).update(message).digest('hex');
const response = await axios.post(
"https://uat-open-api.tingee.vn/v1/transaction/get-paging",
body,
{
headers: {
"x-client-id": "YOUR_CLIENT_ID",
"x-request-timestamp": timestamp,
"x-signature": signature,
"Content-Type": "application/json",
},
}
);
console.log(response.data);
}
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Security.Cryptography;
using System.Threading.Tasks;
public class GetTransactionExample
{
private static readonly HttpClient client = new HttpClient();
public static async Task Main()
{
var body = new {
filter = "",
skipCount = 0,
maxResultCount = 10,
merchantId = 0,
shopIds = new int[] { 0 },
vaAccountNumbers = new string[] { "string" },
bankBin = "string",
startTime = "2025-10-01T00:00:00Z",
endTime = "2025-10-22T00:00:00Z"
};
var timestamp = DateTime.Now.ToString("yyyyMMddHHmmssfff");
var secretKey = "YOUR_SECRET_KEY";
var bodyJson = JsonSerializer.Serialize(body);
var message = $"{timestamp}:{bodyJson}";
var signature = CreateHmacSha512(secretKey, message);
var request = new HttpRequestMessage(HttpMethod.Post, "https://uat-open-api.tingee.vn/v1/transaction/get-paging");
request.Headers.Add("x-signature", signature);
request.Headers.Add("x-request-timestamp", timestamp);
request.Headers.Add("x-client-id", "YOUR_CLIENT_ID");
request.Content = new StringContent(bodyJson, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);
string result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
}
private static string CreateHmacSha512(string key, string message)
{
using var hmac = new HMACSHA512(Encoding.UTF8.GetBytes(key));
var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
return BitConverter.ToString(hash).Replace("-", "").ToLower();
}
}
import java.net.http.*;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class GetTransactionHistory {
public static void main(String[] args) throws Exception {
String bodyJson = "{\"filter\":\"\",\"skipCount\":0,\"maxResultCount\":10,\"merchantId\":0,\"shopIds\":[0],\"vaAccountNumbers\":[\"string\"],\"bankBin\":\"string\",\"startTime\":\"2025-10-01T00:00:00Z\",\"endTime\":\"2025-10-22T00:00:00Z\"}";
String secretKey = "YOUR_SECRET_KEY";
String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
String message = timestamp + ":" + bodyJson;
String signature = hmacSha512(secretKey, message);
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://uat-open-api.tingee.vn/v1/transaction/get-paging"))
.header("accept", "application/json")
.header("x-signature", signature)
.header("x-request-timestamp", timestamp)
.header("x-client-id", "YOUR_CLIENT_ID")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(bodyJson))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
private static String hmacSha512(String key, String data) throws Exception {
Mac mac = Mac.getInstance("HmacSHA512");
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA512");
mac.init(secretKeySpec);
byte[] hash = mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
return toHex(hash);
}
private static String toHex(byte[] bytes) {
StringBuilder hex = new StringBuilder(bytes.length * 2);
for (byte b : bytes) {
hex.append(String.format("%02x", b));
}
return hex.toString();
}
}
function getTransactionHistory() {
$body = [
"filter" => "",
"skipCount" => 0,
"maxResultCount" => 10,
"merchantId" => 0,
"shopIds" => [0],
"vaAccountNumbers" => ["string"],
"bankBin" => "string",
"startTime" => "2025-10-01T00:00:00Z",
"endTime" => "2025-10-22T00:00:00Z"
];
$jsonBody = json_encode($body);
$timestamp = date("YmdHis") . substr((string)microtime(true), -3);
$secretKey = "YOUR_SECRET_KEY";
$message = $timestamp . ":" . $jsonBody;
$signature = hash_hmac("sha512", $message, $secretKey);
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://uat-open-api.tingee.vn/v1/transaction/get-paging",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $jsonBody,
CURLOPT_HTTPHEADER => [
"Accept: application/json",
"Content-Type: application/json",
"x-client-id: YOUR_CLIENT_ID",
"x-request-timestamp: " . $timestamp,
"x-signature: " . $signature
]
]);
$response = curl_exec($ch);
$err = curl_error($ch);
curl_close($ch);
if ($err) {
echo "cURL Error: " . $err;
} else {
echo $response;
}
}
Response mẫu
{
"code": "00",
"message": "Success",
"data": {
"totalCount": 100,
"items": [
{
"transactionId": "TX123456789",
"accountNumber": "0123456789",
"amount": 100000,
"type": "CREDIT",
"bankBin": "970422",
"bankName": "MBB",
"transactionTime": "2025-10-22T10:00:00Z",
"description": "Thanh toan don hang #123"
}
]
}
}
| Trường | Kiểu | Mô tả |
|---|---|---|
code | string | Mã kết quả (00 = Thành công). |
message | string | Thông điệp phản hồi. |
data.items | array | Danh sách giao dịch chi tiết. |
data.totalCount | number | Tổng số giao dịch tìm thấy. |
Mã lỗi thường gặp
| Code | Mô tả | Hướng xử lý |
|---|---|---|
90 | Sai format timestamp | Kiểm tra format yyyyMMddHHmmssSSS. |
91 | Request quá hạn | Kiểm tra thời gian gửi request. |
97 | Sai chữ ký | Kiểm tra lại Secret Key và logic tạo Signature. |
Others | Lỗi khác | Xem Danh sách mã lỗi. |