# Refund giao dịch

## Giới thiệu dịch vụ

Dịch vụ **Hoàn lại giao dịch (Refund)** cho phép merchant trả lại số tiền/điểm mà người dùng đã thanh toán qua ví VinID Pay.

Merchant có thể thực hiện hoàn lại một phần hoặc toàn bộ giá trị của giao dịch tùy thuộc vào nghiệp vụ của mình. Người dùng sẽ được thông báo trên ứng dụng VinID về số tiền/điểm mà merchant hoàn trả.

VinID Pay cung cấp dịch vụ Refund thông qua 2 phương thức sử dụng:

* User Frontend (Merchant Site/Merchant App): merchant đăng nhập bằng tài khoản merchant vào trang web/ ứng dụng của VinID cung cấp để hoàn tiền cho giao dịch. [*Xem hướng dẫn tại đây*](https://developers.vinid.net/tai-lieu-tich-hop/dich-vu-thanh-toan-vinid-pay/pages/-M2mB48kuhRVP7TysZa6#Hướng-dẫn-tra-cứu-giao-dịch-trên-Merchant-Site)
* Backend-to-Backend: merchant tích hợp kết nối hệ thống thanh toán của VinID và sử dụng API để yêu cầu hoàn tiền cho giao dịch.

{% hint style="info" %}
**Lưu ý**

* Hiện tại chỉ có thể refund trong kỳ (được hiểu là giao dịch gốc diễn ra vào ngày T và giao dịch refund diễn ra trong khoảng thời gian từ 00:00 ngày T đến hết 09:09:59 AM ngày T+1).
* Không cho phép refund các giao dịch có khuyến mãi như sử dụng voucher, giao dịch có cashback, hoặc ưu đãi giảm giá khi thanh toán của VinID ….
* Đối với các giao dịch thanh toán qua hình thức MerchantQR thì merchant cần sử dụng Merchant Site/Merchant App để thực hiện refund.
  {% endhint %}

## Luồng người dùng

1. User thực hiện trả lại mặt hàng đã mua tại Merchant
2. Merchant tạm giữ lại hàng và gửi yêu cầu refund giao dịch tới VinID
3. VinID kiểm tra yêu cầu của Merchant:

   a. Nếu các thông tin yêu cầu hợp lệ, VinID sẽ thực hiện refund theo yêu cầu của Merchant

   b. Nếu các thông tin yêu cầu không hợp lệ, VinID sẽ từ chối yêu cầu và báo lỗi cho Merchant.
4. VinID thông báo kết quả xử lý refund cho Merchant
5. Dựa vào kết quả phản hồi của VinID, Merchant đưa ra quyết định việc trả hàng của User.

## APIs

## Refund

<mark style="color:green;">`POST`</mark> `{API-HOST}/merchant-integration/v1/orders/refund`

Tạo yêu cầu refund giao dịch

#### Request Body

| Name                                                                                                   | Type   | Description                                                                                           |
| ------------------------------------------------------------------------------------------------------ | ------ | ----------------------------------------------------------------------------------------------------- |
| order\_reference\_id                                                                                   | string | <p>Mã định danh đơn hàng hoàn tiền tại merchant. <br>Cần unique trên mỗi request, tối đa 35 ký tự</p> |
| original\_order\_reference\_id                                                                         | string | <p>Mã định danh đơn hàng gốc cần refund.                                                              |
| <br>(Là giá trị <code>order\_reference\_id</code> mà merchant truyền sang VinID khi tạo giao dịch)</p> |        |                                                                                                       |
| description                                                                                            | string | Mô tả lý do của việc refund                                                                           |
| merchant\_user\_id                                                                                     | string | Mã nhân viên của merchant thực hiện hoàn tiền.                                                        |
| merchant\_user\_name                                                                                   | string | Tên nhân viên của merchant thực hiện hoàn tiền.                                                       |
| vnd\_amount                                                                                            | number | <p>Số tiền muốn hoàn lại cho khách hàng. <br>Giá trị phải nguyên lớn hơn 0</p>                        |
| point\_amount                                                                                          | number | <p>Số điểm muốn hoàn lại cho khách hàng.<br>Giá trị phải nguyên lớn hơn 0</p>                         |

{% tabs %}
{% tab title="200 " %}
{% tabs %}
{% tab title="200" %}
{% code title="Hoàn tiền thành công" %}

```
{
    "meta": {
        "code": 200,
        "string": "OK"
    },
    "data": {
        "original_loyalty_transaction_id": "string",
        "refund_transaction_id": "string",
        "refund_loyalty_transaction_id": "string",
        "refund_transaction_wallet_id": "string"
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="2000801" %}
{% code title="GD thanh toán tiền lẫn điểm. Refund tiền thành công, điểm thất bại" %}

```
{
    "meta": {
        "code": 2000801,
        "message": "Refund thành công. Khách hàng đã nhận lại tiền. Phần điểm hoàn lại sẽ được cập nhật trong thời gian sớm nhất."
    },
    "data": {
        "refund_transaction_id": "string",
        "refund_transaction_wallet_id": "string",
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="2000802" %}
{% code title="GD thanh toán tiền lẫn điểm. Refund tiền thất bại, điểm thành công" %}

```
{
    "meta": {
        "code": 2000802,
        "message": "Refund thành công. Khách hàng đã nhận lại điểm. Phần tiền hoàn lại sẽ được cập nhật trong thời gian sớm nhất"
    },
    "data": {
        "original_loyalty_transaction_id": "string",
        "refund_loyalty_transaction_id": "string",
        "refund_transaction_wallet_id": "string"
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="4004009" %}
{% code title="GD chỉ thanh toán bằng tiền. Yêu cầu vượt quá số tiền có thể refund" %}

```
{
    "meta": {
        "code": 4004009,
        "message": "Số tiền có thể refund còn lại không đủ"
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="4000812" %}
{% code title="GD chỉ thanh toán bằng tiền. Yêu cầu refund truyền vào cả giá trị điểm" %}

```
{
    "meta": {
        "code": 4000812,
        "message": "Giao dịch gốc không được thanh toán bằng điểm"
    }
}
```

{% endcode %}
{% endtab %}
{% endtabs %}
{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Lưu ý**

* Nếu merchant không chỉ định giá trị cụ thể cho`vnd_amount`và`point_amount`thì không truyền hoặc truyền `null.`Nếu truyền 0 sẽ báo lỗi. Trường hợp cả 2 tham số đều không được chỉ định thì VinID sẽ thực hiện refund toàn phần cho giao dịch.
* Hiện tại chỉ cho phép refund toàn phần điểm. Vì vậy nếu muốn refund điểm thì merchant cần truyền vào chính xác số điểm mà người dùng đã tiêu trong giao dịch gốc.
* Thời gian timeout khi gọi API refund tối thiểu là 25s để đảm bảo nhận được response từ VinID
  {% endhint %}

## Mã lỗi

| Mã lỗi  | Thông báo                                                                                                    |
| ------- | ------------------------------------------------------------------------------------------------------------ |
| 200     | OK                                                                                                           |
| 2000801 | Refund thành công. Khách hàng đã nhận lại tiền. Phần điểm hoàn lại sẽ được cập nhật trong thời gian sớm nhất |
| 2000802 | Refund thành công. Khách hàng đã nhận lại điểm. Phần tiền hoàn lại sẽ được cập nhật trong thời gian sớm nhất |
| 4000001 | Dữ liệu không hợp lệ                                                                                         |
| 4000800 | Mã đơn hàng gốc không tồn tại                                                                                |
| 4000801 | Giao dịch gốc không phải là payment                                                                          |
| 4000802 | Giao dịch gốc không thành công                                                                               |
| 4000803 | Giao dịch gốc có khuyến mãi                                                                                  |
| 4000804 | Giao dịch gốc đã cashback                                                                                    |
| 4000807 | Giao dịch gốc không phải DIRECT PAY hoặc QR PAYMENT                                                          |
| 4000809 | Số tiền còn lại không đủ thực hiện giao dịch                                                                 |
| 4000810 | Currency không đúng với giao dịch gốc                                                                        |
| 4000811 | Số tiền refund phải là số nguyên dương                                                                       |
| 4000812 | Giao dịch gốc không được thanh toán bằng điểm                                                                |
| 4000813 | Điểm loyalty không trùng với giao dịch gốc                                                                   |
| 4000817 | Merchant không được thiết lập refund tự động                                                                 |
| 4000820 | Giao dịch đã quá thời hạn có thể refund                                                                      |
| 4000824 | Thiếu thông tin mã giao dịch gốc                                                                             |
| 4030800 | Merchant không được phép thực hiện hoàn tiền                                                                 |
| 4040800 | Giao dịch gốc không tồn tại trên core ví                                                                     |
| 4040801 | Giao dịch gốc không tồn tại                                                                                  |
| 4080804 | Quá thời hạn kết nối                                                                                         |
| 4090801 | Mã đơn hàng đã tồn tại                                                                                       |
| 5000800 | Refund thất bại                                                                                              |
| 5000801 | Hệ thống xảy ra lỗi khi xử lý yêu cầu                                                                        |
| 5000802 | Hệ thống xảy ra lỗi khi xử lý yêu cầu                                                                        |

Thông tin thêm:

* [API Host](/tai-lieu-tich-hop/moi-truong-tich-hop.md#api-host)
* [Mã lỗi chung](/tai-lieu-tich-hop/bang-ma-loi.md)


---

# 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://developers.vinid.net/tai-lieu-tich-hop/dich-vu-thanh-toan-vinid-pay/refund-giao-dich.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.
