onshareappmessage 必须返回完整 path 字符串,如 path: '/pages/detail/detail?id=123',不可拆分 query 对象;参数需 encodeuricomponent 编码;路径须与真实页面路径严格一致;冷启动 onload 才有 options,热启动仅触发 onshow 且 options 为空。

onShareAppMessage 必须返回完整 path 字符串,不能拆 query 对象
uni-app 的 onShareAppMessage 不支持像 Vue Router 那样传 query: { id: 123 } 对象,它只认字符串形式的完整路径。返回对象里写 path: '/pages/detail/detail?id=123' 才有效,写成 path: '/pages/detail/detail', query: { id: 123 } 会被忽略——这是最常导致参数丢失的写法。
实际拼接时注意三点:
-
id、title等值必须用encodeURIComponent()编码,尤其含中文、斜杠、空格时,否则跳转后options为空或截断 - 路径末尾不能多加
?或&,比如path: '/pages/detail/detail?&id=123'会导致解析失败 - 路径必须和目标页面真实路径完全一致:大小写、层级、.vue 后缀(不写)、结尾斜杠(不加)都不能错
冷启动时 options 才有值,热启动拿不到
用户点击分享卡片进入小程序,首次加载会触发目标页的 onLoad,此时 options 参数才可用。如果小程序已在后台运行,用户从聊天窗口点开卡片,只会触发 onShow,而 options 是空的——这不是 bug,是微信原生机制,uni-app 没做额外桥接。
所以别在 onShow 里依赖 options 取转发参数;需要兼容热启动的场景,得自己存 localStorage 或用 getCurrentPages() 拿上一页数据,但后者不稳定,慎用。
朋友圈分享 path 字段不支持动态参数拼接?其实是支持的,但格式极严
微信朋友圈分享走 onShareTimeline,它的 path 字段确实只接受合法小程序路径,但“合法”包含带 ?key=value 的完整 URL。很多人误以为朋友圈不能传参,其实是写法错了:
- 必须写成
path: '/pages/home/index?id=123',不是query: 'id=123' - 中文/特殊字符同样要
encodeURIComponent(),比如path: '/pages/home/index?name=' + encodeURIComponent('张三') -
imageUrl必须是 HTTPS 直链,且尺寸 ≥ 300×300px,否则卡片空白,和 path 无关
调试时 options 为空?先检查这三处硬性条件
真机上 onLoad 的 options 为空,90% 是以下三个条件没同时满足:
-
onShareAppMessage函数必须定义在页面级(与data、methods平级),不能塞进methods里,否则微信根本不会调用 - 分享卡片必须通过“点击进入”触发,微信开发者工具里单纯“编译预览”不会注入
options,得点右上角「重启并打开分享面板」再试 - 长按分享卡片 → 「复制链接」→ 粘贴到浏览器看 URL:如果地址栏里没有
?id=xxx,说明拼接逻辑错了;如果有但页面收不到,大概率是路径名对不上(比如写了/pages/detail/index,但实际文件是/pages/detail/detail.vue)
路径对齐这件事,差一个字母、一个斜杠,options 就是空对象,没有任何报错提示,最容易被忽略。











