news 2026/9/8 17:24:58

微信小程序开发全流程实操指南:从注册到上线避坑手册

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
微信小程序开发全流程实操指南:从注册到上线避坑手册

先说个前提:后台总有朋友私信问我类似“怎么创建自己的小程序”这种问题,而且问的人里很多并不是程序员,只是有个实体店,或者想给学校、社团做个展示页,甚至想做个答题工具自己玩。这个问题我回答过几十次了,最近刚把手头一个小程序商城从注册账号到审核上线完整走了一遍,所以干脆写下这篇实操记录,把从0到1会遇到的事都梳理了一遍。如果你也想顺手做一个微信小程序,不管是工具类、内容展示还是小程序商城,这篇应该能帮你少走不少弯路。

小程序开发这东西,最劝退新手的并不是代码本身,而是你一开始根本不知道该点哪里、该注册什么、该用什么工具。我当年第一次打开微信公众平台后台的时候,光看那些菜单就懵了半天。所以这篇文章我不讲那些花哨的高阶技巧,就按真实做项目的顺序来,从账号注册、工具选型、页面结构,到请求数据、真机调试、审核发布,一层层往下聊。

1. 动手前先想清楚:小程序不是“写代码”那么简单

很多人一上来就搜教程、装开发工具,结果弄了两天还在原地打转。原因很简单:没想明白自己要做什么类型的小程序。

1.1 你的应用场景,决定了绝大部分选择

先别急着敲代码,先问自己一个问题:这个小程序是给谁用的,解决什么问题?

举几个我实际遇到过的情况:

  • 实体店主想做线上下单,那多半要涉及商品展示、购物车、订单、微信支付,这是典型的小程序商城玩法。
  • 高校社团要做校园新闻展示,那其实不需要支付,做好文章列表、详情页、订阅消息就够了。
  • 个人开发者想做个壁纸合集、工具箱、答题打卡类的小工具,这种最轻松,甚至不需要服务器,用云开发就行。
  • 有人想做微信小程序游戏,那要注意,小游戏和小程序虽然都在微信里跑,但是技术栈完全是另一套,用的是游戏引擎(Cocos这类),和普通小程序的组件、API差异很大,不能混为一谈。
  • 还有人问过AI小程序能不能做。能做,本质上就是小程序前端界面加上大模型API调用,如果你有后端能力,套一层转发请求,效果就会好很多,也不容易被平台拦截。

这些不同方向,决定了你后面要学的技术栈完全不同。如果你只是想做内容展示,却去研究购物车和支付,那纯粹是给自己挖坑。反过来,你想做商城,却连微信支付商户号都没了解过,等开发完再补就麻烦了。

所以,第一步不是选工具,而是把需求压缩成一句话,比如“我想做一个支持商品展示、联系人下单的小程序商城”。然后拿着这句话去决定后续所有技术选型。

1.2 账号主体怎么选:个人和企业差别真的很大

注册小程序账号的时候,微信会要求你选主体类型。主要分个人、个体工商户、企业、政府/媒体/其他组织等。

这个选择比你想象中更重要,因为它直接卡住你的功能范围。

  • 个人主体:注册最方便,只需要一个没绑定过公众号/小程序的邮箱和身份证信息。但限制也多:不能开通微信支付,部分类目比如电商、医疗、金融基本没戏。适合做工具类、内容展示类的应用。
  • 个体工商户/企业主体:需要营业执照和对公账户(个体工商户可以不用对公账户,用法人银行卡验证也可以)。企业主体才能开通微信支付,做小程序商城基本绕不开这条路。

我当时做小程序商城的时候,就是因为主体问题差点翻车。一开始图省事用个人主体注册,开发完才发现没法开通支付,只能去工商办了个体户执照,再把小程序主体迁移过去。这个过程虽然不算太复杂,但来回折腾了小半个月,真的很影响节奏。

除此之外还要了解一个常识:每个邮箱只能注册一个小程序,身份证/营业执照能注册的小程序数量也有限制。如果你预料到自己后面会做多个小程序,最好提前规划一下邮箱资源。

1.3 原生开发、uni-app、SaaS源码,到底怎么选

确定好场景后,就该选开发方式了。现在市面上做小程序主流的路径有三条,各有各的适用人群。

方案优点缺点适合谁
微信原生开发(WXML + WXSS + JS + JSON)官方文档齐全,调试直接,性能最好只能跑微信,以后想做支付宝/抖音小程序得重写只瞄准微信生态、想深入学习小程序原理的人
uni-app(用 HBuilderX 开发)一套代码可编译到微信/支付宝/H5/App,前端Vue语法部分组件和原生有差异,遇到问题要查框架文档有Vue基础、想多端复用的人
SaaS平台/源码二开上线速度快,后台现成,不用写太多代码灵活性差,长期付费,数据不完全在自己手里没有技术基础,单纯想做“小程序商城”的店主

如果是完全没写过代码的纯小白,我建议你先去看看SaaS方案,比如餐饮外卖、电商小程序这类,很多平台几百块一年就能搞定,后台直接传商品图片、填价格就能用,没必要从代码开始。如果你想长期做,而且有一定学习能力,那我还是推荐原生开发或者uni-app,因为它们能让你真正理解小程序内部是怎么工作的。

我个人是推荐用uni-app的。原因有两点:第一,Vue的语法生态大,遇到问题网上随便一搜都是解决方案;第二,HBuilderX本身就是Vue项目的开发工具,配合微信开发者工具跑起来很顺手。但你也别指望完全绕过微信开发者工具,因为最终编译预览、上传审核,都要回到微信开发者工具里操作。

2. 环境搭建与第一个小程序项目

选好方向,下一步就是把开发环境搭起来。这部分看起来简单,但里面有不少小坑,有些人卡在第一步就能卡一整天。

2.1 注册小程序账号并拿到AppID

打开微信公众平台,点“立即注册”,选择“小程序”,然后按流程填写邮箱、密码、激活邮件、选择主体类型并做验证。

这里我提醒几点:

  • 邮箱必须是没注册过公众号、小程序、开放平台的邮箱,否则会提示被占用。
  • 个人主体注册时,需要管理员扫码验证,建议直接用自己常用的微信号做管理员,后面很多操作都要管理员扫码。
  • 注册完成后,在“设置 - 账号信息”里能看到AppID和AppSecret。AppID是后面开发工具里要填的,AppSecret是调用后台接口用的,千万别泄漏到前端代码里。

很多人刚开始会用“测试号”,这个是在开发工具里点“测试号”自动生成的,省去注册步骤。但测试号和正式AppID不一样,它不能真机预览,也不能上传发布。所以我建议,只要你是打算认真做,就老老实实先注册一个正式小程序账号,哪怕内容是自用呢。

2.2 安装开发者工具并创建第一个项目

去微信官网下载微信开发者工具,选择稳定版就行,别去下 nightly 这种开发版,稳定性不够,很影响心情。

安装启动后,登录方式用微信扫码。第一次打开会让你选择项目类型,这里有“小程序”和“小游戏”,选小程序。然后选择目录,填上你的AppID,前端模板可以选“JavaScript - 基础模板”。如果你想看看带云开发的模板,也可以选 “JavaScript - 云开发模板”。

创建完之后,你会看到左侧模拟器已经显示出一个默认的“Hello World”页面,这就说明环境没问题了。

这里有个很多人踩过的坑:在 HBuilderX 里写了uni-app项目,然后在 “运行 - 运行到小程序模拟器 - 微信开发者工具” 时,提示“不是开发者”或者“小程序ID还是原来的”。

这种情况基本就是两个原因:

  • 微信开发者工具没有登录,或者登录的微信号不是你小程序的开发者/管理员。
  • 你的uni-app项目里 manifest.json 中的“微信小程序配置”还是之前别人项目的AppID,需要改成你自己的。

处理方式很简单:打开 manifest.json,找到“微信小程序配置”一栏,把AppID换成你自己的;然后在微信开发者工具里,点右上角“详情”,确认“本地设置”里的AppID已经同步。如果还是不生效,清一下 HBuilderX 的缓存,项目重新编译一次。千万不要在微信开发者工具里手动改 project.config.json 的AppID,因为编译一次就会被HBuilderX覆盖,必须从 manifest.json 源头改。

2.3 一次性搞懂小程序的目录结构和四件套

创建完原生小程序项目后,你会看到目录下有几个文件:app.js、app.json、app.wxss,以及 pages/index/index.wxml、index.wxss、index.js、index.json。

新手最容易懵的就是:为什么一个页面要搞出4个同名文件?

我一般这样给别人解释:把一个小程序页面当作一个人来看待。

  • WXML 是骨架,相当于人的骨骼结构,决定这个页面上有哪些元素,按钮、图片、文字都在这里写。
  • WXSS 是皮肤和衣服,负责样式,颜色的深浅、字体大小、边距、宽度高度都是它说了算。
  • JS 是大脑和肌肉,负责逻辑和交互,比如用户点了按钮之后执行什么操作、请求什么数据,都在这里做。
  • JSON 是身份证和配置单,用来配置窗口标题、页面路径等,也可以理解为告诉小程序这个页面该用什么姿势展示。

一个功能再多的小程序,本质上就是一堆这样的“四个人”组合在一起。app.json 是全局配置,里面定义了所有页面路径、窗口外观、底部导航等等。每次新增页面,都要在 app.json 的“pages”数组里注册路径,这个很关键,很多人页面写好了但总报“page not found”,几乎都是因为忘了注册。

  1. 页面与交互开发的几个核心点

把页面数量扩充起来之前,我建议先把两个问题搞明白:底部导航怎么配置、顶部导航栏怎么处理。这两个问题几乎每个新手都会遇到,而且直接决定了小程序看起来像不像样。

3.1 底部导航 tabBar:小程序的门面

几乎所有小程序商城、资讯类小程序,底部都有一排导航:首页、分类、购物车、我的。这个在原生开发里是通过 app.json 的 tabBar 字段配置的。

下面是一个我常用的 tabBar 配置示例:

{ "pages": [ "pages/index/index", "pages/category/category", "pages/cart/cart", "pages/user/user" ], "tabBar": { "color": "#999999", "selectedColor": "#ff5000", "list": [ { "pagePath": "pages/index/index", "text": "首页" }, { "pagePath": "pages/category/category", "text": "分类" }, { "pagePath": "pages/cart/cart", "text": "购物车" }, { "pagePath": "pages/user/user", "text": "我的" } ] } }

需要注意,tabBar 里每个图标,官方推荐使用81px * 81px的PNG图片,图片大小不要超过40KB,否则在部分安卓机上会出现图标显示不出来的奇怪问题。我之前就遇到过,图标在开发者工具里显示正常,真机上有一个怎么都不出来,最后发现是那张图超了1KB,压缩之后就正常了。

setTabBar 也支持动态修改,但新手阶段尽量在 app.json 里一次配置好,别在代码里反复改 tabBar,容易引发状态不同步。

3.2 页面跳转:小程序内跳转、跳H5、跳另一个小程序的差别

页面的跳转大概有三种情况:普通页面向下钻、跳出小程序到 H5、跳到别的小程序。

第一种最常用,用的是 wx.navigateTo。比如从首页跳商品详情页:

wx.navigateTo({ url: '/pages/detail/detail?id=10001' });

注意,这个跳转有层级限制,最多只能跳十层。超过十层之后 navigateTo 会没反应。如果你用 wx.redirectTo 进行页面重定向,会在跳转后关掉当前页面,避免栈溢出。还有个小细节:tabBar 里配置过的页面,不能用 navigateTo 跳,必须用 wx.switchTab,否则会报错。

跳H5则是通过 web-view 组件。web-view 就是一个小程序里直接嵌套网页的组件,但使用它有一个硬性条件:要在小程序后台配置业务域名,而且域名必须备案,还得下载校验文件放到服务器根目录。如果你只是开发阶段临时测试,可以勾选开发者工具的“不校验合法域名”,这时 web-view 也能打开HTTP的链接。但真机预览和正式上线时,不校验域名是不生效的,这点别偷懒。

还有一种是跳另一个小程序。网上经常有人问,“小程序A跳小程序B,需要在微信公众平台上做什么操作吗”。答案是需要的,而且不止一步:

  • 在小程序A的代码里,用 wx.navigateToMiniProgram 跳转,并在 app.json 中通过 “navigateToMiniProgramAppIdList” 配置目标小程序的AppID,最多只能配置10个。
  • 在小程序B的后台,需要把小程序A的AppID加入“关联小程序”列表里。
  • 如果希望从A页面跳转后直接打开B的某个具体分包页面,需要把路径写完整,比如/packageA/pages/detail/detail。有些同学会遇到“配置分包路径不行”的报错,多数是因为目标页面所在分包没有配置 “preloadRule” 或者路径写错,尤其是分包路径必须以分包根目录开头,不能只写到分包名就结束。

很多人说“我明明后台关联了,为什么跳过去还是首页?”这种情况多半是B那边改了AppID,但A没有更新,或者A用了测试版二维码去唤起正式版。像这种跨小程序跳转的问题,建议一次性把后台和代码同步测,别一边改一边怀疑人生。

3.3 顶部导航栏:自定义标题、动态标题和状态栏高度那些事

每次有人问“小程序头部标题怎么变”,其实有两种改法。

第一,不修改原生导航栏,只在页面详情页的 onLoad 里调用:

wx.setNavigationBarTitle({ title: '新的标题' });

这会动态设置当前页面顶部的标题文字。适合新闻详情、商品标题这种需要随时变的场景。

第二,彻底隐藏原生导航栏,自己写一个自定义顶栏。做法是在需要自定义的页面JSON里设置:

{ "navigationStyle": "custom" }

这时页面内容会延伸到屏幕最顶部,全屏展示。但随之而来的问题是:状态栏(显示时间、电量的那一条)的高度怎么算?胶囊按钮(右上角那三个点)离顶部多远?

我常用这样的代码拿到状态栏高度和菜单按钮位置:

const windowInfo = wx.getWindowInfo(); const menuButtonInfo = wx.getMenuButtonBoundingClientRect(); // 状态栏高度 const statusBarHeight = windowInfo.statusBarHeight; // 导航栏内容区的推荐高度(状态栏底部到胶囊按钮底部的距离) const navBarHeight = (menuButtonInfo.top - statusBarHeight) * 2 + menuButtonInfo.height;

简单解释一下:胶囊按钮在微信里是固定的,你拿它的位置做一个对称,就能算出“自定义导航栏”该占多高。这个方法在 iPhone 刘海屏和安卓挖孔屏上都能适配,比硬编码一个 64px 或者 88px 要稳得多。有人问“微信小程序顶部导航栏高度、上边距怎么弄”,十有八九是没有查胶囊按钮位置,而是自己去猜高度,结果换一台手机就错位。

  1. 数据、支付与后端:个人开发者怎样解决“没有服务器”的问题

小程序开发到一定阶段,总绕不开一个核心问题:数据存哪里、从哪里来。这个问题是新手最容易懵的地方,所以我单独拎出来重点说。

4.1 个人开发者首选:微信云开发

如果你没有自己的服务器和域名,也不想学Linux运维,那云开发几乎是最佳选择。它相当于微信帮你托管了一套“后端环境”,你只需要在开发者工具里点击“云开发”按钮,按提示开通环境,就能得到一个JSON数据库、云函数、云存储和云托管。

云开发的数据库和普通数据库差别不大人,也是集合-文档-字段结构。但它的操作方式更适合前端思维,直接在小程序端调用API就能增删改查。比如获取一篇文章列表:

const db = wx.cloud.database(); db.collection('articles').where({ category: 'news' }).get().then(res => { console.log(res.data); });

如果你的业务逻辑比较复杂,比如需要做批量更新、处理支付回调等,这类操作不能直接在小程序端调用数据库,需要写云函数。云函数就是跑在微信服务器上的Node.js函数,你只需要写好逻辑,然后在开发者工具里右键“上传并部署”,再用 wx.cloud.callFunction 调用它。

云函数还有个好处:天然支持微信支付服务端。个人主体虽然不能开通微信支付,但如果你是用企业主体开通了商户号,在云函数中接入微信支付v3,代码写起来会清爽很多,因为unifiedOrder、回调验签这些都需要服务端处理,只靠小程序前端是搞不定的。

如果你选择自己买服务器、写后端接口,那小程序端主要用 wx.request 发请求。要记住一个老生常谈但无比重要的规矩:正式环境下,wx.request 的域名必须是HTTPS,而且要在小程序后台“开发管理 - 开发设置 - 服务器域名”里配置 request 合法域名,否则接口全被拦截。

开发者工具调试阶段可以点“详情 - 本地设置 - 不校验合法域名、web-view(业务域名)、TLS版本以及HTTPS证书”,这样你在本地跑HTTP接口也能通过。

但你要清楚:这只是开发期给自己开后门,真机预览的时候,如果没关这个选项,安卓手机还能勉强打开,iPhone上请求基本会被拦死。所以看见“真机上request失败,开发者工具正常”这种经典问题,第一步先检查后台配置的合法域名和HTTPS证书是否有效,别一上来就怀疑代码。

4.2 微信支付和虚拟支付:最容易被坑的环节

网上搜“小程序商城”相关关键词时,经常能看到“微信支付v3对接”这几个字。如果你真打算做商城,那我建议你在开发前就把支付资质搞清楚。

微信支付的开通条件,目前是企业主体/个体工商户主体需要注册微信支付商户号,然后用商户号和AppID做关联。个人主体没法直接申请。

在接口层面,新商户现在基本都要用微信支付v3接口,相比旧版v2,v3的签名机制改了,回调报文是AES-256-GCM加密,服务端解密时要注意密钥和证书区分。做云函数方案对接v3时,我自己的经验是直接用微信官方提供的“云开发微信支付”能力,会比裸写v3接口简单很多,因为微信已经封装了大部分流程。

还有个容易让人误入歧途的地方:“虚拟支付”。我们常说的虚拟支付,指的是在小程序里销售会员、课程、充值、解锁通关道具这类没有实体物流的商品。微信对“虚拟支付”的管理非常严格,尤其iOS端,小程序里根本不允许做虚拟支付,也就是不能展示“购买”按钮、不能引导用户去公众号充值,更不能用H5页面套一层跳转来绕过,一旦被查到轻则功能下架重则封禁支付权限。所以你会发现很多知识付费、会员服务的小程序,在iOS上只能做“阅读/学习”,想付费得跳到微信内置浏览器里完成。

这也是为什么我推荐一开始就明确自己到底做什么。你是卖实体商品的,微信支付没问题;你是做虚拟内容的,那得提前规划好“iOS用户怎么支付”这个生死攸关的问题。别等代码全写完了再回头改,那基本等于重做。

4.3 页面跳转、scheme、带参启动的补充细节

在上线运营阶段,很多团队会生成小程序的“URL Scheme”或者“URL Link”,用来在短信、邮件、外部App中拉起小程序。如果你也遇到 “明文scheme拉起此小程序,配置分包路径不行” 这种问题,通常是因为生成 scheme 时填写的 path 不对。

比如你的分包路径是 /packageShop/pages/goods/goods,那你在后台生成 scheme 填写路径时,要写完整:pages/xxx?xxx ,但注意 scheme 的 path 里一般不填“分包根目录”的名称就结束,而是必须写到页面文件路径,并且路径要去掉 .vue 或 .wxml 后缀。如果目标页面在分包里,后台要求填写的 path 格式常常是/packageShop/pages/goods/goods,有些开发者只填了分包名/packageShop/pages/index/index当然不行。页面路径写错,导致拉起后一片空白,这种问题排查起来很费时间,建议先拿真机扫码测试再上线。

5. 核心组件踩坑与真机调试实录

接下来这部分,是我最想告诉你的。因为官方文档不会告诉你这些,只有实际动手和真机测试才会暴露出来。

5.1 iOS上 swiper 嵌套 video 导致全屏错位

我做内容类小程序时,遇到过iOS端一个非常奇葩的问题:swiper 里放了 video 组件,手指滑动到某一页视频时,点击全屏按钮,视频居然不是全屏,而是出现在一个偏移的位置,或者全屏后返回,整个swiper布局乱了。

这其实是微信小程序 iOS 端视频组件的原生层级问题。video是一个原生组件,历史上有很长一段时间它的层级最高,普通view盖不住它,就会导致弹窗、自定义导航都被它穿透。后来微信改用了同层渲染,大多数问题都解决了,但 swiper 加 video 的组合在 iOS 上偶尔仍会触发全屏错位。

我的解决思路是:尽量不要把 video 直接放在 swiper-item 里。如果非要轮播多个视频,可以改成只显示视频封面图,点击图片后用 wx.navigateTo 跳到一个独立的视频播放页,再用一个全屏的 video 来播放。这既符合用户习惯,又绕开了全屏错位问题。

如果确实需要在同一个页面展示多个视频,建议监听视频的 fullscreenchange 事件,在全屏时用 wx.setNavigationBarHidden 隐藏导航栏、手动设置页面为横屏,退出全屏后再恢复。真机测试一定要在iOS上做,开发者工具里永远看不出来。

5.2 手机软键盘遮挡输入框

这个问题在uni-app开发微信小程序时特别常见:页面上有输入框,手机弹软键盘后,输入框被键盘盖住,你想输入内容根本看不到自己在打什么。

搜索框、表单页、聊天输入框都会遇到。原因在于小程序页面默认高度是可视区高度,弹键盘时微信会把页面上推或者改变视口高度,但如果你用了 fixed 定位的输入框,它仍会贴在屏幕底部,于是被键盘盖住。

原生小程序里有属性 adjust-position,为 true 时键盘弹起会自动上推页面。但如果你页面中有很多绝对定位元素,还是会出现遮挡。我常用的方案是:

  1. 监听键盘高度变化(onKeyboardHeightChange),然后把输入框所在容器的 bottom 值设置为键盘高度。
  2. 或者更简单的方法:在提交/搜索按钮点击时,先调用 wx.hideKeyboard() 收起键盘,再进行查询。比如电商搜索页点“搜索”按钮后立刻收起键盘,页面底部就能看到结果了。

uni-app 里如果发现软键盘遮挡查询内容,也可以在配置中把 “adjustPosition” 设为 true,同时配合 ScrollView 的 scroll-into-view 把当前聚焦的输入项滚动到可视区域。核心原则是:不要相信所有手机行为一致,只要涉及键盘,就要用真机验证。

5.3 视频不播放、音频缓存、蓝牙打印这类外设坑

视频不能播放,最可能的原因有四个:

  • 视频源不是HTTPS,微信正式环境不允许HTTP资源的视频。
  • 视频格式兼容性不够,iOS不支持某些安卓常见的编码格式,建议用H.264编码的MP4。
  • 域名没有加白名单,虽然video组件不强制校验业务域名,但如果是自定义的服务器资源,可能被网络策略拦掉。
  • WebView 里播放视频时,某些情况需要用户主动触摸屏幕触发播放,不能直接自动播放带声音的视频。

音频方面,有同学问过“微信小程序音频缓存路径”是什么。实际上,小程序里用 wx.getBackgroundAudioManager 或 InnerAudioContext 播放在线音频,默认会走网络流,并不会帮你把音频文件存到本地。如果你有大量音频需要离线播放,可以用 wx.downloadFile 把音频文件下载下来,然后保存到wx.env.USER_DATA_PATH目录下:

wx.downloadFile({ url: 'https://example.com/audio.mp3', success(res) { const fs = wx.getFileSystemManager(); const targetPath = `${wx.env.USER_DATA_PATH}/audio_001.mp3`; fs.saveFile({ tempFilePath: res.tempFilePath, filePath: targetPath, success() { console.log('音频已缓存到本地'); } }); } });

但要注意,本地缓存空间有限,每个小程序的本地缓存总容量是200MB,别一股脑把整个音频库都塞进去,最好做成“边下边存 + LRU淘汰”的策略。至于蓝牙打印这些硬件功能,在小程序里主要走 wx.openBluetoothAdapter 这一系列API,做之前一定先拿真实打印机测试。别指望模拟器能帮你验证蓝牙,模拟器没有蓝牙能力。

5.4 真机预览、调试面板与“卡在debugger”的怪问题

开发完成之后,需要验证真机效果。点击开发者工具顶部的“预览”按钮,会生成一个二维码,用小程序管理员或开发者的微信扫码,就能在手机上打开。

如果你发现自己扫码后打开一个空白页,但开发者工具模拟器正常,优先看“真机调试”而不是“预览”。真机调试就是点“真机调试”按钮,它会生成一个调试二维码,手机扫码后,代码会在手机上运行,但开发者工具里能看到 console 日志、网络请求。

经常有人遇到小程序运行时停在 “paused in debugger” 这个状态,页面像卡住一样。这个通常是因为你打开了调试面板,在 Source 里无意加了断点,或者是因为某些第三方库自带 debugger 语句。解决办法是:在调试面板里点击“Resume”按钮继续执行,或者把断点全部移除,重新编译。如果是真机调试模式下老是自己暂停,检查一下是否开了“自动暂停未捕获异常”,把它关掉就好。

网络问题排查方面,开发者工具自带的 Network 面板已经够用。有人会因为要检查特定的请求数据,去网上找各种抓包工具,这里我不建议在手机上折腾代理抓包,很容易被微信安全机制限制登录。请你优先用小程序官方的真机调试和 vConsole 把问题范围缩小。真机调试连不上时,检查手机和电脑是否同一Wi-Fi,部分企业网络配置了AP隔离,也会导致真机调试失败。

6. 审核上线与后续迭代:从“能跑”到“能发布”

写完了代码,跑通了功能,还真不算完。小程序要上线,还要经过微信审核,这个过程非常考验耐心,而且有很多规则是你在开发时根本不会注意到的。

6.1 发布前对着检查清单自查一遍

我自己的经验是,在点“上传”按钮之前,先花半小时过一遍下面这个清单,能省下至少一周的审核等待时间:

  • 小程序名称、头像、简介、服务类目是否都已完善?类目必须和实际功能一致,比如你做的类似新闻资讯,就不能选“工具”类目。
  • 页面中是否有测试数据、占位图片、开发者的假数据?审核人员看到页面里有明显的测试内容会直接打回。
  • 如果你用了定位、授权、摄像头等敏感接口,是否有对应的用途说明?有些类目授权还需要额外提供资质文件。
  • 是否有明显的“引导用户到外部App/网页下单”的内容?尤其是涉及虚拟支付的,审核时这是高危项。
  • 正式环境服务器域名是否已经配置成HTTPS且证书有效?
  • 有没有内置一个“客服”入口?很多人忽略了设置客服,但微信要求不少类目提供客服能力。

6.2 常见审核退回原因与补救方法

我见过大量审核被驳回的朋友,问题基本都出在这几类:类目不对、功能不完整、小程序里面有“测试”字样、iOS端有虚拟支付按钮、没有隐私保护指引。

其中隐私保护指引是个近年的高频问题。登录、获取微信头像和昵称、获取手机号这些行为,都必须在后台“设置 - 服务内容声明”里填写用户隐私保护指引,如果你的代码里调用了某些API但没声明,或者声明了但代码里并不使用,审核也会被拒。

如果收到“由于你的小程序涉及XX,支付功能暂时无法使用”之类的提示,先停止在代码层面找原因,这通常不是接口问题,而是账号权限层面的处罚或限制。你需要先查看站内信和类目资质,判断是否因为主体资质不符、类目没有相关权限、还是存在诱导支付等违规记录,再按平台指引进行申诉。这里只提醒一句:不要试图用马甲包、换壳App、跳转外部链接去规避平台审核,微信在这方面的检测能力比大多数人想象中强,查出来的代价是功能下架甚至封号。

6.3 上线只是开始:推送消息与用户触达

小程序上线后,有一个常常被忽略但极其重要的运营工具:订阅消息。

订阅消息是微信规定的,用来向用户发送服务通知的一种消息形式,比如订单发货提醒、预约成功通知、日报周报推送。它跟公众号的模板消息类似,但区别很大:订阅消息必须让用户主动授权一次,而且大部分模板只能发一次。如果你想让用户每周都能收到推送,那就需要引导用户每周授权一次。

订阅消息的触发时机也很关键。不要在用户刚进入小程序时直接弹窗让授权,那基本都会被拒绝。更好的做法是等用户完成某个重要动作后,在“正需要被通知”的瞬间弹出授权,比如下单成功后、预约完成后。这样授权率会高很多。技术实现也不复杂,在小程序后台找“订阅消息”,选好模板,然后调用 wx.requestSubscribeMessage 引导用户订阅,再用云函数或后端调用 subscribeMessage.send 发送即可。

另外一种常见触达是公众号关联通知。如果你同时有公众号,可以把小程序嵌入公众号菜单、文章卡片里,形成“公众号引流、小程序做服务”的组合。这种配合对内容型小程序特别有效。

6.4 从MVP开始,后续可以扩展的玩法

如果你把上面这些流程走完了,说明你已经具备独立开发小程序的基本能力了。这时候我自己建议的下一个方向,是扩展AI相关的小程序。

现在搜“AI小程序”已经能搜到不少项目。实现一个AI助手小程序其实不复杂,前端就是聊天界面,后端接大模型接口,并把对话记录存到云数据库中。要注意的是,大模型请求最好放在服务端或云函数里,不能直接在小程序前端用API Key请求,否则API Key会暴露。

如果你想做更细分的应用,比如AI简历优化、AI商品描述生成、AI绘画提示词库,这类小程序只要有一个简洁的输入框,接上大模型API,就能快速做出第一版。个人开发者值得试试这条路,因为内容是差异化的关键,你越懂某个垂直行业,就越容易做出好用的AI工具。

另外,也可以关注uni-app生态里的各种插件市场,有人已经把mqtt、蓝牙、图表、音视频播放等比较麻烦的封装成组件。比如在uniapp里集成mqtt时,注意得用wss协议,不能只传ip地址,小程序端对ws/wss的限制比H5严格,编译前最好在官方文档里查看对应社区的坑。不过和uniapp默认组件不同,这些第三方组件有时更新不及时,别盲选,优先看下载量和issues数量。

个人的一点经验总结

你看完了这么长一篇,估计已经发现:创建自己的小程序,最难的其实不是写代码,而是每一步都充满隐形的规则限制。从注册主体到类目选择,从开发工具到支付权限,从审核到隐私合规,每一个环节都能卡住人。我自己第一次做商城类小程序,光踩坑就花了两周,后来二次开发另一个工具类小程序时,因为熟悉了整个流程,从创建项目到提交审核只用了三天。

所以,如果你想做自己的小程序,我的建议是:先别追求大而全,做一个只解决一个核心问题的MVP版本,然后赶紧走一遍“注册 - 开发 - 真机 - 审核 - 发布”的完整流程。你只有完整跑通一次,才会真正理解这个生态里哪些是自己能控制的,哪些是平台说了算的。等流程熟练之后,再去扩展商城、音视频、AI等功能,心里就有底了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 17:20:49

awesome-macOS:数百款 macOS 实用工具的完整精选指南

awesome-macOS:数百款 macOS 实用工具的完整精选指南 【免费下载链接】awesome-macOS  A curated list of awesome applications, softwares, tools and shiny things for macOS. 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-macOS 刚入手…

作者头像 李华
网站建设 2026/9/8 17:20:42

LD7752 开关电源管理芯片深度解析:核心特性、应用场景与配置实践

快速阅读:LD7752 是一款高性能开关电源管理芯片,支持 4.5V 至 36V 宽输入电压,具备高效率转换、多重保护与轻载低功耗特性,广泛适用于工业控制、通信、消费电子及医疗设备。本文解析其核心特性、典型应用场景与配置实践,并给出 Python 配置示例与工程注意事项。 关键词:…

作者头像 李华
网站建设 2026/9/8 17:18:51

CANape_如何解决标定窗口无法标定的问题

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…

作者头像 李华
网站建设 2026/9/8 17:18:19

土石坝非饱和渗流-应力-侵蚀耦合模型原理与数值实现

1. 为什么要把渗流、应力、侵蚀放在一个模型里1.1 三个过程在土石坝里是怎么纠缠的先说个我常被问到的场景:一座运行了十几年的土石坝,测压管水位一直正常,表面也没有裂缝,可是下游坡脚某个位置开始出现浑浊渗水点,流量…

作者头像 李华
网站建设 2026/9/8 17:17:58

一篇带你了解什么叫做 XSS

XSS简介 (1)XSS简介 XSS作为OWASP TOP 10之一。 XSS中文叫做跨站脚本攻击(Cross-site scripting),本名应该缩写为CSS,但是由于CSS(Cascading Style Sheets,层叠样式脚本&#xf…

作者头像 李华
网站建设 2026/9/8 17:17:52

水务密评三级达标解读:自来水厂等保与密评的区别与关键点

某水司信息科的人,第一次看到"商用密码应用安全性评估"的整改通知时,多半是懵的。通知开头通常是同一句话:“你单位部分信息系统密码应用存在高风险问题,不满足相应等级要求。” 信息科的第一反应往往是——“等保三级我们不是早过了吗?” 这正是本篇要拆的第一件事…

作者头像 李华