Skip to content

Cách build Mini App đơn giản nhất ​

Adapt cho VN — Zalo Mini App

Bài gốc viết về WeChat Mini Program (thị trường Trung Quốc, không phổ biến VN). Tôi đã adapt sang Zalo Mini App — equivalent của WeChat cho VN với 75M+ user.

Cả 2 platform có concept tương tự: framework JS-based, render UI từ JSON config + JS logic, deploy lên platform owner (Tencent/Zalo) qua web-based IDE.

Nếu bạn vẫn cần dev WeChat Mini Program cho thị trường TQ, xem tài liệu official WeChat.

Zalo Mini App là gì? ​

Zalo Mini App là "app nhỏ" chạy trong Zalo, user không cần download install. Mở qua:

  • Scan QR code
  • Search trong Zalo
  • Click link share

Lợi:

  • 75M+ MAU Zalo VN
  • Zero install friction
  • Tích hợp ZaloPay native
  • Tích hợp Zalo OA (chat business)
  • Việt-hoá tốt

Nhược:

  • Chỉ chạy trong Zalo
  • Function hạn chế (không full hardware access)
  • Phải qua review của Zalo

Use case phù hợp ​

  • Booking dịch vụ (salon, sửa xe, lịch hẹn bác sĩ)
  • E-commerce nhỏ
  • Loyalty/membership card
  • Local service finder
  • Mini game
  • Form survey

Roadmap tutorial ​

Build "Hello World" Zalo Mini App từ 0:

  1. Đăng ký Zalo Developer
  2. Cài Zalo Mini App Studio
  3. Tạo project mới
  4. UI cơ bản
  5. Logic + ZaloPay integration
  6. Preview trên Zalo
  7. Publish

Chương 1: setup ​

1.1 Đăng ký Zalo Developer ​

  1. Truy cập https://developers.zalo.me/
  2. Đăng nhập với Zalo account
  3. "Create app" → fill thông tin
  4. Lấy App ID

1.2 Cài Zalo Mini App Studio ​

Tool dev official từ Zalo:

bash
# Cài Node 18+
npm install -g zmp-cli

# Verify
zmp --version

Hoặc download IDE: https://mini.zalo.me/devtools/

1.3 Tạo project ​

bash
zmp create my-first-app
cd my-first-app
zmp start

Project structure:

my-first-app/
├── app-config.json      # Config app
├── src/
│   ├── app.tsx          # Entry
│   ├── pages/           # Pages
│   ├── components/      # Components
│   └── css/             # Styles
├── public/
└── package.json

Chương 2: UI cơ bản ​

2.1 app-config.json ​

json
{
  "app": {
    "title": "My First App",
    "headerColor": "#4F46E5",
    "textColor": "white",
    "statusBarStyle": "light"
  },
  "listCSS": ["app.css"],
  "listSyncJS": [],
  "pages": [
    {
      "name": "home",
      "title": "Trang chủ",
      "path": "/pages/home/index.tsx"
    },
    {
      "name": "about",
      "title": "Giới thiệu",
      "path": "/pages/about/index.tsx"
    }
  ],
  "template": {
    "navigationBar": {
      "type": "fixed",
      "color": "#4F46E5"
    }
  },
  "tabBar": {
    "color": "#888",
    "selectedColor": "#4F46E5",
    "list": [
      { "iconPath": "icons/home.png", "selectedIconPath": "icons/home-active.png", "pageName": "home", "text": "Home" },
      { "iconPath": "icons/about.png", "selectedIconPath": "icons/about-active.png", "pageName": "about", "text": "About" }
    ]
  }
}

2.2 Home page ​

src/pages/home/index.tsx:

tsx
import React, { useState } from "react";
import { Box, Button, Header, Page, Text } from "zmp-ui";
import { authorize, getUserInfo } from "zmp-sdk/apis";

const HomePage: React.FunctionComponent = () => {
  const [userName, setUserName] = useState<string>("");
  
  const handleGetUserInfo = async () => {
    try {
      // Request permission
      await authorize({ scopes: ["scope.userInfo"] });
      // Get user info
      const { userInfo } = await getUserInfo({});
      setUserName(userInfo.name);
    } catch (err) {
      console.error(err);
    }
  };
  
  return (
    <Page className="page">
      <Header title="Trang chủ" />
      <Box flex flexDirection="column" alignItems="center" p={4}>
        <Text size="xLarge" bold>
          Chào mừng {userName || "bạn"} đến với Zalo Mini App!
        </Text>
        <Box mt={4}>
          <Button onClick={handleGetUserInfo}>
            Lấy thông tin user
          </Button>
        </Box>
      </Box>
    </Page>
  );
};

export default HomePage;

2.3 About page ​

tsx
import React from "react";
import { Box, Header, Page, Text } from "zmp-ui";

const AboutPage = () => (
  <Page>
    <Header title="Giới thiệu" />
    <Box p={4}>
      <Text size="large" bold>Về app</Text>
      <Text>App được build bằng Zalo Mini App framework</Text>
      <Text mt={2}>Version: 1.0.0</Text>
    </Box>
  </Page>
);

export default AboutPage;

Chương 3: tích hợp Zalo SDK ​

3.1 ZaloPay payment ​

typescript
import { createOrder } from "zmp-sdk/apis";

async function checkout(amount: number) {
  try {
    const result = await createOrder({
      desc: "Thanh toán đơn hàng #123",
      item: [{ id: "item1", amount }],
      success: (data) => {
        console.log("Payment success", data);
      },
      fail: (err) => {
        console.error("Payment fail", err);
      }
    });
    return result;
  } catch (err) {
    console.error(err);
  }
}

3.2 Share với bạn bè ​

typescript
import { openShareSheet } from "zmp-sdk/apis";

async function share() {
  await openShareSheet({
    type: "link",
    data: {
      link: "https://zalo.me/your-app",
      chatOnly: false
    }
  });
}

3.3 Location ​

typescript
import { getLocation } from "zmp-sdk/apis";

const { latitude, longitude } = await getLocation({});

3.4 QR scan ​

typescript
import { scanQRCode } from "zmp-sdk/apis";

const { content } = await scanQRCode({});

3.5 Phone number ​

typescript
import { getPhoneNumber } from "zmp-sdk/apis";

const { token } = await getPhoneNumber({});
// Gửi token lên backend, dùng Zalo API exchange → số điện thoại thật

Chương 4: preview và test ​

4.1 Local preview ​

bash
zmp start

Web preview ở http://localhost:3000. Test UI cơ bản.

4.2 Preview trong Zalo ​

  1. Mở Zalo app trên điện thoại
  2. Settings → Developer mode → On
  3. Quay lại home Zalo → search "Mini App Developer"
  4. Scan QR code từ Zalo Mini App Studio (Project → Preview)
  5. App mở trong Zalo

Chương 5: publish ​

5.1 Build production ​

bash
zmp build

Output trong www/ folder.

5.2 Upload qua Studio ​

  1. Login Zalo Mini App Studio
  2. Select app
  3. Click "Upload" → chọn folder www/
  4. Add version note
  5. Submit for review

5.3 Review ​

  • Zalo review thường 1-3 ngày
  • Tiêu chí: function chạy được, không broken link, không nội dung vi phạm
  • Sau approve, app available cho tất cả Zalo user

5.4 Marketing ​

  • QR code: print QR cho user scan
  • Zalo OA: tích hợp với Zalo OA bot
  • Zalo Ads: chạy ads target user
  • Mời friend: share trong Zalo chat
  • SEO trong Zalo search

Chương 6: best practice ​

6.1 Performance ​

  • Lazy load page (không load mọi page lúc start)
  • Compress image (WebP)
  • Cache API response
  • Minimize bundle size (<2MB lý tưởng)

6.2 UX ​

  • Loading state cho mọi async
  • Error handling rõ
  • Skeleton screen
  • Pull-to-refresh
  • Smooth animation

6.3 Security ​

  • Verify token Zalo server-side
  • Don't trust client data
  • HTTPS only
  • Sanitize user input

6.4 Analytics ​

  • Tích hợp Zalo Analytics
  • Custom event tracking
  • Funnel analysis
  • A/B testing

Câu hỏi thường gặp ​

Q1: Cost dev Zalo Mini App? ​

Free. Chỉ cần Zalo account + dev tool free.

Q2: Limit gì so với native app? ​

  • Không background process
  • Không push notification chính (chỉ qua Zalo OA)
  • Hardware access hạn chế (no Bluetooth, no NFC)
  • Storage giới hạn (~10MB)
  • Network request phải HTTPS

Q3: Zalo Mini App vs PWA? ​

Tiêu chíZalo Mini AppPWA
AudienceZalo user VNMọi browser user
InstallTự động qua ZaloPhải user "Add to Home Screen"
PaymentZaloPay built-inPhải tích hợp Stripe/VNPay
DiscoverabilityZalo search + shareGoogle search + share
Best forMass market VNInternational, web-savvy

Q4: Có dùng React, Vue được không? ​

Có. Zalo Mini App framework dựa React. Vue support qua plugin (ít phổ biến).

Q5: Database thì sao? ​

Không có built-in DB. Cần backend riêng (Supabase, Firebase, custom Node.js API). Xem bài tiếp theo cho backend integration.

Tài liệu tham khảo ​


Phụ lục: Zalo Mini App 2026 ​

A. Update 2026 ​

  • Zalo Mini App 2.0 (Q1/2026): support TypeScript native, hot reload nhanh hơn, Tailwind CSS support
  • AI integration: Zalo AI Studio mới cho phép embed AI chatbot vào Mini App
  • Cross-channel: 1 Mini App show được cả trong Zalo cá nhân và Zalo OA business
  • Mini Game: dedicated framework cho game trong Zalo
  • Subscription: monetize qua subscription, Zalo handle billing

B. Stack template phổ biến ​

Frontend: Zalo Mini App + React + Tailwind
State: Zustand
Backend: Supabase (free tier) hoặc Firebase
Payment: ZaloPay native
Auth: Zalo OAuth
Analytics: Zalo Analytics + Posthog
Deploy: Zalo Mini App Studio

C. Top Zalo Mini App VN ​

  • AhaMove: book xe ôm
  • Be Mini App: book Be
  • Tiki: e-commerce
  • Lazada: e-commerce
  • Zalo OA của các shop nhỏ: booking, order

D. Roadmap learning Zalo Mini App ​

Tuần 1: Setup + Hello World + UI cơ bản Tuần 2: Tích hợp ZaloPay, location, QR Tuần 3: Backend (Supabase) + auth flow Tuần 4: Polish UI, performance, publish

E. WeChat Mini Program (nếu cần TQ market) ​

Nếu vẫn cần build WeChat Mini Program:

  • WXML + WXSS + JS thay vì React
  • 微信开发者工具 (WeChat DevTools) thay Zalo Studio
  • WeChat Pay thay ZaloPay
  • Backend: WeChat Cloud Functions, Tencent Cloud
  • Audience: 1.3 tỷ user TQ (nhưng VN không dùng)

Docs: https://developers.weixin.qq.com/miniprogram/en/dev/

Sources ​