Bối cảnh pháp lý
Nghị định 70/2025/NĐ-CP (có hiệu lực từ ngày 1/6/2025) thay thế Thông tư 78/2021/TT-BTC là văn bản pháp lý hiện hành điều chỉnh việc sử dụng hóa đơn điện tử tại Việt Nam.
Điểm khác biệt lớn nhất: Nghị định 70 nâng tầm pháp lý từ thông tư lên nghị định, đồng thời cập nhật các quy định phù hợp với thực tế triển khai hóa đơn điện tử diện rộng sau nhiều năm.
Những thay đổi quan trọng developer cần biết
| Nội dung | Trước (TT 78) | Hiện tại (NĐ 70) |
|---|---|---|
| Thời điểm lập hóa đơn | Tại thời điểm cung cấp dịch vụ/hàng hóa | Giữ nguyên, làm rõ thêm các trường hợp đặc thù |
| Mã số thuế người mua | Bắt buộc với tổ chức | Bắt buộc, bổ sung xác thực thực tế |
| Hóa đơn điều chỉnh/hủy | Có quy trình | Quy trình được làm rõ hơn |
| Lưu trữ hóa đơn | Tối thiểu 10 năm | Giữ nguyên |
| Kết nối với cơ quan thuế | Qua MISA, VNPT, v.v. | Giữ nguyên, bổ sung yêu cầu tần suất đồng bộ |
Luồng phát hành hóa đơn điện tử qua TConnect API
[Hệ thống bán hàng của bạn]
│
▼
POST /openapi/v1/einvoice/create ──► [TConnect API]
│ │
│ ┌────────────┴────────────┐
│ [Xác thực dữ liệu] [Gửi CQT (Cơ quan thuế)]
│ │
│◄────── invoice_no + pdf_url ──────────┘
│
[Gửi hóa đơn cho khách hàng]Bước 1: Chuẩn bị dữ liệu hóa đơn
Theo Nghị định 70, một hóa đơn điện tử hợp lệ cần có:
invoice_data = {
// Thông tin người bán (từ cấu hình merchant TConnect)
seller: {
tax_code: "0123456789",
name: "CÔNG TY TNHH ABC",
address: "123 Nguyễn Huệ, Q.1, TP.HCM"
},
// Thông tin người mua
buyer: {
name: "CÔNG TY CP XYZ",
tax_code: "9876543210", // Bắt buộc với doanh nghiệp
address: "456 Lê Lợi, Q.3, TP.HCM",
email: "[email protected]"
},
// Thông tin hóa đơn
invoice_date: "2025-08-10", // ISO 8601
invoice_type: "01GTKT", // Hóa đơn GTGT
currency: "VND",
exchange_rate: 1,
// Chi tiết hàng hóa/dịch vụ
items: [
{
line_no: 1,
item_name: "Phí sử dụng API thanh toán tháng 7/2025",
unit: "Tháng",
quantity: 1,
unit_price: 2000000,
vat_rate: 10, // 10% theo luật hiện hành
amount_before_vat: 2000000,
vat_amount: 200000,
amount: 2200000
}
],
// Tổng hóa đơn
total_amount_before_vat: 2000000,
total_vat_amount: 200000,
total_amount: 2200000,
total_amount_in_words: "Hai triệu hai trăm nghìn đồng chẵn",
// Liên kết đơn hàng (để đối soát)
reference_order_id: "ORDER_2025_07_001"
}Bước 2: Phát hành hóa đơn
function create_invoice(base_url, partner_code, access_token, aes_key, invoice_data):
encrypted = encrypt_payload(invoice_data, aes_key)
POST {base_url}/openapi/v1/einvoice/create
body: { data: encrypted }
headers:
Authorization: "Bearer {access_token}"
Partner-Code: partner_code
result = decrypt_response(response.data, aes_key)
return {
invoice_no: result.invoice_no, // Số hóa đơn
invoice_code: result.invoice_code, // Ký hiệu hóa đơn
pdf_url: result.pdf_url, // Link PDF
xml_url: result.xml_url, // Link XML (gốc điện tử)
status: result.status // ISSUED / PENDING_CQT
}Bước 3: Gửi hóa đơn cho khách hàng
Sau khi phát hành, gửi hóa đơn qua email:
function send_invoice_email(invoice_no, customer_email, pdf_url):
// Gửi email với link PDF hoặc đính kèm file
send_email(
to: customer_email,
subject: "Hóa đơn điện tử số {invoice_no}",
body: """
Kính gửi Quý khách,
Vui lòng tải hóa đơn điện tử tại: {pdf_url}
Hóa đơn này được phát hành theo quy định của Nghị định 70/2025/NĐ-CP.
"""
)Điều chỉnh và hủy hóa đơn
Theo Nghị định 70, có 2 cách xử lý hóa đơn sai:
Điều chỉnh (khi hóa đơn đã gửi CQT)
function adjust_invoice(base_url, partner_code, access_token, aes_key,
original_invoice_no, adjustment_data):
payload = {
original_invoice_no: original_invoice_no,
adjustment_type: "INCREASE", // hoặc "DECREASE"
reason: "Điều chỉnh số lượng theo xác nhận của khách hàng",
items: adjustment_data.items
}
POST /openapi/v1/einvoice/adjustHủy (khi chưa gửi CQT hoặc được phép hủy)
function cancel_invoice(base_url, partner_code, access_token, aes_key,
invoice_no, reason):
payload = {
invoice_no: invoice_no,
reason: reason
}
POST /openapi/v1/einvoice/cancelTự động hóa hóa đơn sau thanh toán
Pattern phổ biến nhất: phát hành hóa đơn tự động khi nhận IPN thanh toán thành công.
// IPN endpoint: POST /webhook/ipn
function ipn_handler(request):
body = parse_json(request)
txn = decrypt_response(body.data, AES_KEY)
if txn.status == "SUCCESS":
order = get_order(txn.order_id)
// Phát hành hóa đơn tự động
invoice = create_invoice(
invoice_data = build_invoice_from_order(order)
)
// Cập nhật đơn hàng
mark_order_paid(order.id, invoice.invoice_no)
// Gửi email hóa đơn
send_invoice_email(
invoice.invoice_no,
order.customer_email,
invoice.pdf_url
)
return { status: "ok" }Lưu ý quan trọng
Thời điểm lập hóa đơn: Theo Nghị định 70, hóa đơn phải được lập tại thời điểm cung cấp hàng hóa/dịch vụ — không phải khi nhận tiền. Với SaaS/subscription, đây là ngày đầu kỳ dịch vụ.
Lưu trữ bắt buộc 10 năm: Đừng chỉ lưu link PDF — lưu cả file XML gốc, đây mới là bản gốc hóa đơn điện tử theo luật.
Kiểm tra mã số thuế: Trước khi phát hành hóa đơn cho doanh nghiệp, dùng API Tra cứu MST của TConnect để xác thực tính hợp lệ.
Kết luận
Nghị định 70/2025/NĐ-CP không thay đổi quá nhiều so với Thông tư 78 về mặt kỹ thuật — nhưng nâng tầm pháp lý và làm rõ nhiều quy trình. Tích hợp API hóa đơn điện tử với TConnect giúp bạn tuân thủ đúng quy định mà không cần quản lý phức tạp việc kết nối trực tiếp với cơ quan thuế.