Tạo / Cập nhật tài khoản nhà cung cấp
API này cho phép tạo mới hoặc cập nhật tài khoản nhà cung cấp hóa đơn điện tử. Nếu truyền id sẽ cập nhật tài khoản hiện tại, không truyền sẽ tạo mới (kiểm tra trùng theo merchantId + provider + taxCode).
POST
URLhttps://uat-open-api.tingee.vn/v1/e-invoice/create-or-update-account
Tạo mới hoặc cập nhật tài khoản nhà cung cấp hóa đơn điện tử.
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ả |
|---|---|---|---|
id | number | ✕ | ID tài khoản (truyền để cập nhật, bỏ trống để tạo mới). |
merchantId | number | ✕ | Mã Merchant. (Bắt buộc nếu kết nối bằng tài khoản Master Merchant). |
provider | string | ✓ | Nhà cung cấp: x-cyber, hilo, s-invoice. |
taxCode | string | ✓ | Mã số thuế doanh nghiệp. |
username | string | ✓ | Tên đăng nhập tài khoản provider. |
password | string | ✓ | Mật khẩu tài khoản (được lưu mã hóa). |
isDefault | boolean | ✕ | Đặt làm tài khoản mặc định (Mặc định: false). |
isActive | boolean | ✕ | Kích hoạt tài khoản (Mặc định: true). |
Ví dụ mã nguồn
- cURL
- NestJS
- C#
- Java
- PHP
curl --location --request POST 'https://uat-open-api.tingee.vn/v1/e-invoice/create-or-update-account' \
--header 'x-signature: YOUR_SIGNATURE' \
--header 'x-request-timestamp: 20251209103911111' \
--header 'x-client-id: YOUR_CLIENT_ID' \
--header 'Content-Type: application/json' \
--data '{
"provider": "x-cyber",
"taxCode": "0101234567",
"username": "admin@company.vn",
"password": "your_password",
"isDefault": true,
"isActive": true
}'
import axios from "axios";
import { createHmac } from "crypto";
import { format } from 'date-fns';
async function createOrUpdateAccount() {
const body = {
provider: "x-cyber",
taxCode: "0101234567",
username: "admin@company.vn",
password: "your_password",
isDefault: true,
isActive: true,
};
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/e-invoice/create-or-update-account', body, {
headers: {
'x-signature': signature,
'x-request-timestamp': timestamp,
'x-client-id': 'YOUR_CLIENT_ID',
'Content-Type': 'application/json',
},
});
console.log(res.data);
}
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Security.Cryptography;
using System.Threading.Tasks;
public class CreateOrUpdateAccountExample
{
private static readonly HttpClient client = new HttpClient();
public static async Task Main()
{
var body = new {
provider = "x-cyber",
taxCode = "0101234567",
username = "admin@company.vn",
password = "your_password",
isDefault = true,
isActive = true
};
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/e-invoice/create-or-update-account");
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 CreateOrUpdateAccount {
public static void main(String[] args) throws Exception {
String bodyJson = "{"provider":"x-cyber","taxCode":"0101234567","username":"admin@company.vn","password":"your_password","isDefault":true,"isActive":true}";
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/e-invoice/create-or-update-account"))
.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 createOrUpdateAccount() {
$body = [
"provider" => "x-cyber",
"taxCode" => "0101234567",
"username" => "admin@company.vn",
"password" => "your_password",
"isDefault" => true,
"isActive" => true
];
$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/e-invoice/create-or-update-account",
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
]
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
}
Response mẫu
{
"data": {
"id": 1,
"merchantId": 10001,
"provider": "x-cyber",
"taxCode": "0101234567",
"username": "admin@company.vn",
"isDefault": true,
"isActive": true
},
"success": true,
"error": null
}
| Trường | Kiểu | Mô tả |
|---|---|---|
data | object | Thông tin tài khoản đã tạo/cập nhật. |
data.id | number | ID tài khoản. |
data.merchantId | number | Mã Merchant. |
data.provider | string | Mã nhà cung cấp. |
data.taxCode | string | Mã số thuế doanh nghiệp. |
data.username | string | Tên đăng nhập. |
data.isDefault | boolean | Tài khoản mặc định. |
data.isActive | boolean | Trạng thái hoạt động. |
success | boolean | Trạng thái xử lý (true = Thành công). |
error | string | Mã lỗi (nếu có), null nếu thành công. |
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. |