微信小程序 vs. Telegram 小程序(Web App)
维度 | 微信小程序 | Telegram 小程序(Web App) |
---|---|---|
定位 | 微信生态内部的轻量级原生‑like 应用,用户通过「发现」或扫一扫等入口打开。 | Telegram 客户端内的 Web App,通过 Bot 按钮或 Inline Keyboard 打开,实际上是一个 网页(HTML+JS)嵌入在聊天窗口。 |
运行时 | 微信自研的 Mini‑Program Runtime(基于 V8 + 自有 UI 渲染层)。 | Telegram 客户端内置的 Chromium‑based WebView(iOS、Android、桌面均使用同一套渲染引擎)。 |
前端语言/框架 | – WXML(类 XML 的模板) – WXSS(类似 CSS,支持 rpx 响应单位) – JavaScript/TypeScript(ES6+) – 也可以使用 Vue、React、UniApp、Taro等编译到小程序。 | – 任意 HTML5 + CSS + JavaScript(可使用 React、Vue、Svelte、Angular…) – 推荐使用 Telegram Web Apps JavaScript SDK( window.Telegram.WebApp )进行交互。 |
开发工具 | – 微信开发者工具(IDE) – CLI( miniprogram-ci )– 可在 VS Code 中通过插件调试 | – 任意编辑器(VS Code、WebStorm 等) – 通过 Telegram Bot API 配置 web_app 按钮– 可使用 ngrok/自有域名调试实时预览 |
后端交互 | – 通过 wx.request、wx.cloud (云函数)– 支持 WebSocket( wx.connectSocket )– 受限于同源策略,需走微信的 HTTPS 域名白名单 | – 完全自由的 fetch / XMLHttpRequest(只要符合 Telegram 要求的 HTTPS) – 推荐使用 Telegram Bot API 与 Bot 进行双向通信( sendData / onEvent ) |
身份认证 | – wx.login → 获取 code → 服务器换取 session_key + openid – 支持 手机号、微信支付等安全接口 | – window.Telegram.WebApp.initData 包含用户信息(id , first_name , last_name , username , photo_url , auth_date , hash )– 通过 HMAC‑SHA256 验证签名,确保数据未被篡改 |
页面路由 | – app.json 中声明页面路径– wx.navigateTo / redirectTo / switchTab 等 API | – 完全由 SPA 框架自行管理路由(如 React Router) – Telegram 只负责打开/关闭整个 Web App |
系统能力 | – 原生 API:相册、摄像头、地理位置、文件、支付、分享、获取用户信息、订阅消息、推送、广告、直播、插件等。 – 组件库:官方 UI(WeUI)及第三方(Vant‑Weapp、NutUI) | – Web App SDK:获取窗口尺寸、主题、用户信息、返回按钮、发送数据、打开外部链接、收起键盘、显示通知等。 – 通过 Bot API 可调用 Telegram 原生功能:发送消息、发起支付、获取用户位置、邀请好友、查询聊天信息等。 |
发布审核 | – 必须提交 微信小程序审核(需填写业务、隐私政策、截图等) – 审核周期 1‑7 天不等 | – 无需平台审核,只要 Bot 已通过 Telegram Bot Review(如果涉及支付或敏感功能),Web App 可以直接上线。 |
分发渠道 | – 微信「小程序入口」:搜索、二维码、公众号关联、朋友圈、附近、游戏中心等。 – 受限于微信生态(只能在微信内使用)。 | – 通过 Bot 发送按钮、Inline Keyboard、deep‑link (t.me/yourbot?start=xxxx )、群组、频道、Telegram 广告。– 可在任何 Telegram 客户端使用,跨平台(iOS、Android、桌面、Web)。 |
商业化 | – 微信支付、广告、会员卡、直播、拼团、卡券等完整生态。 – 需通过微信支付商户号、开通相应插件。 | – Telegram Payments(支持 Stripe、PayPal、其它支付网关)通过 Bot API 实现。 – 也可以接入 广告网络(如 Google AdSense)或自定义付费墙。 |
隐私/数据 | – 必须在 小程序后台 配置隐私声明,用户授权后才可获取敏感信息。 | – 所有数据均在 Web App 中自行管理,Telegram 只提供 已签名的用户数据。开发者自行实现 GDPR/CCPA 合规。 |
开发门槛 | – 需要学习 WXML/WXSS 语法和微信专有 API,生态相对封闭但文档完整。 | – 前端技术栈与普通 Web 开发一致,学习成本低;重点是熟悉 Telegram Bot API 与 WebApp SDK。 |
调试/预览 | – 微信开发者工具提供 真机预览、云函数调试、网络请求抓包。 | – 通过 ngrok 或自建 HTTPS 服务器实现即时预览;Telegram 本身不提供调试面板,需要自行在浏览器 console 中查看。 |
1️⃣ 微信小程序的核心开发流程(快速回顾)
- 注册小程序账号 → 在微信公众平台开通小程序。
- 创建项目 → 使用 微信开发者工具,选择“新建小程序”。
- 目录结构(典型)
├─ pages/ │ ├─ index/ │ │ ├─ index.wxml │ │ ├─ index.wxss │ │ ├─ index.js │ │ └─ index.json ├─ utils/ ├─ app.js ├─ app.json └─ app.wxss
- 声明页面:
app.json
中pages
数组。 - 页面渲染:
WXML
+WXSS
→ 类 React 的 data‑binding ({{variable}}
)。 - 业务代码:在
*.js
中使用 Page、App、Component 构造函数。 - 调用微信原生能力:
wx.xxx
(如wx.getLocation
、wx.uploadFile
、wx.pay
). - 云开发(可选):
wx.cloud
→ 云函数、数据库、文件存储一键部署。 - 测试:
- 模拟器(微信开发者工具)
- 真机预览(扫码或二维码)
- 调试面板(Network、Console、Performance)
- 提交审核 → 填写业务信息、隐私政策、上传代码。
- 发布 → 审核通过后上线,后续可通过 版本管理 进行灰度或回滚。
关键点:
- 域名白名单:所有
wx.request
、wx.uploadFile
必须走已在「业务域名」中备案的 HTTPS 域名。- 尺寸适配:使用
rpx
(相对像素)进行 UI 适配,1rpx = 1/750 屏幕宽度。- 安全审计:小程序不允许执行
eval
、new Function
等动态代码。
2️⃣ Telegram 小程序(Web App)的核心开发流程
2.1 注册 Bot 并开启 Web App 支持
- 与 @BotFather 对话 →
/newbot
创建 Bot。 - 获取 Bot Token。
- 通过 BotFather 或 Bot API 设置 Web App URL(
setChatMenuButton
、setMyCommands
、setInlineKeyboardButton
的web_app
字段)。 - (可选)开启 Telegram Payments →
/setpaymentprovider
。
2.2 项目结构(普通前端项目)
my-telegram-webapp/
├─ public/
│ └─ index.html # 入口页面,必须在 <head> 中加入 <script src="https://telegram.org/js/telegram-web-app.js"></script>
├─ src/
│ ├─ App.jsx
│ ├─ pages/
│ │ ├─ Home.jsx
│ │ └─ Checkout.jsx
│ └─ utils/
│ └─ telegram.js # 封装 Telegram WebApp SDK
├─ package.json
└─ vite.config.js # 或 webpack/parcel 等
2.3 关键代码片段
<!-- index.html -->
<script src="https://telegram.org/js/telegram-web-app.js"></script>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
// utils/telegram.js
export const tg = window.Telegram.WebApp;
// 初始化数据(首次打开时自动调用)
export function initTelegram() {
// 检查签名
const initData = tg.initData;
const initDataUnsafe = tg.initDataUnsafe; // 已解析但未验证
// 若需要服务器端二次验证:
// fetch('/api/verify', { method: 'POST', body: JSON.stringify({ initData }) })
}
// 发送数据给 Bot
export function sendData(payload) {
tg.sendData(JSON.stringify(payload));
}
// 关闭 Web App 并返回数据给 Bot(Bot 可通过 onEvent 收到)
export function closeApp(result = {}) {
tg.close();
}
// 在页面中使用
import { tg, initTelegram, sendData } from './utils/telegram';
function onBuy() {
const order = { productId: 123, qty: 1 };
sendData({ action: 'order', payload: order });
tg.showAlert('已提交订单,稍后 Bot 会回复您');
}
2.4 常用 SDK 方法(window.Telegram.WebApp
)
方法 / 属性 | 说明 |
---|---|
initData | 完整的 URL 参数字符串,供服务器端校验 HMAC。 |
initDataUnsafe | 已解析为对象(不安全,仅在前端使用)。 |
themeParams | 当前主题颜色(bg_color , text_color , hint_color 等),可用于 UI 适配。 |
colorScheme | 'light' / 'dark' |
viewportHeight / viewportStableHeight | 可视区高度(键盘弹起前后),用于动态布局。 |
isExpanded , expand() , close() | 控制 Web App 的展开/收起状态。 |
showAlert(text) , showConfirm(text) , showPopup(params) | 调用原生弹窗。 |
showInvoice(invoice) | 调起 Telegram 支付(需要 Bot 配置)。 |
sendData(data) | 将字符串发送回 Bot(Bot 收到 callback_query 的 data 字段)。 |
onEvent(event, callback) | 监听 themeChanged , viewportChanged , backButtonClicked 等事件。 |
安全提醒:所有从
initData
中得到的用户信息(id
,username
等)必须在服务器端通过 HMAC‑SHA256(使用 Bot Token)进行校验,否则可能被篡改。
2.5 部署 & 调试
步骤 | 操作 |
---|---|
本地调试 | 使用 ngrok http 3000 (或 cloudflare tunnel )生成公网 HTTPS URL → 在 Bot 的 web_app 参数中填入该 URL。 |
真机测试 | 在任意 Telegram 客户端点击按钮或 t.me/yourbot?start=xxxx 打开 Web App。 |
浏览器预览 | 直接打开 https://yourdomain.com (若未嵌入 Telegram 环境,tg.initData 为空,需自行模拟)。 |
正式上线 | 将域名备案为 HTTPS 且支持 TLS 1.2+,在 Bot 中更新 web_app URL 为正式地址。 |
3️⃣ 关键区别汇总(概念层面)
维度 | 微信小程序 | Telegram 小程序 |
---|---|---|
技术栈 | 专属的 WXML/WXSS + JS(或编译框架) | 标准 Web 前端(HTML/CSS/JS) |
运行环境 | 微信自研 Runtime,沙箱化、受限 | Telegram 客户端内嵌 Chromium WebView,基本与普通浏览器相同 |
生态入口 | 微信内部(搜索、扫一扫、公众号等) | Bot 按钮、链接、深度链接(t.me/... ) |
原生能力 | 丰富的微信专有 API(支付、卡券、直播、AR 等) | 通过 Bot API 调用 Telegram 功能,Web App 本身只能使用浏览器能力 |
审核流程 | 必须通过微信官方审核 | 只要 Bot 本身通过审核(若涉及支付),Web App 无需额外审查 |
发布与更新 | 版本号 + 审核后发布,可灰度、回滚 | 直接更新 Web 站点,实时对所有用户生效 |
用户身份 | openid + unionid (跨平台) | user_id (Telegram UID) + initData 中的签名 |
支付 | 微信支付(需要商户号、企业资质) | Telegram Payments(通过 Bot,支持 Stripe、PayPal、其它 PSP) |
分发渠道 | 受限于微信生态 | 任意 Telegram 渠道(群、频道、个人聊天) |
数据存储 | 微信云开发或自建服务器 | 完全自建后端(可使用任何数据库、云服务) |
国际化 | 国内用户为主,海外需要备案 | 天然全球化,Telegram 在 200+ 国家都有活跃用户 |
学习曲线 | 需要掌握专有语法和工具 | 与普通 Web 开发一致,学习成本低 |
4️⃣ 开发者常见疑问与最佳实践
4️⃣1 微信小程序
问题 | 建议 |
---|---|
页面卡顿 | – 使用 分包(subpackages )减少首屏体积。– 避免一次性渲染大量列表,使用 wx:for + virtual-list 。 |
接口调用被拦 | – 确认 业务域名 已在「微信公众平台 → 开发 → 服务器域名」完成备案。 – 请求头 content-type 必须是 application/json 或 application/x-www-form-urlencoded 。 |
获取用户手机号 | 必须先调用 wx.getPhoneNumber ,用户同意后返回加密数据,后端使用 session_key 解密。 |
使用第三方 UI | 推荐 Vant‑Weapp、NutUI,但在发布前请检查是否有未被微信审查的 API(如 WebGL )。 |
调试支付 | 使用 微信支付沙箱(pay.weixin.qq.com ),在 app.json 中配置 debug:true ,并在后台开启「沙箱模式」。 |
4️⃣2 Telegram 小程序
问题 | 建议 |
---|---|
无法获取 initData | 确认 Web App URL 已在 Bot 的 WebAppInfo 中配置,并且打开方式是 Telegram 内部(不是直接浏览器)。 |
签名校验不通过 | – 使用 Bot Token(不包括 : 前面的部分)作为 HMAC 密钥。– 确保在服务器端使用 UTF‑8 编码的原始 initData 字符串进行签名。 |
键盘弹起导致布局错位 | 监听 Telegram.WebApp.onEvent('viewportChanged', ...) ,获取 viewportHeight 与 viewportStableHeight ,动态调整容器高度。 |
支付失败 | – 检查 Bot 是否已通过 Telegram Payments 审核。 – price_label 与 price_amount 必须匹配 Bot 后端的订单金额。 |
跨域资源受限 | 虽然 WebView 支持任意 CORS,但仍建议在服务器端返回 Access-Control-Allow-Origin: * (或具体域名),避免在移动端出现 blocked by CORS policy 。 |
使用第三方库 | 大多数库(如 axios, lodash, moment) 均可直接使用,但注意 体积:Telegram 会自动限制 Web App 的最大文件大小(约 5 MB),建议开启代码分割或使用 CDN。 |
5️⃣ 从微信迁移到 Telegram(如果你已经有小程序)
步骤 | 说明 |
---|---|
1. 重新规划 UI | 将 WXML/WXSS 转换为标准 HTML/CSS,利用 rpx → vw/vh 或 rem 替代。 |
2. 抽离业务层 | 将所有业务逻辑(数据请求、状态管理)抽离到 Service 层,既可以在微信使用 wx.request ,也可以在 Telegram 使用 fetch 。 |
3. 替换身份体系 | – 微信 openid → Telegram user_id 。– 将登录流程改为 Telegram Web App initData 验证。 |
4. 替换支付 | – 微信支付 → Telegram Payments(Bot 端实现 sendInvoice )。– 前端改为 tg.showInvoice(invoice) 。 |
5. 替换原生能力 | – 微信定位、相机等 → 使用浏览器原生 API(navigator.geolocation 、MediaDevices.getUserMedia ),或通过 Bot 让用户在聊天中发送位置/照片。 |
6. 部署 & 域名 | 迁移到 HTTPS 服务器(推荐使用 Cloudflare, Vercel, Netlify),并在 Bot 中更新 web_app URL。 |
7. 测试 | 使用 ngrok 进行实时调试,确保 initData 校验通过、支付流程可用、界面在不同 Telegram 客户端(iOS、Android、Desktop)表现一致。 |
8. 发布 | 完成后直接更新 Web 站点,无需再次审核。可通过 Bot 发送更新通知或在原小程序中放置跳转链接。 |
小技巧:如果你希望保持同一套代码库,可以使用 跨平台框架(如 React + Taro):
- Taro 支持 微信小程序 编译,也支持 Web(即 Telegram Web App)。
- 只需在
config/index.js
中切换mini
(微信)和h5
(Telegram)两套编译目标,业务代码保持不变。
6️⃣ 推荐学习资源
平台 | 资源 | 链接 |
---|---|---|
微信小程序 | 官方文档、快速入门、组件库 | https://developers.weixin.qq.com/miniprogram/dev/framework/ |
微信云开发(Serverless) | https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/ | |
Taro 多端框架 | https://taro-docs.jd.com/taro/docs/ | |
Telegram Web App | 官方 Web App SDK 文档 | https://core.telegram.org/bots/webapps |
Bot API 参考(支付、回调) | https://core.telegram.org/bots/api | |
示例项目(GitHub) | https://github.com/TelegramBots/Telegram.WebApp.Examples | |
跨平台 | UniApp(可输出微信 + H5) | https://uniapp.dcloud.io/ |
React Native Web + 微信小程序插件 | https://github.com/Tencent/uni-app |
7️⃣ 小结
- 技术栈:微信 → 专属标记语言;Telegram → 标准 Web。
- 能力边界:微信原生 API 更丰富(支付、卡券、直播等),Telegram 依赖 Bot API 进行扩展。
- 发布流程:微信需要审查,Telegram 只要 Bot 合规即可即时上线。
- 国际化:Telegram 天生跨境,微信生态主要在中国。
- 学习曲线:如果你已有前端经验,Telegram 小程序上手更快;如果你想深入微信生态并利用其强大的原生能力,必须学习其专有框架。
希望这份对比能帮助你快速判断哪条路线更适合你的业务需求,或在迁移/多端开发时提供明确的实现指引。祝开发顺利 🚀!
by gpt-oss:120b
发表回复