Các lỗi kỹ thuật thường gặp trong quá trình phát triển Zalo Mini App
Bài viết này tổng hợp các lỗi kỹ thuật thường gặp nhất trong quá trình phát triển Zalo Mini App để các lập trình viên có thể tra cứu và xử lý chúng:
1. Network Error
Đây là lỗi thường gặp nhất do nhu cầu gọi API (thông qua axios
/fetch
) từ Mini App đến Server của doanh nghiệp là rất phổ biến. Các nguyên nhân có thể dẫn đến lỗi trên bao gồm:
- CORS (phổ biến nhất)
- Gọi API không có
https://
. - Domain API hết hạn SSL.
- Custom header không được phép do có Access-Control-Allow-Headers
- Lỗi mạng khác (do thiết bị/do server)
1.1. CORS
Dấu hiệu để nhận biết lỗi CORS là khi bạn có thể gọi API thành công bằng Postman/cURL/localhost nhưng lại thất bại trên Zalo Mini App.
Mặc dù hay gọi là lỗi, nhưng thật ra đây là một cơ chế bảo mật của các trình duyệt web.
Để fix lỗi CORS, Server cần phải trả về response có chứa header Access-Control-Allow-Origin
với giá trị là origin của Mini App, cụ thể là:
- https://h5.zdn.vn
- zbrowser://h5.zdn.vn
Mình xin nhấn mạnh là lỗi này cần fix ở Server. Những thông tin như "lỗi báo ở Mini App thì cần phải fix ở phía Mini App", hoặc "CORS là một cơ chế riêng do Zalo Mini App tự áp dụng", là không chính xác.
Một số biến thể khác của CORS bao gồm:
Nội dung lỗi | Nguyên nhân | Cách xử lý |
---|---|---|
Response to preflight request doesn't pass access control check | Lỗi này xảy ra khi bạn đã thiết lập CORS cho request chính nhưng chưa thiết lập CORS cho request tiền tố (preflight request). | Để khắc phục lỗi này khá đơn giản, bạn chỉ cần trả header Access-Control-Allow-Origin theo logic tương tự cho method OPTIONS . Tài liệu này có thể giúp bạn hiểu rõ hơn về khái niệm của preflight request cũng như cách mà CORS hoạt động. |
Access-Control-Allow-Origin cannot contain more than one origin | Lỗi này xảy ra khi bạn thiết lập header Access-Control-Allow-Origin với nhiều giá trị cùng một lúc. | Code mẫu để thiết lập CORS hợp lý bạn có thể xem qua ở đây. |
Ví dụ cụ thể:
❌ Không hợp lệ: Không trả về header Access-Control-Allow-Origin
.
❌ Không hợp lệ: Chỉ trả về header Access-Control-Allow-Origin
cho method GET/POST/PUT/DELETE, nhưng không trả về cho method OPTIONS.
❌ Không hợp lệ: trả về nhiều origin cách nhau bởi dấu phẩy:
Access-Control-Allow-Origin: https://h5.zdn.vn,zbrowser://h5.zdn.vn,http://localhost:3000
✅ Hợp lệ: kiểm tra origin từ request và chỉ trả về một giá trị tương ứng:
Access-Control-Allow-Origin: https://h5.zdn.vn # Gọi từ https://
Access-Control-Allow-Origin: zbrowser://h5.zdn.vn # Gọi từ zbrowser://
Access-Control-Allow-Origin: http://localhost:3000 # Gọi từ localhost:3000
1.2. Gọi API không có domain, không có https://
hoặc domain hết hạn SSL
Mini App khi chạy trên Zalo sẽ được chạy trong một Secure Context, nên việc gọi các API như trên sẽ không thành công do cơ chế bảo mật.
❌ Không hợp lệ:
fetch("https://118.63.103.143:443");
fetch("http://my-server.com/api");
✅ Hợp lệ:
fetch("https://my-server.com/api");
2. Minified React error #<mã lỗi>
Khi bạn gặp những lỗi dạng này, điều đó có nghĩa là code React của bạn đang có vấn đề ở đâu đó (chẳng hạn như dùng hooks không đúng quy tắc, set lại state trong lúc render, hoặc render những component không hợp lệ,...). Lý do bạn nhìn thấy những lỗi như này là vì React đã lược bỏ hết những nội dung lỗi chi tiết và map chúng với các mã lỗi khi bạn build ứng dụng để giảm kích thước và tăng performance cho ứng dụng của bạn. Nên bây giờ bạn cần phải nhấn vào link bên trong mã lỗi (đoạn ở giữa "...visit <link> for the full message or...") để xem nội dung chi tiết của lỗi đó, từ đó tìm cách khắc phục tương ứng.
3. Hình ảnh không hiển thị
Việc đặt một file hình ảnh (chẳng hạn như coffee.jpg
) ở một folder nào đó bên trong source code (chẳng hạn như public
) rồi sử dụng nó trong thẻ img như thế này có thể sẽ hoạt động khi bạn đang phát triển ứng dụng trên localhost
, nhưng sẽ không hoạt động trên Zalo Mini App thật sự.
❌ Không hợp lệ:
<img src="/coffee.jpg" />
// hoặc
<img src="../public/coffee.jpg" />
Thay vào đó, bạn cần phải sử dụng syntax import để Vite chủ động tìm đến các hình ảnh này và đóng gói nó theo source code ứng dụng của bạn. Ví dụ,
✅ Hợp lệ:
import coffee from "./coffee.jpg";
<img src={coffee} />;
4. Gọi các API Server-Server từ Mini App
Một vài API được thiết kế để gọi từ phía Server của bạn sang Server của Zalo, cụ thể:
- Decode token ra số điện thoại/vị trí
- Gửi thông báo đến người dùng
- Tất cả các API trong nhóm OpenAPI
- Một số API trong nhóm CheckoutSDK (
getOrderStatus
,updateOrderStatus
)
Đặc điểm chung của các API này là cần phải truyền theo private key hoặc app secret. Nên việc gọi các API này từ Mini App là một lỗ hổng bảo mật lớn, cũng như sẽ không hoạt động trong một số trường hợp do các cơ chế như CORS hoặc chặn IP.
Cách duy nhất để fix c ác lỗi này là mang những logic gọi API ra khỏi Mini App và implement ở phía Server của bạn.
5. API được gọi thành công nhưng không có dữ liệu trong quá trình phát triển
Trong quá trình phát triển ứng dụng sử dụng Zalo Mini App Studio/Extension/CLI, trình duyệt hoặc simulator chỉ có thể giúp bạn xem giao diện của Mini App, chứ không giúp bạn tích hợp được các flow như getAccessToken
hoặc createOrder
, vì các flow này yêu cầu ứng dụng của bạn phải được chạy bên trong môi trường thật của Zalo Mini App (bên trong ứng dụng Zalo).
Chế độ Device có thể giúp Mini App đang chạy bên trong ứng dụng Zalo chạy code từ server hot reload đang chạy trên máy tính của bạn, từ đó bạn sẽ có thể gọi được các API này thành công và nhận được dữ liệu thật:

6. Lỗi trên bản Live nhưng không biết do đâu
Hiện tại có hai cách để xem nội dung lỗi chi tiết trên phiên bản Live của Mini App của bạn:
- Cách 1: Thêm param
zDebug=true
vào deeeplink của ứng dụng của bạn. Ví dụ:https://zalo.me/s/194839900003483517/?zDebug=true
, khi đó icon Debug sẽ hiển thị kể cả trên phiên bản Live, từ đó bạn có thể xem Console logs, Network requests, Element inspector và sử dụng nhiều tính năng gỡ lỗi khác:

- Cách 2: Kết nối thiết bị Android qua cáp USB và sử dụng Google Chrome để gỡ lỗi. Cách này có thể giúp bạn xem được mã lỗi một cách triệt để hơn, cũng như sử dụng được các công cụ debug nâng cao như Profiling, Breakpoints,...
7. Lỗi chỉ xảy ra với người dùng ngoài tập Developer/Admin
Nếu như ứng dụng của bạn có sử dụng các API như:
getPhoneNumber
getLocation
openMediaPicker
requestCameraPermission
keepScreen
- Nhóm API Native Storage
thì bạn cần phải xin Cấp quyền sử dụng các API này cho Mini App ID của bạn (ở Bước 1 trong lúc gửi xét duyệt phiên bản, hoặc mục Quản lý > Quản lý quyền). Việc không xin các quyền này sẽ gây ra lỗi khi người dùng ngoài tập Developer/Admin sử dụng Mini App của bạn. Riêng đối với người dùng là Developer/Admin của Mini App, để phục vụ cho việc tích hợp, tất cả những API trên đều có thể được sử dụng.
8. Trang này không tìm thấy hoặc không hợp lệ. Xin lỗi vì sự bất tiện này.
Lỗi này xảy ra khi bạn mở một phiên bản thử nghiệm (Development/Testing) của Mini App bằng một tài khoản Zalo không phải là Developer/Admin của ứng dụng.
Để khắc phục lỗi này, bạn chỉ cần:
- Đăng nhập lại bằng một tài khoản có trong tập Developer/Admin.
- Hoặc sử dụng phiên bản đang Live của Mini App.
9. Ứng dụng đang trong giai đoạn phát triển, vui lòng thử lại sau!
Lỗi này xảy ra khi bạn mở một phiên bản Live của Mini App đang trong giai đoạn phát triển (chưa có bản Live).