Ancarat × BIDV
Balance Notification

Dịch vụ nhận biến động số dư (BĐSD) từ BIDV qua luồng H2H — mã hóa OpenPGP, xác thực Basic Auth, lưu trữ cơ sở dữ liệu.

● Live v0.1.0 OpenPGP

Xác thực (Authentication)

BIDV xác thực bằng Basic Auth khi gọi API của chúng ta.

Basic Auth (BIDV → Ancarat)

HTTP header:

Authorization: Basic <base64(username:password)>

Username và password do Ancarat cấp cho BIDV. Được cấu hình qua biến môi trường BIDV_BASIC_AUTH_USERNAME và BIDV_BASIC_AUTH_PASSWORD.

REQUESTID Header

BIDV gửi kèm header để trace log:

REQUESTID: 20220510155610517-7babdf6a-691c-407d-9b5f-fd0f6320037f

Được lưu vào cơ sở dữ liệu (trường bidv_request_id) và log để đối soát.

Mã hóa PGP (OpenPGP Encryption)

BIDV mã hóa dữ liệu giao dịch bằng OpenPGP trước khi gửi.

Quy trình mã hóa

1. Ancarat tạo cặp khóa PGP (RSA 2048+)
2. Gửi public key cho BIDV
3. BIDV mã hóa dữ liệu JSON bằng public key
4. Base64 encode dữ liệu đã mã hóa
5. Gửi trong trường "data" của request body
6. Ancarat giải mã bằng private key

Private key lưu tại certs/pgp-private-key.asc (GITIGNORED). Public key tại certs/pgp-public-key.asc.

POST

Balance Notification (Biến Động Số Dư)

/api/v1/bidv/ancarat/notify
↙ Inbound — BIDV gọi Ancarat

BIDV gửi thông tin biến động số dư (ghi nợ/ghi có) trên tài khoản. Dữ liệu được mã hóa PGP, giải mã và lưu vào cơ sở dữ liệu.

B
BIDV
(encrypt)
A
Ancarat
(auth)
P
PGP
(decrypt)
A
Ancarat
(dedup)
DB
Cơ sở
dữ liệu
BIDV có cơ chế retry giao dịch. Hệ thống tự động loại trùng bằng cặp (accountNo, refNo, seq).
HeaderValueDescription
AuthorizationBasic <base64>Basic Auth credentials
Content-Typeapplication/jsonJSON body
REQUESTIDStringMã trace log từ BIDV
FieldTypeRequiredDescription
bankCodeLiteral["BIDV"]RequiredNguồn dữ liệu (mặc định "BIDV")
dataString (max 10MB)RequiredDữ liệu giao dịch đã được BIDV mã hóa PGP + Base64
FieldTypeDescription
errorCodeString"000" = Thành công
errorDescStringMô tả kết quả
HTTP status luôn trả về 200. Kết quả thành công/thất bại được xác định bởi errorCode trong body.

Transaction Fields (28 trường)

Nội dung JSON sau khi giải mã trường "data". Có thể là 1 object hoặc 1 array nhiều giao dịch.

#FieldTypeRequiredDescription
1transDateString(6)MNgày hạch toán (ddmmyy). VD: "120126" = 12/01/2026
2transTimeString(6)MGiờ hạch toán (HH24MISS). VD: "101804"
3accountNoStringMSố tài khoản nhận biến động số dư
4dorcLiteral["C","D"]MC = Credit (ghi có), D = Debit (ghi nợ)
5currencyStringMLoại tiền (VND)
6amountString (digits)MSố tiền giao dịch (VND, số nguyên, không có thập phân)
7remarkStringONội dung giao dịch
8refNoStringMSố tham chiếu (số hạch toán tại Core BIDV)
9frBankCodeStringOMã ngân hàng gửi
10frAccNameStringOTên tài khoản gửi
11frAccNoStringOSố tài khoản gửi
12frBankNameStringOTên ngân hàng gửi
13seqStringMSố thứ tự giao dịch tại BIDV
14endBalStringOSố dư sau giao dịch
15channelRefStringOSố tham chiếu kênh
16channelIDStringOMã kênh thanh toán
17toBankCodeStringOMã ngân hàng nhận
18toAccNameStringOTên tài khoản nhận
19toAccNoStringOSố tài khoản nhận
20toBankNameStringOTên ngân hàng nhận
21vaStringOSố tài khoản định danh (Virtual Account)
22transCodeStringOMã loại giao dịch theo BIDV
23businessDateStringONgày tạo giao dịch
24-28ext1 – ext5StringOTrường mở rộng 1-5

Loại trùng (Deduplication)

BIDV có cơ chế retry khi gửi thông tin không thành công. Hệ thống sử dụng unique index để chống trùng.

Khóa duy nhất (Unique Key)

(accountNo, refNo, seq)

Chỉ mục duy nhất (unique compound index) trên cơ sở dữ liệu. Giao dịch trùng sẽ tự động bỏ qua, trả về errorCode "000".

Đối soát dữ liệu: Hệ thống khách hàng có thể vấn tin lịch sử / sao kê tài khoản từ BIDV (theo luồng Inbound) để đảm bảo đầy đủ dữ liệu.
GET

Health Check

/health

Kiểm tra trạng thái hệ thống: cơ sở dữ liệu và khóa PGP.

FieldTypeDescription
statusString"ok" hoặc "degraded"
app_nameStringTên ứng dụng
versionStringPhiên bản
mongodbString"connected" hoặc "disconnected"
pgpString"ok" hoặc "not_loaded"

Mã lỗi (Error Codes)

CodeMô tả (Tiếng Việt)Description (English)
000Thành côngSuccess
001Lỗi giải mã PGPPGP decryption error
099Lỗi hệ thốngSystem error
400Dữ liệu không hợp lệInvalid request data (validation)
401Xác thực thất bạiUnauthorized (Basic Auth failure, HTTP 401)
Tất cả response trên endpoint /api/v1/bidv/ancarat/notify trả về HTTP 200. Chỉ lỗi 401 trả về HTTP 401 (xử lý bởi middleware trước khi vào service).