# API Refund Transaction

## **TÀI LIỆU TÍCH HỢP DỊCH VỤ HOÀN TIỀN (REFUND)**

### **I. Ngữ cảnh** <a href="#ljo6zvvs2baa" id="ljo6zvvs2baa"></a>

#### **Mô tả tài liệu** <a href="#id-9w7upw7z9soe" id="id-9w7upw7z9soe"></a>

* Dịch vụ dành cho các đối tác nền tảng có nhu cầu tích hợp tính năng hoàn tiền cho KH sử dụng gói VietQR Pro.
* Dịch vụ cho phép khách hàng thực hiện việc hoàn tiền các giao dịch đã thanh toán bằng mã VietQR trực tiếp trên các nền tảng được tích hợp.
* Tài liệu cung cấp thông tin nghiệp vụ:
  * Hoàn tiền đối với giao dịch đã thanh toán
* Tài liệu này cung cấp thông tin kỹ thuật:
  * Thông tin bảo mật
  * Cấu hình kết nối dịch vụ hoàn tiền
  * Bộ API Services dịch vụ hoàn tiền.
* Thuật ngữ viết tắt:

<table data-header-hidden><thead><tr><th width="203"></th><th></th></tr></thead><tbody><tr><td><strong>Thuật ngữ</strong></td><td><strong>Chú thích nội dung</strong></td></tr><tr><td>ĐT</td><td>Đối tác</td></tr><tr><td>KH</td><td>Khách hàng, người dùng cuối của đối tác</td></tr><tr><td>TK/TKNH</td><td>Tài khoản/Tài khoản ngân hàng</td></tr><tr><td>LK</td><td>Liên kết</td></tr><tr><td>GD</td><td>Giao dịch</td></tr><tr><td>TT</td><td>Thanh toán</td></tr><tr><td>BĐSD</td><td>Biến động số dư</td></tr></tbody></table>

#### **Nghiệp vụ** <a href="#v0fr7smk6s58" id="v0fr7smk6s58"></a>

**2.1. Luồng nghiệp vụ**

![](/files/dgdflAmf37OhG8Ww3UCt)

*Ảnh 1. Khái quát luồng nghiệp vụ hoàn tiền sau khi thanh toán thành công VietQR*

<figure><img src="/files/NzTuDeARMu8mJggFyrID" alt=""><figcaption></figcaption></figure>

*Ảnh 2: Mô tả luồng nghiệp vụ hoàn tiền cho gói VietQR Pro*

**2.2. Mô tả luồng nghiệp vụ**

<table data-header-hidden><thead><tr><th width="151"></th><th width="117"></th><th width="88"></th><th></th></tr></thead><tbody><tr><td><strong>Bước</strong><br><strong>thực hiện</strong></td><td><strong>Người</strong><br><strong>thực hiện</strong></td><td><strong>Hệ thống</strong></td><td><strong>Mô tả</strong></td></tr><tr><td>Pre-condition</td><td>ĐT</td><td></td><td><p>- Đã khai báo kết nối đến hệ thống VietQR.<br>- Đã liên kết TK MBBank/BIDV trên hệ thống VietQR.</p><p>- Sử dụng gói VietQR Pro.</p></td></tr><tr><td>1</td><td>ĐT</td><td>VietQR</td><td>KH yêu cầu hoàn tiền sau khi đã thanh toán thành công và ghi nhận BĐSD</td></tr><tr><td>2</td><td>VietQR</td><td>ĐT</td><td><p>VietQR kiểm tra thông tin:</p><ul><li>Nếu thông tin không hợp lệ hoặc không khả dụng: VietQR báo lỗi nhận thông tin hoàn tiền không thành công</li><li>Nếu thông tin hợp lệ: Hệ thống VietQR tiến hành hoàn tiền</li></ul></td></tr><tr><td>3</td><td>VietQR</td><td>ĐT</td><td><p>VietQR tiến hành hoàn tiền:</p><ul><li>VietQR sẽ trả thông tin nếu hoàn tiền thành công</li><li>Người dùng cuối nhận được số tiền hoàn</li></ul></td></tr></tbody></table>

**2.3. Hoàn tiền**

* Dịch vụ hoàn tiền khả dụng cho các đối tác sử dụng gói dịch vụ **VietQR Pro.**
* ĐT sử dụng **API hoàn tiền** để hoàn tiền cho người dùng cuối.
  * Đối với mỗi giao dịch có thể hoàn tiền được nhiều lần và tổng số tiền hoàn luôn phải **bé hơn hoặc bằng** số tiền người dùng cuối đã thanh toán cho ĐT,
  * Số tiền còn lại trong TKNH của ĐT phải **lớn hơn** số tiền hoàn cho người dùng cuối.
* Hệ thống VietQR cần cung cấp **secret\_key** cho ĐT để ĐT có thể sử dụng dịch vụ hoàn tiền.

## **II. Thông tin kỹ thuật** <a href="#id-9bx34lr8zs3t" id="id-9bx34lr8zs3t"></a>

#### **Quy định về xác thực bảo mật** <a href="#noarbtz0rhsc" id="noarbtz0rhsc"></a>

* ĐT sử dụng **API Get Token** để lấy thông tin xác thực **Bearer Token**. Đoạn **Bearer Token** này dùng để gọi **API Hoàn tiền**.
* VietQR sẽ cung cấp 1 đoạn “**secretKey**” cho các ĐT để xác thực và mã hoá thông tin.
* Quy định mã hoá thông tin dựa vào “**secret\_key**”:
  * Secret Key: Liên hệ kỹ thuật VietQR để được cung cấp thông tin.
  * Đối với **API Hoàn tiền**, hệ thống yêu cầu field “**checkSum**” trong Request Body. Phía VietQR cung cấp thông tin để ĐT generate checksum:

| **API**         | **Quy định checksum**                                   |
| --------------- | ------------------------------------------------------- |
| API Hoàn tiền | MD5(secretKey + referenceNumber + amount + bankAccount) |

* Quy định về thông tin xác thực **Bearer Token**:
  * Thời gian hiệu lực: **300 giây**.
  * Đoạn **Bearer Token** đánh dấu thông tin khách hàng sử dụng dịch vụ thanh toán qua mã VietQR, được sử dụng trên hệ thống ĐT. Vì vậy, ĐT không thể sử dụng đoạn 1 Bearer Token cho tất cả các KH.

#### **Quy định về quy trình kết nối dịch vụ** <a href="#yrsk38w3p795" id="yrsk38w3p795"></a>

* ĐT và KH tuân thủ theo quy trình kết nối dịch vụ để đảm bảo hệ thống vận hành một cách hiệu quả nhất, giảm thiểu rủi ro không mong muốn.

## **III. Mô tả APIs** <a href="#y6ndvhlr36p6" id="y6ndvhlr36p6"></a>

#### **API Get Token:** <a href="#fu64uo3nsv4s" id="fu64uo3nsv4s"></a>

* URL: https\://\<vietqr-host>/\<basepath>/api/token\_generate
* Method: POST
* Mô tả:
  * API để lấy Bearer Token, sử dụng để xác thực cho các API khác liên quan đến việc hoàn tiền. Token có thời hạn là 300 giây (5 phút).
  * API yêu cầu sử dụng Basic Authentication. Gửi một yêu cầu HTTP với header Authorization chứa mã hóa base64 của username:password (do VietQR cung cấp)
* Authorization: Basic Authentication
* Request Body: Không.
* Response Body: JSON

| **Field**     | **Type** | **Description**                           |
| ------------- | -------- | ----------------------------------------- |
| access\_token | String   | Đoạn mã Bearer Token.                     |
| token\_type   | String   | Mặc định: Bearer.                         |
| expires\_in   | int      | Thời hạn của token, mặc định là 300 giây. |

#### **API Hoàn Tiền** <a href="#l3r6wttnijyw" id="l3r6wttnijyw"></a>

* URL: https\://\<vietqr-host>/\<basepath>/api/transaction/refund
* Method: POST
* Mô tả:
  * API này được sử dụng để yêu cầu hoàn tiền cho người dùng cuối của đối tác.
  * Khách hàng có thể yêu cầu hoàn lại tiền nhiều lần cho một giao dịch người dùng cuối đã thực hiện với điều kiện tổng số tiền được hoàn luôn **bé hơn hoặc bằng** số tiền người dùng cuối đã thanh toán.
  * API yêu cầu sử dụng **Bearer Token** để xác thực. Bearer Token có thể được lấy từ **API Get Token** như đã mô tả ở mục 1.
* Authorization: Bearer Token
* Request Body: JSON

<table data-header-hidden><thead><tr><th width="197"></th><th width="118"></th><th width="102"></th><th></th></tr></thead><tbody><tr><td><strong>Field</strong></td><td><strong>Type</strong></td><td><strong>Required</strong></td><td><strong>Description</strong></td></tr><tr><td>bankAccount</td><td>String</td><td>Có</td><td>TK ngân hàng của KH</td></tr><tr><td>referenceNumber</td><td>String</td><td>Có</td><td>Mã giao dịch của giao dịch cần hoàn tiền</td></tr><tr><td>amount</td><td>String</td><td>Có</td><td>Số tiền cần hoàn tiền cho end-user của KH</td></tr><tr><td>content</td><td>String</td><td>Có</td><td>Nội dung hoàn tiền</td></tr><tr><td>checkSum</td><td>String</td><td>Có</td><td>Mã checkSum MD5 (secretKey + referenceNumber + amount + bankAccount)</td></tr></tbody></table>

* Response Body: JSON
  * Trường hợp thành công:

| **Field** | **Type** | **Description**                  |
| --------- | -------- | -------------------------------- |
| status    | String   | SUCCESS: Hoàn tiền thành công |
| message   | String   | Mã giao dịch hoàn tiền       |

* * Trường hợp khác:

| **Field** | **Type** | **Description**                                |
| --------- | -------- | ---------------------------------------------- |
| status    | String   | FAILED: Có lỗi trong quá trình thực hiện |
| message   | String   | Mã lỗi                                       |

* Bảng mã lỗi:

<table data-header-hidden><thead><tr><th></th><th width="390"></th><th></th></tr></thead><tbody><tr><td><strong>Message</strong></td><td><strong>Description</strong></td><td><strong>Status</strong></td></tr><tr><td>&#x3C;Mã giao dịch></td><td>Thành công</td><td>200</td></tr><tr><td>E05</td><td>Lỗi không xác định</td><td>400</td></tr><tr><td>E41</td><td>Checksum không hợp lệ</td><td>400</td></tr><tr><td>E42</td><td>Tài khoản của KH không có quyền hoàn tiền</td><td>400</td></tr><tr><td>E43</td><td>Hoàn tiền không thành công</td><td>400</td></tr><tr><td>E44</td><td>Mã giao dịch của giao dịch không tồn tại</td><td>400</td></tr><tr><td>E45</td><td>Số tiền refund không hợp lệ</td><td>400</td></tr><tr><td>E46</td><td>Request Body không hợp lệ</td><td>400</td></tr><tr><td>E74</td><td>Invalid token</td><td>400</td></tr><tr><td>E77</td><td>Tài khoản ngân hàng không thuộc quản lý của đại lý</td><td>400</td></tr><tr><td>E104</td><td>Không tìm thấy thông tin đại lý của ĐT</td><td>400</td></tr></tbody></table>

### **IV. Bảng mã lỗi** <a href="#id-9hbrnld8rs54" id="id-9hbrnld8rs54"></a>

<table data-header-hidden><thead><tr><th width="170"></th><th width="516"></th><th></th></tr></thead><tbody><tr><td><strong>Message</strong></td><td><strong>Description</strong></td><td><strong>Status</strong></td></tr><tr><td>&#x3C;Mã giao dịch></td><td>Thành công</td><td>200</td></tr><tr><td>E05</td><td>Lỗi không xác định</td><td>400</td></tr><tr><td>E41</td><td>Checksum không hợp lệ</td><td>400</td></tr><tr><td>E42</td><td>Tài khoản của KH không có quyền hoàn tiền</td><td>400</td></tr><tr><td>E43</td><td>Hoàn tiền không thành công</td><td>400</td></tr><tr><td>E44</td><td>Mã giao dịch của giao dịch không tồn tại</td><td>400</td></tr><tr><td>E45</td><td>Số tiền refund không hợp lệ</td><td>400</td></tr><tr><td>E46</td><td>Request Body không hợp lệ</td><td>400</td></tr><tr><td>E74</td><td>Invalid token</td><td>400</td></tr><tr><td>E77</td><td>Tài khoản ngân hàng không thuộc quản lý của đại lý</td><td>400</td></tr><tr><td>E104</td><td>Không tìm thấy thông tin đại lý của ĐT</td><td>400</td></tr></tbody></table>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doc.vietqr.vn/doc/api-vietqr-callback/api-refund-transaction.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
