先把最重要的话放在前面:
对不起。
"小红花成长"小程序上线运行了 20 多天,我直到最近才发现,成长打卡页面的"上传成长照片"功能在线上无法正常使用。 用户点击上传后,页面没有给出任何有效反馈。没有弹出相册,没有打开相机,也没有告诉用户发生了什么。
对于已经使用过这个功能、点击后却没有得到响应的用户,我想认真说一声抱歉。 也非常感谢这段时间仍然在使用"小红花成长"的每一位用户。
这个小程序目前还很小,使用人数也谈不上多,但后台出现的每一条真实成长记录,对我来说都不是一个冷冰冰的数字。它代表一个真实家庭愿意尝试我的产品,愿意把孩子的一次小进步记录在这里。
正因为如此,这次问题不能用"图片上传是可选功能""不影响大部分主流程"轻轻带过。 对用户来说,按钮能不能用,不分核心功能和附加功能。 只要页面上提供了这个入口,用户点击后就应该得到一个正确结果。持续 20 多天没有发现,对一个已经有真实用户使用的产品来说,就是一次严重的线上事故。
事故表现
小程序的核心流程是:
text
家长创建成长目标
→ 孩子完成后打卡
→ 家长确认
→ 获得小红花
→ 兑换家庭奖励
孩子完成目标时,可以填写一段成长记录,也可以上传一张成长照片。
问题就出现在上传照片这一步。
用户在"记录我的成长"页面点击"添加"后,界面看起来没有任何反应。
根本原因
这次问题不是图片服务器异常,也不是上传接口超时,而是微信小程序隐私接口的声明没有正确生效。
wx.chooseImage 属于涉及用户隐私信息的接口,对应微信后台的声明类型是:
text
收集你选中的照片或视频信息
开发者不仅要在代码中调用接口,还必须在微信公众平台的《用户隐私保护指引》中如实填写使用目的,并等待该指引审核通过。
这次我踩了几个连续的坑。
1. 把代码审核通过误认为功能已经可用
小程序代码发布审核通过,并不等于用户隐私保护指引已经审核通过,更不等于所有隐私接口已经生效。
代码版本、用户隐私保护指引和安全审核是几个相关但并不完全相同的环节。
只盯着"代码审核通过"这几个字,很容易产生一种错误的安全感:
text
既然审核通过了,线上功能应该没问题。
事实证明,不应该做这样的推断。
2. 隐私用途描述不够贴合实际场景
微信审核要求用途描述必须直接对应页面上的真实功能。
类似下面这种说明就过于含糊:
text
用户打卡记录,这个是可选的
"可选"不是接口用途,"用户打卡记录"也没有说清楚为什么要获取图片。
最终收敛后的用途只有一句:
text
上传孩子完成成长目标的成长照片
它与页面中的"上传成长照片"和实际业务操作完全对应,没有附加无关内容。
3. 错误被控制台看见了,却没有被用户看见
图片选择失败后,代码只是把错误输出到了控制台:
javascript
console.error('[onPick] chooseAndUpload error:', error)
线上用户当然看不到控制台。
于是开发者看到的是一个错误对象,用户看到的却只是:
text
我点了,但是没反应。
这是这次事故中非常值得反思的一点。
错误日志是给开发者看的,错误反馈是给用户看的,两者缺一不可。
为什么 20 多天才发现
复盘时最难面对的问题不是"为什么会出错",而是:
text
为什么这个错误持续了 20 多天,我才发现?
原因并不复杂。
图片不是每次打卡都必须上传
大部分用户仍然可以填写文字并完成成长打卡,主流程表面上没有完全中断。
但这反而让问题更隐蔽。
可选功能最容易成为测试盲区:主流程能跑通,开发者就会下意识认为产品总体正常。
对确实想记录照片的用户来说,它却是百分之百的功能故障。
测试停留在"开发环境可用"
隐私接口与普通业务接口不同。
它不仅依赖代码,还依赖微信后台声明、审核状态、当前 AppID、用户历史授权状态和基础库行为。
本地逻辑正确,不代表真实线上环境可用。
这类功能必须在正式配置生效后,使用新用户状态或清除授权数据重新测试。
用户没有方便的反馈入口
也许有用户遇到了问题,只是没有找到合适的地方告诉我。
也许用户点击两次没有反应,就默认这个功能暂时不能用,然后直接跳过了。
用户不反馈,不代表产品没有问题。
很多时候,只是反馈成本太高。
修复过程
这次修复主要做了以下几件事。
1. 收敛图片接口的使用范围
重新排查整个小程序中所有图片选择调用,确保图片接口只服务于一个明确场景:
text
孩子完成成长目标时上传成长照片
删除与当前隐私用途无关的其他图片选择入口,避免代码、页面和隐私说明之间出现不一致。
2. 重新提交用户隐私保护指引
在微信公众平台中声明:
text
收集你选中的照片或视频信息
使用目的填写:
text
上传孩子完成成长目标的成长照片
等待审核通过并生效后,wx.chooseImage 才能恢复调用。

3. 改用微信官方隐私授权流程
不再使用普通弹窗模拟隐私同意,而是交由微信官方隐私授权弹窗处理。
用户首次使用上传功能时,可以阅读并同意小程序隐私保护指引,然后再选择拍照或从相册选择。
4. 给失败状态增加用户提示
现在如果图片权限未声明、声明尚未生效或用户没有同意隐私指引,页面会显示明确提示,例如:
text
图片上传权限尚未生效,请稍后重试
不能再让用户面对一个毫无反应的按钮。
家长模式已经增加反馈联系方式
为了降低反馈成本,我已经在小程序家长模式中增加了用户反馈联系方式:
欢迎正在使用"小红花成长"的家长告诉我:
- 哪个按钮点了没有反应
- 哪个流程不好理解
- 哪个页面用起来不顺手
- 希望增加什么功能
- 哪些功能其实没有必要
不管是建议、吐槽还是问题反馈,我都会认真看。
产品早期最怕的不是问题多,而是开发者不知道真实用户遇到了什么。
除了问题反馈,我也很希望听到大家对后续功能的想法。
我也会根据反馈的普遍程度、实现成本和对家庭使用体验的帮助来安排迭代,不会为了让功能列表看起来丰富而盲目增加功能。
如果你已经在使用这个小程序,欢迎通过家长模式中的联系方式告诉我:
text
你最希望"小红花成长"接下来增加或改进的一个功能是什么?
每一条真实建议,都会成为后续版本规划的重要参考。
写在最后
做个人项目时,很容易把自己放在"作品作者"的位置。
功能做出来了,页面上线了,审核通过了,就会觉得事情暂时告一段落。
但当产品真正有人使用以后,开发者就不能只把它当作品。
它已经是一项正在被使用的服务。
哪怕只有几个用户,哪怕某个功能只是可选项,开发者也应该对每一次点击负责。
这次图片上传问题持续了 20 多天才被发现,是我的疏忽,也是一次应该认真记住的教训。
我会继续完善测试、监控、发布检查和用户反馈机制,尽量不让同类问题再次发生。
最后,再向这段时间使用过"小红花成长"的用户认真说一声:
对不起。
也谢谢你们愿意使用这个还不够成熟的小程序,愿意把家庭里那些很小、但很珍贵的成长瞬间记录在这里。
你们的每一次使用和每一条建议,都是我继续把它做好的理由。
微信小程序体验入口
