Tạo / Cập nhật cấu hình ngân hàng
API này cho phép tạo mới hoặc cập nhật cấu hình kết nối ngân hàng cho tài khoản Merchant. Khi gửi cùng bankBin, hệ thống sẽ tự động tạo mới hoặc ghi đè cấu hình hiện tại.
POST
URLhttps://uat-open-api.tingee.vn/v1/merchant/create-or-update-config
Tạo mới hoặc cập nhật cấu hình tích hợp ngân hàng cho Merchant.
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ả |
|---|---|---|---|
merchantId | number | ✕ | ID của Merchant (Bắt buộc nếu kết nối bằng tài khoản Master Merchant). |
bankBin | string | ✕ | Mã BIN ngân hàng. Ưu tiên hơn bankName nếu truyền cả hai. |
bankName | string | ✕ | Tên ngân hàng (ví dụ: ACB, BIDV, CTG). Bắt buộc nếu không truyền bankBin. |
accountType | string | ✓ | Loại tài khoản: BusinessAccount hoặc BusinessHouseHoldAccount. |
id | number | ✕ | ID của cấu hình hiện tại (truyền để cập nhật, bỏ trống để tạo mới). |
otpNumber | string | ✕ | Mã OTP xác nhận (yêu cầu bởi một số ngân hàng). |
confirmId | string | ✕ | Mã xác nhận nhận được sau bước đăng ký cấu hình ACB. |
bidvConfigDto | object | ✕ | Cấu hình chi tiết cho ngân hàng BIDV. |
bidvConfigDto.accountNumber | string | ✓ | Số tài khoản ngân hàng BIDV. |
bidvConfigDto.accountName | string | ✓ | Tên chủ tài khoản BIDV. |
bidvConfigDto.vaPrefix | string | ✓ | Tiền tố Virtual Account của BIDV. |
bidvConfigDto.bankPartnerId | string | ✓ | Mã đối tác ngân hàng BIDV cấp. |
ctgConfigDto | object | ✕ | Cấu hình chi tiết cho ngân hàng CTG (VietinBank). |
ctgConfigDto.accountNumber | string | ✓ | Số tài khoản ngân hàng VietinBank. |
ctgConfigDto.accountName | string | ✓ | Tên chủ tài khoản VietinBank. |
ctgConfigDto.vaPrefix | string | ✓ | Tiền tố Virtual Account của VietinBank. |
vcbConfigDto | object | ✕ | Cấu hình chi tiết cho ngân hàng VCB (Vietcombank). |
vcbConfigDto.accountNumber | string | ✓ | Số tài khoản ngân hàng Vietcombank. |
vcbConfigDto.accountName | string | ✓ | Tên chủ tài khoản Vietcombank. |
vcbConfigDto.merchantId | string | ✓ | Mã Merchant do Vietcombank cấp. |
vcbConfigDto.terminalId | string | ✓ | Mã terminal do Vietcombank cấp. |
vpbConfigDto | object | ✕ | Cấu hình chi tiết cho ngân hàng VPB (VPBank). |
vpbConfigDto.accountNumber | string | ✓ | Số tài khoản ngân hàng VPBank. |
vpbConfigDto.accountName | string | ✓ | Tên chủ tài khoản VPBank. |
vpbConfigDto.merchantId | string | ✓ | Mã Merchant do VPBank cấp. |
vpbConfigDto.terminalId | string | ✓ | Mã terminal do VPBank cấp. |
Ví dụ mã nguồn
- cURL
- NestJS
- C#
- Java
- PHP
curl --location --request POST 'https://uat-open-api.tingee.vn/v1/merchant/create-or-update-config' \
--header 'x-signature: YOUR_SIGNATURE' \
--header 'x-request-timestamp: 20251209103911111' \
--header 'x-client-id: YOUR_CLIENT_ID' \
--header 'Content-Type: application/json' \
--data '{
"bankBin": "970416",
"accountType": "BusinessAccount",
"bidvConfigDto": {
"accountNumber": "1234567890",
"accountName": "CONG TY TNHH ABC",
"vaPrefix": "TINGEE",
"bankPartnerId": "PARTNER_001"
}
}'
import axios from "axios";
import { createHmac } from "crypto";
import { format } from 'date-fns';
async function createOrUpdateConfig() {
const body = {
bankBin: "970416",
accountType: "BusinessAccount",
bidvConfigDto: {
accountNumber: "1234567890",
accountName: "CONG TY TNHH ABC",
vaPrefix: "TINGEE",
bankPartnerId: "PARTNER_001",
},
};
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 res = await axios.post('https://uat-open-api.tingee.vn/v1/merchant/create-or-update-config', body, {
headers: {
'x-signature': signature,
'x-request-timestamp': timestamp,
'x-client-id': 'YOUR_CLIENT_ID',
'Content-Type': 'application/json',
},
});
console.log(res.data);
}
var body = new {
bankBin = "970416",
accountType = "BusinessAccount",
bidvConfigDto = new {
accountNumber = "1234567890",
accountName = "CONG TY TNHH ABC",
vaPrefix = "TINGEE",
bankPartnerId = "PARTNER_001"
}
};
var timestamp = DateTime.Now.ToString("yyyyMMddHHmmssfff");
var bodyJson = JsonSerializer.Serialize(body);
var message = $"{timestamp}:{bodyJson}";
using var hmac = new HMACSHA512(Encoding.UTF8.GetBytes("YOUR_SECRET_KEY"));
var signature = BitConverter.ToString(hmac.ComputeHash(Encoding.UTF8.GetBytes(message))).Replace("-","").ToLower();
var request = new HttpRequestMessage(HttpMethod.Post, "https://uat-open-api.tingee.vn/v1/merchant/create-or-update-config");
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 new HttpClient().SendAsync(request);
Console.WriteLine(await response.Content.ReadAsStringAsync());
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 CreateOrUpdateConfig {
public static void main(String[] args) throws Exception {
String bodyJson = "{"bankBin":"970416","accountType":"BusinessAccount","bidvConfigDto":{"accountNumber":"1234567890","accountName":"CONG TY TNHH ABC","vaPrefix":"TINGEE","bankPartnerId":"PARTNER_001"}}";
String secretKey = "YOUR_SECRET_KEY";
String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
Mac mac = Mac.getInstance("HmacSHA512");
mac.init(new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "HmacSHA512"));
byte[] hash = mac.doFinal((timestamp + ":" + bodyJson).getBytes(StandardCharsets.UTF_8));
StringBuilder signature = new StringBuilder();
for (byte b : hash) signature.append(String.format("%02x", b));
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://uat-open-api.tingee.vn/v1/merchant/create-or-update-config"))
.header("x-signature", signature.toString())
.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 = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
$body = [
"bankBin" => "970416",
"accountType" => "BusinessAccount",
"bidvConfigDto" => [
"accountNumber" => "1234567890",
"accountName" => "CONG TY TNHH ABC",
"vaPrefix" => "TINGEE",
"bankPartnerId" => "PARTNER_001"
]
];
$jsonBody = json_encode($body);
$timestamp = date("YmdHis") . substr((string)microtime(true), -3);
$signature = hash_hmac("sha512", $timestamp . ":" . $jsonBody, "YOUR_SECRET_KEY");
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://uat-open-api.tingee.vn/v1/merchant/create-or-update-config",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $jsonBody,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-client-id: YOUR_CLIENT_ID",
"x-request-timestamp: $timestamp",
"x-signature: $signature"
]
]);
echo curl_exec($ch);
curl_close($ch);
Response mẫu
{
"code": "00",
"message": "Success",
"data": null
}
| 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. |
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. |