上线 20 多天后,我才发现小程序的图片上传一直不可用

先把最重要的话放在前面:

对不起。

"小红花成长"小程序上线运行了 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 多天才被发现,是我的疏忽,也是一次应该认真记住的教训。

我会继续完善测试、监控、发布检查和用户反馈机制,尽量不让同类问题再次发生。

最后,再向这段时间使用过"小红花成长"的用户认真说一声:

对不起。

也谢谢你们愿意使用这个还不够成熟的小程序,愿意把家庭里那些很小、但很珍贵的成长瞬间记录在这里。

你们的每一次使用和每一条建议,都是我继续把它做好的理由。

微信小程序体验入口

相关推荐
万亿少女的梦1682 天前
基于微信小程序、Spring Boot与Vue3的智慧养老管理系统设计与实现
spring boot·redis·微信小程序·mybatis·vue3
alxraves3 天前
零代码AI助手:用大模型自动生成微信小程序界面与逻辑
人工智能·微信小程序·notepad++
秃头披风侠_郑3 天前
【uniapp】一文让你学会微信小程序+APP+H5全平台实战指南
前端·微信小程序·uni-app
爱勇宝4 天前
一个家庭成长小程序的 MVP 复盘:看到用户在用我很欣慰
微信小程序·产品·设计
这是个栗子5 天前
uni-app微信小程序开发:高频核心 API(三)
微信小程序·小程序·uni-app
quweiie5 天前
thinkphp8结合jwt与微信小程序接口鉴权
微信小程序·小程序·thinkphp接口·接口鉴权
didiplus6 天前
我在GitHub刷到一个诗词API,顺手写了款小程序
微信小程序
小码哥0687 天前
医院陪诊小程序怎么开发-医院陪诊小程序源码功能-微信小程序 医院健康陪诊陪护系统
微信小程序·小程序·医院陪诊·陪诊系统·陪诊陪诊
书中枫叶8 天前
从「上次几点喂奶」到全栈小程序:我做了个喂宝助手
mongodb·微信小程序·node.js