uni-app微信小程序群分享必须在页面export default中定义onShareAppMessage函数并返回含title、path(需带参数)及withShareTicket: true的对象,通过uni.getShareInfo获取openGId,且须配置requiredPrivateInfos、真机调试验证。

uni-app 微信小程序群分享必须用 onShareAppMessage 且返回 shareTicket
微信小程序原生支持群分享的关键是 onShareAppMessage 回调中返回的 shareTicket 字段,uni-app 中同样依赖它——但默认不自动透出,需手动配置并处理。很多开发者卡在“点了分享没群信息”或“shareTicket 为 undefined”,根本原因是没在页面生命周期里正确声明回调,或没在转发时显式启用群能力。
实操要点:
- 必须在页面(
.vue文件)的export default选项中定义onShareAppMessage函数,不能只写在methods里 - 返回对象中必须包含
title、path,且path需带参数(如path: '/pages/index/index?from=group'),否则群分享入口可能被折叠 - 要获取群票据,必须在返回对象中加
withShareTicket: true(注意不是shareTicket: true) - 仅当用户从「群聊」点击该分享卡片进入时,
onLoad或onShow的options中才可能有shareTicket;单独转发给个人不会携带
onLoad 中拿不到 shareTicket?检查 getShareInfo 调用时机和 scope 声明
即使分享时设置了 withShareTicket: true,页面 onLoad 接收到的 options 里也大概率只有 scene 和 query,shareTicket 不会直接出现在里面。这是微信限制:票据需通过 wx.getShareInfo(uni-app 中为 uni.getShareInfo)解密获取,且必须在用户点击分享卡片后的 5 分钟内调用。
常见错误与对策:
- 在
onLoad里直接调uni.getShareInfo({ shareTicket: options.shareTicket })→ 报错shareTicket is required,因为options.shareTicket根本不存在——正确做法是先判断options.scene === '1089'(群聊场景值),再尝试从options中取shareTicket,但实际仍为空,得靠uni.getShareInfo的回调参数返回 - 未在
app.json或mp-weixin.json中声明"requiredPrivateInfos": ["getShareInfo"]→ 小程序基础库 2.27.0+ 强制要求,否则getShareInfo直接失败,控制台报permission denied - 用户未授权或拒绝过权限 →
getShareInfo返回errCode: -1,需提示重新触发分享(不能静默失败)
群分享票据解密后拿到的是 openGId,不是 groupId
调用 uni.getShareInfo 成功后,返回的 res 是一个对象,其中 res.openGId 才是当前群的唯一标识(类似群的 openID),而 res.cloudID 已废弃,res.groupId 并不存在。很多开发者误以为能拿到微信群 ID 或名称,实际上微信只提供 openGId,且该字段仅在群内打开时有效、不可跨群复用。
注意事项:
-
openGId是服务端校验群身份的核心依据,前端拿到后应立即传给后端,由后端用access_token+openGId调用微信接口https://api.weixin.qq.com/wxa/get_group_info获取群名等扩展信息 - 前端不应缓存
openGId长期使用,每次进群都应重新走分享→进入→getShareInfo流程 - 若后端校验失败,常见原因是:
access_token过期、openGId已失效(超过 24 小时)、或当前小程序未开通“获取群信息”类目权限(需在 MP 后台提交审核)
真机调试才能验证群分享逻辑,开发者工具无法模拟 shareTicket
微信开发者工具对群分享的支持极弱:即使手动修改 scene 为 1089,也无法生成有效的 shareTicket,uni.getShareInfo 必然失败。所有逻辑必须在真机上测试,且需满足三个硬条件:① 小程序已上传体验版或正式版;② 测试账号已在后台配置为体验者;③ 分享操作必须由真实微信群内发起(不能是单聊或桌面快捷方式)。
调试建议:
- 在
onLoad中加console.log('scene:', options.scene, 'query:', options.query),确认是否进入群场景(scene === '1089') - 在
getShareInfo的 success 回调里打印res,确认openGId是否存在;失败时打印err看具体 code - 避免在
onShow反复调用getShareInfo,一次成功即可,重复调用可能因超时或票据失效导致失败
群里转发路径和票据解密是链式动作,任一环节断开都会导致 openGId 拿不到。最常被忽略的是 requiredPrivateInfos 配置和真机验证环节——没配就永远拿不到,不真机就永远看不出问题。



















