# Giới thiệu

* Webhooks giúp bạn đăng kí lắng nghe các sự kiện phát sinh từ hệ thống của Nhanh.vn, VD:
  * Khi có đơn hàng mới, khi đơn gửi sang hãng vận chuyển, khi đơn hàng thay đổi trạng thái.
  * Khi có sản phẩm mới, khi có cập nhật sản phẩm, khi xóa sản phẩm.
  * Khi có hóa đơn bán hàng mới.
  * Khi có phiếu bảo hành mới.

## Bật webhooks

* Vào [danh sách ứng dụng](https://pos.open.nhanh.vn/apps), click vào tên ứng dụng để vào trang chi tiết.
* Click sửa ứng dụng, kéo xuống mục webhooks:
  * Tích chọn Bật webhooks.
  * Điền Webhooks callback URL (bắt buộc chạy https và response http code = 200 và hỗ trợ POST method, Nhanh API sẽ bắn sang POST, không dùng GET).
  * Điền Webhooks verify token (giá trị này do bạn tự điền, Nhanh API sẽ gửi kèm webhooksVerifyToken khi bắn webhooks để bạn có thể xác minh dữ liệu là từ Nhanh API bắn sang).
  * Chọn các sự kiện muốn đăng kí nhận webhooks và nhấn Lưu.

![Bật Webhooks](https://40622576-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhIoEj3yOAgRRsZcqGM-887967055%2Fuploads%2Fgit-blob-156de3b0d626064ff23817cc755d3c9d006ae09f%2FwebhooksVerifyToken.png?alt=media\&token=1c68624e-4242-4da3-ae9b-012a14d87088)

{% hint style="danger" %}
**Chú ý**: Bạn chỉ nên bật webhooks và điền **Webhooks callback URL** khi bạn đã có link này, không để link liên tục ở tình trạng lỗi (301, 302, 403, 404, 500...) để tránh bị tắt webhooks hoặc khóa app.
{% endhint %}

* Nhanh API sẽ gửi request **webhooksEnabled** tới Webhooks callback URL của bạn để kiểm tra xem URL này có hoạt động hay không.

```javascript
{
    "event":"webhooksEnabled", // Sự kiện khi bật webhooks
    "webhooksVerifyToken":"YOUR_WEBHOOKS_VERIFY_TOKEN", // Webhooks verify token điền trong app của bạn
    "data": {
        "registeredEvents": { // Các events đã đăng kí
	    "101":"productAdd",
	    "102":"productUpdate",
	    "110":"inventoryChange",
	    "202":"orderUpdate"
	}
    }
}
```

## Nhận webhooks

* Với mỗi sự kiện Nhanh.vn sẽ gửi sang 1 request có Content type: **application/json** và request body là **json string**.
* VD với sự kiện bật webhooks lên, Nhanh Open API sẽ bắn sang link webhooks của bạn 1 request như sau:

![Event: Webhooks enabled](https://40622576-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhIoEj3yOAgRRsZcqGM-887967055%2Fuploads%2Fgit-blob-6a865247c77f9485b00b7871f78224ae0170aa4b%2FwebhooksEnabledEvent.jpg?alt=media)

```curl
curl --location --request POST 'https://webhook.site/a1f7177c-f622-4570-b420-ddf79f3b83e9' \
--header 'Content-Type: application/json' \
--data-raw '{
    	"event":"webhooksEnabled",
	"webhooksVerifyToken":"YOUR_WEBHOOKS_VERIFY_TOKEN",
	"data": {
		"registeredEvents": {
			"101":"productAdd",
			"102":"productUpdate",
			"110":"inventoryChange",
			"202":"orderUpdate"
		}
	}
}'
```

### Webhooks data

```javascript
{
    "event": "orderAdd", // Sự kiện khi có đơn hàng mới
    "businessId": bigint,
    "webhooksVerifyToken": string,
    "data": {
        // order's information
        "customerName": string,
        "customerMobile": string,
        ...
        // order product's information
        "products": [
        
        ]
    }
}
```

* event: (string) Tên sự kiện:

| Event           | Description                                                                                                                                                                         |
| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| webhooksEnabled | Sự kiện khi bạn bật webhooks hoặc NhanhAPI kiểm tra webhooks của bạn có còn hoạt động hay không (thường dùng khi tỉ lệ phản hồi response webhooks của bạn có tỉ lệ thành công thấp) |
| productAdd      | Thêm sản phẩm mới                                                                                                                                                                   |
| productUpdate   | Cập nhật sản phẩm                                                                                                                                                                   |
| productDelete   | Xóa sản phẩm                                                                                                                                                                        |
| inventoryChange | Thay đổi tồn kho của sản phẩm                                                                                                                                                       |
| orderAdd        | Thêm đơn hàng mới                                                                                                                                                                   |
| orderUpdate     | Cập nhật đơn hàng                                                                                                                                                                   |
| orderDelete     | Xóa đơn hàng                                                                                                                                                                        |
| paymentReceived | Đơn hàng hoặc hóa đơn bán hàng (bán lẻ, bán sỉ) nhận được thanh toán từ MoMo hoặc chuyển khoản ngân hàng                                                                            |

* businessId: (bigint) ID doanh nghiệp trên nhanh.vn, dùng khi ứng dụng của bạn tích hợp cho nhiều doanh nghiệp, thì businessId giúp phân biệt dữ liệu của doanh nghiệp nào.
  * Sự kiện **webhooksEnabled** sẽ **không có businessId**.
* webhooksVerifyToken: (string) Key xác minh khi nhận dữ liệu, tương ứng với webhooks verify token trong app của bạn.
* data: (json string) Dữ liệu của sự kiện này.

### Webhooks response

* Hệ thống của bạn cần response http code 200 để NhanhAPI xác nhận bạn đã xử lý thành công.
* Nếu hệ thống của bạn không phản hồi quá chậm, hoặc http code != 200, webhooks sẽ được bắn lại tối đa 3 lần.
  * Khi app của bạn xử lý webhooks chậm hoặc hay lỗi, Nhanh.vn sẽ đẩy độ ưu tiên cho app của bạn xuống thấp, các request webhooks tiếp theo có thể sẽ bị delay.
  * Khuyến cáo bạn nên lưu webhooks và response cho Nhanh.vn trước, rồi tạo cronjob xử lý webhooks sau.
* Nếu hệ thống của bạn xử lý webhooks với **tỉ lệ thành công thấp**, tùy mức độ, NhanhAPI sẽ có thể:
  * Gọi lại sự kiện webhooksEnabled để kiểm tra link webhooks của bạn có hoạt động hay không.
  * Tắt webhooks của app: Bạn cần làm lại các bước bật webhooks như đã mô tả ở trên để mở lại webhooks.
  * Khóa app: Bạn cần liên hệ với đội kĩ thuật của Nhanh.vn qua email <dev@nhanh.vn> để được mở lại app.

## Lỗi thường gặp

* Khi nhận webhooks từ Nhanh.vn bắn sang, bạn có thể gặp phải các tình huống lỗi, xem chi tiết lỗi và cách khắc phục bên dưới:

{% hint style="danger" %}
**Chú ý**: Webhooks sẽ chỉ bắn với các dữ liệu mới, các dữ liệu quá khứ (phát sinh trước thời điểm app được cấp quyền hoặc bật webhooks) sẽ không có sự kiện bắn lại.
{% endhint %}

### App chưa được cấp quyền

* Khi bạn bật được webhooks lên và nhận được sự kiện **webhooksEnabled**, đây chỉ là webhooks test của hệ thống.
* Để nhận được webhooks của doanh nghiệp, thì app của bạn cần được 1 tài khoản thuộc doanh nghiệp đó đăng nhập cấp quyền cho ứng dụng của bạn và bạn cần lấy được accessToken. Xem các bước khởi tạo ứng dụng và đăng nhập cấp quyền [tại đây](https://apidocs.nhanh.vn/v2/readme#lay-access-token).
* Ở các trang như chi tiết đơn hàng, chi tiết sản phẩm... sẽ có 1 tab API lưu lại tất cả lịch sử nhận API request và gửi webhooks, xin vui lòng kiểm tra kĩ dữ liệu trước khi báo lỗi. VD bạn có thể tạo 1 đơn hàng mới, hoặc cập nhật trạng thái đơn hàng, sau đó xem trang chi tiết đơn hàng sẽ có 1 tab API, bạn có thể xem nội dung webhooks Nhanh bắn sang cho app của bạn.

### Connection timed out

* Lỗi này có thể do nhiều nguyên nhân:
  * Tên miền không hoạt động.
  * Server của bạn bị lỗi hoặc phản hồi quá chậm.
  * Firewall của bạn chặn các request từ Nhanh API.

### Postman Automatically follow redirects

Khi bạn test bằng Postman, mặc định Postman sẽ bật "Automatically follow redirects", bạn cần tắt cài đặt này đi, nếu không khi tự test sẽ thấy http code trả về 200 nhưng thực tế đang trả về 301 / 302. Có 2 cách tắt:

* **Cách 1**: Tắt cho toàn bộ request: Vào menu File > Settings > Tắt: Automatically follow redirects

![Postman: Tắt toàn bộ Automatically follow redirects](https://40622576-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhIoEj3yOAgRRsZcqGM-887967055%2Fuploads%2Fgit-blob-490dfe91010074c81728de12bbddcd9724c506cf%2FwebhooksPostmanSettings_TurnOffFollowLocation_All.jpg?alt=media)

* **Cách 2**: Tắt từng tab request: chọn Settings và tắt Automatically follow redirects

![Postman: Tắt từng tab Automatically follow redirects](https://40622576-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MhIoEj3yOAgRRsZcqGM-887967055%2Fuploads%2Fgit-blob-15521f9e6209ccac8b35985955b20ecccfc62ef1%2FwebhooksPostmanSettings_TurnOffFollowLocation_Tab.jpg?alt=media)

### Wordpress plugin Wordfence

* Nếu bạn dùng **Wordpress** và có cài plugin [Wordfence](https://www.wordfence.com/help/blocking/troubleshooting/#what-is-wordfence) thì có thể bị lỗi trả về http code 503 và không bật được webhooks hoặc nhận webhooks từ Nhanh.vn bắn sang bị chập chờn.
* Cách khắc phục: Gỡ plugin này khỏi Wordpress.

### Lỗi mất webhooks

* Tình huống: Trước đó bạn đã cài đặt và sử dụng webhooks bình thường, sau đó webhooks ngừng bắn hoàn toàn.
* Nguyên nhân: Lỗi này thường là do appId đã bị doanh nghiệp gỡ, hoặc accessToken đã hết hạn.
* Cách kiểm tra: Doanh nghiệp có thể vào Nhanh.vn, mục Cài đặt > [Cài đặt chung](https://nhanh.vn/setting/store/index) > Cài đặt Open API để kiểm tra xem có còn kết nối với appId không. Nếu không còn, bạn có thể hướng dẫn doanh nghiệp thực hiện lại việc đăng nhập cấp quyền.
* Chú ý: accessToken chỉ có hạn sử dụng 1 năm, khi gần hết hạn, bạn nên báo doanh nghiệp cấp quyền để lấy accessToken mới.
