一个不懂代码的人,把微信小程序做上线了.这三天踩的坑我都写下来了
- 2026-10-26 20:10:21

它上线了。
晚上七点半,我在微信公众平台点下了「提交审核」,第二天中午,审核通过。
点完之后,我盯着屏幕愣了几秒。
三天前,我连「云函数」是个什么玩意都不知道。
我不是程序员,平时干的活儿跟写代码八竿子打不着。代码这件事,跟我日常的工作大概隔着十万八千里。
但就是用三个晚上,我用AI把一个微信小程序从零做到了上线。它叫「法考复习指南」,是给法考生用的免费工具,里面有 6936 条法条和司法解释,1424 条常考考点索引。
写这篇文章,不是想说这事有多厉害。是因为我这一路踩的坑,绝大多数做小程序的人都会踩,而且踩完之后你去网上搜,大概率搜不到答案。
更折磨人的是,我遇到的每一个问题,都不是「报错了怎么办」这种一搜就有的事。是那种报错信息里全是我看不懂的词,而教程里的界面跟我电脑上长得完全不一样。
先说这个产品是怎么来的。
坦率的讲,我最初想做的是一个法考刷题工具,这个方向很快就被否了,理由非常硬。
第一,个人主体申请不了教育类目。要挂教育,要么是企业主体,要么得有办学资质加 ICP 备案。我手上只有一张身份证。
第二,微信平台明确禁止展示国家教育考试的真题和参考答案。
第三,这一条最要命。法考官方不公布真题和答案。也就是说,就算我想做,真题这个数据源本身根本不存在。市面上流传的那些法考真题,来源五花八门,没有一个官方的版本。
三条叠在一起,教育这条路,以我的身份走不通。
后来我换了个想法。
法考主观题是 240 分钟,几道大题,全程用考场电脑上统一的电子法条库,不许自带任何汇编。所以考场上真正稀缺的能力,不是在脑子里背,是在几千条法条里飞快地找到那一条。
而市面上的法考产品,大多在做背和刷题,练定位速度的很少。
这就是我的机会。而且这个方向刚好避开了前面那几道门槛。《著作权法》第五条规定,法律、法规、司法解释的原文不受著作权保护。我不做题目,不做解析,只是把公开的法条整理好,让你能飞快找到它。
做这个项目的过程中,我对合规的看法变了。很多人觉得合规是束缚。我现在觉得,合规其实是一把筛子。它帮你筛掉那些你根本做不了的方向,剩下的才是你的地盘。要是我一开始死磕刷题,三天时间大概率全花在找资质上,最后发现根本过不了审。
方向定了。但这三天里,产品形态被我推翻了三次,每一次都不是我自己想明白的。
第一次推翻,是从「计时找条号」改成卡牌。
我一开始的设想是,用户计时,快速找到某个条号,练反应速度。后来有人跟我说,纯背法条序号没有意义。记住「第 172 条是表见代理」,换个问法还是不会用,而且条号会随法律修订变化。
这话是对的。我把它改成了卡牌。正面写一个考点情境,翻过去是条文原文。练的是条文内容,考场上能直接援引。
改完我发现还捡了个便宜。这个改法顺手把合规问题也解决了。正面只写情境导航,背面是官方条文原文,两头都不越教育类目的界。
第二次推翻,是「加注册」。
有人提意见说需要一个注册页面。但小程序没有注册这个概念,用户打开就用,身份由微信自动识别。真要做,就是手机号加短信验证码,还要弹隐私协议,审核反而更麻烦。
我最后做的是「个人设置」,只让用户选考试年份和关注科目,不碰手机号。不做注册还有一个更实在的理由。真正会丢数据的场景只有一个,就是换微信号。而换微信号的人,注册也救不了他,他得重新注册再手动同步一遍。所以我去做的是备份导出,把进度生成一段文本,用户自己存着,换设备粘贴回来。比强制注册轻得多。
第三次推翻,是搜索。
原本我只做了按条号搜。有人说,搜一个知识点就该能搜到相关法条。这个提醒点到了要害。用户脑子里的检索入口是知识点,不是条号。所以我又做了一个按考点搜的通道,输入「相对人信赖」这种词,直接给出相关条文和原文。
三次推翻,没有一次是我自己想出来的,都是别人用一句话点醒我。这件事让我明白,做产品最难的不是把它做出来,是知道该做什么。
方向定完,第一个大麻烦是数据。
我手上最初只有 23 条试数据。
23 条。而法考涉及的法条是万级的量。这个差距有多离谱呢,我试着搜「善意取得」,0 条。搜「表见代理」,0 条。搜「不当得利」,0 条。
我一度以为搜索功能写坏了。查了半天代码,才发现代码没问题,是库里压根没这些条文。
从 23 条扩到 6936 条,中间隔着一段特别折腾的路。
我最先想到的是国家法律法规数据库,那是官方的权威来源。但它只提供逐条浏览,没有批量导出的入口,几千条条文一条条点,不现实。
我也没想过绕过它的限制。网站怎么设计是人家的自由,硬绕既不体面,也不稳,人家改一次版,你就全废了。
转机在公开的法律文本。我实测发现,不少权威机构官网公布的法律全文,页面就开放着,看得见,也存得下。就这样,我先把 26 部司法解释整理了下来。
法律正文是另一条路。国家数据库不给批量,但很多机构官网都会全文公开法律法规。民法典 1260 条一条不少,刑法的条文正文,都是这样从公开发布的页面上整理下来的。
这块的坑,是全项目最密集的。
先是编码。有一个页面是 GB2312 编码,我按 UTF-8 去解,解出来一片乱码,程序识别出的条号是 0 个。我当时以为是页面里没内容,差点放弃这个来源。后来改成按页面自己声明的编码去解,才对上。
接着是一个我完全没想到的东西。有的页面用   和 两个 HTML 实体做条号和正文之间的间隔。不解码它,条号和正文就粘成一行,程序匹配「第 X 条」永远匹配不到。症状跟编码问题一模一样,都是条号 0 个,特别容易误判。
还有章节标题污染。转载页面里最后一条法条后面直接跟着下一章的标题,独占一行。民法典 1260 条里,有 109 条的正文尾部被粘上了章节标题。后果就是搜「自然人」会命中监护那一章,牛头不对马嘴。
修这个污染的时候我又误伤了。一开始我简单粗暴地按「本编第 X 章」的特征去删,结果把 14 条正常的法律条文切坏了。比如第 424 条写的是「最高额抵押权除适用本节规定外,适用本章第一节的有关规定」,这是正文里正当的法律引用,被我当成章节标题删了。
最后定的判据是,章节标题独占一行而且整句没有标点,正文引用一定带标点。这样才既把污染清到 0 条,又没伤到任何一条正文。
刑事诉讼法走的是第三条路,PDF。我一开始找到的版本只有后半截,最后找到的是一份公开发布的完整 PDF,71 页。转成文本后提出 308 条,从第一条到最后一条完整。
PDF 提文本也有坑。我过滤页眉用的规则是「行很短且含中华人民共和国」,结果误删了第 2 条和第 18 条。为什么?因为这两条正文里正好提到「中华人民共和国刑事诉讼法的任务」。
误删法条这种事,性质比排版错乱严重得多。我改成「同一行重复出现三次以上才算页眉」,308 条才全保住。
数据整理完,还有一个我完全没预料到的问题。
我往库里灌了真数据,然后搜「表见代理」。
0 条。
我查原始数据。《民法典》第 172 条白纸黑字就是表见代理的规则,但它通篇没有「表见代理」这四个字。原文的写法是「有理由相信行为人有代理权」。
我这才反应过来。表见代理是教材术语,不是法定表述。法考的书上都这么叫,可法律原文里从来不这么写。
这样就有一个问题。如果我只做法条原文的搜索,用户脑子里想的那个词,跟条文里写的那个词,根本对不上。
我加了一层术语映射,大概 60 组,把教材里的说法转成条文的法定表述。搜表见代理,实际去搜「有理由相信行为人有代理权」。实测下来能出 8 条,善意取得 20 条,正当防卫、不当得利、无因管理这些都能搜到了。
这层映射我只写「这个说法等于那个法定表述」,绝不写「这个知识点怎么考」。这是产品定位的底线,写多了它就不是检索工具,变成教辅了,类目那一关立刻过不去。
到这里,6936 条法条齐了。后面就是上线。也是我踩坑踩得最惨的一段。
第一个坑,简单到我想抽自己一巴掌。
我在本地把代码调通了,高高兴兴上传了体验版,用手机一搜,还是那 23 条。
排查了半天。原因是我代码里有个开关叫 useMock,意思是「用假数据」。我本地调试的时候一直开着它,忘了关。
结果就是,本地跑得好好的,线上跑的是假数据。你在模拟器里看到的一切正常,全是幻觉。
这个坑说到底是,本地能跑跟线上能跑是两件完全不同的事。我把代码上传了,但上传的是带着调试开关的代码。
第二个坑,是云函数部署。
云函数这个概念,我一开始完全不懂。后来才明白,它是跑在微信服务器上的一段代码,你的小程序要查数据库,得通过它去查。
我在开发者工具里怎么都找不到部署的入口。截图发过去问,才发现自己停在「调试器」面板里,文件的目录树根本没显示出来。恢复布局之后,又卡在「未选择环境」几个字上。云函数的文件夹后面跟着灰色的「未选择环境」,右键菜单里没有「上传并部署」这一项。
这个「选择环境」的操作,官方文档里藏得特别深。正确做法是右键那个文件夹,菜单第一项叫「当前环境」,右边有个小三角,点开选你已经创建的环境。
我在这上面来回折腾了快一个小时。中间还有个小插曲,我跑到云开发控制台点了「新建云函数」,建了个空壳出来,以为自己把代码传上去了。真相是,控制台建出来的只是官方示例的空模板,我的代码和数据一个字都进不去。
第三个坑,是我自己写错的。
我一开始跟人讲,把云函数的超时改成 120 秒。后来我去查证,微信云函数默认超时是 3 秒,上限是 60 秒,根本没有 120 秒这种东西。
我一开始写的就是错的。我照着想当然的数字写了一版说明,还改了配置文件。这个必须承认,我确实搞错了。
第四个坑最要命。一次导入 8360 条。
数据备好了,云函数也部署了,我点下导入按钮。等了几秒,屏幕上冒出一行看不懂的英文。
scf/Invoke 请求失败 system error
???
我完全不知道这是什么意思。查了半天才搞明白,云函数默认超时只有 3 秒,而我要往里写 8360 条数据,3 秒肯定写不完,被系统掐断了。
而且当时我犯了个错,一次把全部数据都丢进去。6936 条法条加 1424 条考点,一起写。
解法是把导入切成小片。每次写 600 条,一批一批来。6936 条切成 12 批,1424 条切成 3 批。每一批几秒钟就跑完,再也不会撞超时。
改完再跑,屏幕上的数字开始一段一段往上跳。已写 600 条,已写 1200 条,已写 1800 条……
最后停下来的时候,上面写着两行字。
laws 6936/6936 条已写入
points 1424/1424 条已写入
那一刻我是真的有点激动。三天前我连云函数是什么都不知道,现在我看着自己的程序把 6936 条法条一条不少地搬进了数据库。
中间还有件小事想说说。为了找到写数据的办法,我试过用云端密钥直接连数据库。结果一直报错,说我这个环境不存在。查了半天才发现,我手上那串密钥属于另一个账号,根本访问不到我这个小程序的环境。
最后反而是最简单的办法成了。我把数据文件直接打包进云函数,让云函数用它的身份去写。不需要密钥,不需要我登录,云函数跑起来的时候自己就带着权限。
这事给我的感觉挺奇妙。我花在绕路上的时间,比花在正路上的还多,而最后解决它的方案,简单到有点好笑。
功能做完之后,还有几件事让我印象很深。
有一件是人家报给我的问题。我在手机上搜「134」,跳出来的列表居然从第 121 条开始,134 条排在这一屏的第 14 行。
我一开始以为是搜索写错了。查完才发现,是我「跳到第 N 条」这个功能的设计本身有毛病。
我原来的做法,是用条号去猜页码。第 134 条嘛,一页 20 条,那就是第 7 页。算式是条号减一再除以每页条数,再加一。
问题是,这个第 7 页里装的,是按排名排出来的第 121 到 140 条。
我这才明白过来。页面是按排名切分的,而用户要找的是条号,这两个东西只要对不齐,算出来的页码就一定是错的。而刑法里有 53 处「之一」「之二」这种附加条号,条号和排名差得更多,页码还会整体往后漂。
后来我改了做法。不再猜页码,直接把条号当成查询的起点。要第 134 条,就让它从第 134 条开始往后取,第一条必然是 134。
这个事让我琢磨了很久。因为我猜页码的思路,一开始看起来是完全合理的。只要条号连续,它就能算对。可现实里条号就是不连续的。一种看起来对、实际必错的方案,比一个明摆着的错误危险得多。
还有一件事更有意思。
我给小程序做了个自检页,一进去就自动检查各种功能是否正常。有一次它报了三个红点。
三个红点,对应三个核心功能。我挨个查。
第一和第二个是真 bug。其中一个特别隐蔽,我用了一行看起来完全正常的代码去拼查询条件,结果云数据库的查询指令被摊平成一个普通对象,语义直接丢了。这行代码不报错,它只会安静地返回空结果。你不去核对数据,永远发现不了。
第三个红点,查到最后发现是我的自检程序自己搞错了。
它拿去测试的那个词,是我从脑子里随便想的一个,叫「相对人信赖」。我把 1424 条考点数据翻了个遍,这个词在这里面一条都没有。
也就是说,那个红点不是功能坏了,是我的测试用例用了数据里根本不存在的词。程序老老实实告诉我搜不到,我就以为功能坏了。
这事让我记住一个教训。做自动化检查的时候,测试用例里的数据必须从真实数据里捞出来,不能凭想象写。凭想象写出来的用例,检出的不是 bug,是自己的幻觉。
最后是审核这一关。这是所有做小程序的人都要过的一道门,我觉得这部分对大家最有用。
先说类目。我的小程序选的是「工具 - 实用工具」。千万别选跟教育、法律咨询沾边的类目,个人主体开不了,要资质要备案,一申请就被打回来。
然后是隐私。微信有一个《用户隐私保护指引》,要在后台填,不填审核直接拒。我一开始完全不知道有这东西。
填之前我做了一件事。我把整个小程序的代码从头到尾扫了一遍,确认它到底有没有采集用户信息。
结论是没有。没要手机号,没要位置,没碰相册、摄像头、麦克风、通讯录,没拉微信昵称和头像,也没在后台悄悄往外发数据。整个小程序连一次对外的网络请求都没有。
有一个东西是绕不开的,叫 OpenID。这是微信自动给每个用户分配的编号,用户自己看不到,也不需要授权,我用它来区分这是谁的数据。它里面没有姓名也没有手机号,不算个人信息,但没有它,你的数据就没法隔离。
我唯一需要在后台声明的接口是剪贴板。因为复制条号、复制条文这些功能要用到。微信要求这类接口必须在隐私指引里勾选,用途写清楚。这一项不勾,审核会被驳回。
还有个细节。我做了「清空我的数据」这个按钮,因为用户有权删除自己的数据。结果自查的时候发现,我删得不干净,有一个集合漏掉了。用户行使自己的删除权,结果数据没删完,这在审核里是个风险点。后来改成循环删到空。
这一段我特别想说一句。很多人做小程序的顺序,是做完了再回头补合规。这个顺序是错的。合规应该在你写第一行代码之前就搞清楚,因为它会直接改变你的产品形态。我这个项目,光是「不碰真题、考点只写导航不写讲解」这一条线,就决定了整个产品长什么样。
还有一件事,是我自己吓自己。
我写了一份免责声明,八节。因为法条是我一条条从公开渠道整理出来的,我怕出错惹麻烦。写完我还挺得意,觉得考虑得很周全。
后来做隐私核查的时候我往回翻,发现里面有一句话是错的。我写的是「练习记录和复习队列保存在你的本地缓存中,不会上传」。实际上它们是存在云端的。
这句话是我自己写的。我写的时候以为它就是本地存的。
一份说错话的免责声明,比没有免责声明更危险。不写是没承诺,写错了是虚假陈述。我把它整段重写了,如实说清楚什么是本地的,什么是云端的,怎么删。
写免责声明的时候还有个思路我觉得挺有用。因为我强调这个小程序完全免费、无偿使用,那我在声明里就把免费和不担保绑在一起说。免费提供跟不承担担保责任,在道理上是对等的。同时我不承诺内容绝对准确,只承诺来源是官方公开渠道,并且写明如果发现错误欢迎反馈。
有免责,也有纠错通道,比单纯甩锅可信得多。这是写这一段的时候我最想清楚的一件事。
如果看到这里的你,也想自己做一个小程序,我想留几条我踩出来的经验。
1、先把合规搞清楚,再动手。类目选什么、能不能采集信息、要不要资质,这决定了你的产品是做得了还是做不了。这部分花的每一分钟都不会白费。
2、数据只认官方来源。法律、司法解释的原文是公开的,谁都可以查、可以用,我把它们从官方和权威渠道公开发布的地方整理下来。至于第三方的题库、数据库、机构整理的东西,一个字都不碰。来源说不清楚的东西,留着就是个雷,早晚要炸。
3、本地能跑跟线上能跑是两件事。上线之前,把所有调试用的开关挨个检查一遍。
4、找不着北的时候,截图,然后把截图给别人看。我这次遇到的几乎所有问题,都不是靠搜关键词解决的,而是靠把我看到的画面描述出来。因为小程序的开发工具不同版本界面差别很大,网上的教程跟我电脑上长得完全不一样。
5、遇到报错,先别急着改代码。我吃的最大的几个亏,都是因为报错信息在说 A 问题,我却在改 B。比如那个 system error,它说的是超时,我却先去怀疑数据格式。
说了这么多踩坑,也说说它现在到底能干什么。
打开之后底下是四个入口,首页、卡牌、搜知识点、我的。核心是两张牌。
第一张叫卡牌。正面是一句考点情境,比如「有理由相信对方有代理权,这份合同算不算数」,你心里先答一遍,翻过去就是《民法典》第 172 条的原文。答得出就过,答不出点「没记住」,它会自动进复习队列,下次专门等你。为什么不做成背条号,因为记住「第 172 条是表见代理」,换个问法你还是不会用,条号本身也会随法律修订变化。背条文本身,考场上才能直接援引。
第二张叫定位训练。它不给你答案,只给你一个情境,让你自己去找条文,找到再把条号输进去。系统当场结算你找得对不对、用了几秒。练的就是考场上最要命的那件事,240 分钟,几道大题,几万条法条,你找得完吗。
搜索有两个入口,分工很清楚。搜知识点是给想不起条文的人用的,脑子里只剩「表见代理」四个字,输进去,直接给条文原文。搜法条是给知道条号的人用的,输 172、民法 172、民法典 172 都认,要第几条就是第几条,不会从第 121 条开始。
还有一个法条目录。全量库现在是 29 部法律加 32 部司法解释,6936 条。不知道有哪些、该从哪找,就先翻目录,两栏切换,带名称筛选和条数。
剩下的都是些小东西。常用法条是按学科分好的精选集,1424 条,都是常考高频的条文。我的收藏是看哪条点哪条,星标存着。复习队列收着你答错和超时的。迁移对照表是给同时考 CPA、税务师的人看的,它会告诉你哪些不用从零学。备份恢复把进度生成一段文本,换手机粘回来就行。还有每天打卡的连续天数,督促你别断。
全部免费,没有课程,没有题库,也不含任何真题。我做的只是把公开的法条整理好,让你找得到。
最后我想说一点关于 AI 的。
这三天里,我大概有一半的时间在跟 AI 说「这是什么意思」。我说得最多的几句话是,报错了,下一步怎么做,我看不懂这行,还有你确定吗。
我发现一件挺反常识的事。AI 并没有让「不会写代码」这件事彻底消失,它只是把卡住你的地方换了个位置。
以前一个人做产品,卡在写不出代码。现在代码这部分确实有人替你写了,但你会卡在别的地方。卡在你不知道该问什么问题,卡在你分辨不出 AI 说得对不对,卡在你不知道一个功能做出来了该怎么验收。
我这三天里最耗时间的,从来不是等它写代码,是判断。判断这个功能该不该做,这个数据能不能用,这句话能不能写进免责声明。
而判断这件事,恰好是你自己的常识在起作用。我不是程序员,但我知道法条原文和教材表述是两回事,我知道一个人免费做的东西不能承诺绝对准确,我知道跟教育、医疗、法律沾边的类目一定有资质门槛。这些判断,AI 帮不了我。
所以我现在的感觉是,AI 把你从「不会写代码」里解放出来,然后把你送到真正属于你的地方去。那个地方可能是一个只有你能想到的产品方向,也可能是一个只有你会遇到的判断。
历史上,做工具的要么是公司,要么是懂技术的人。现在这个门槛降到了「有判断力的人」这一层。我觉得这是件挺大的事。
这个小程序已经上线了。它会不会被人喜欢,我不知道。
但三天前,我连云函数是个什么玩意都不知道。
如果你也有一个想了很久、又总觉得「我肯定不会做」的小东西,我建议你,今天就动手试试。
先别想着做完,先把它做出第一版。
对了,还有件事得提前交个底。微信云开发的免费环境,是跟着上线时间算的,小程序发布之后第 15 天到期。我 13 号上线,算下来就是这个月底。
也就是说,这个月底之前它是白用的。月底之后,我不打算续费。
这玩意对我来说,从头到尾就是一次开发尝试。我想验证的就一件事,一个不懂代码的人,靠 AI 能不能把一个小程序从零做到上线。现在这个问题有答案了,能。验证完的东西,我没必要一直养着它。
所以想试的话,趁早。月底之后它大概率就打不开了。
不是跑路,是我本来就没打算让它一直开着。
想用的,长按识别下面这张小程序码,或者在微信里搜「法考复习指南」。免费的,月底之前都能用。

以上,如果你也在折腾小程序,或者踩过我上面说的某个坑,欢迎在评论区聊聊。
📢 一则小广告
你不是不自律,你只是缺一个不得不学的环境
我建了一个初级、中级、税务师、注会陪跑群。不是培训班,不是直播课——那些你买够了。
群里只做四件事——每日打卡互相监督、难题互助随问随答、考前焦虑共担、一次45分钟语音咨询。
199元管一年。留下的都是真想考过的人。
私信公众号,备注考试名称,赞赏或者转账199,拉你进群。