uni-app微信分享必须通过uni.share调用且依赖wx.config签名验证,需确保onready后调用、url完整一致、参数严格匹配,并注意朋友圈分享须在用户触发5秒内执行,图片需https直链且尺寸≥300×300px。

uni-app 分享到微信好友必须用 uni.share,但得先过 wx.config
uni-app 里调用分享不是直接唤起微信原生弹窗,而是走 uni.share 这个统一接口,它在微信环境里底层依赖的是微信 JS-SDK 的 updateAppMessageShareData 和 updateTimelineShareData。所以如果分享没反应、提示“config:invalid signature”,八成是 wx.config 没配对——哪怕你只想要分享功能,也绕不开签名验证这一步。
实操要点:
-
wx.config必须在页面onReady或之后调用,不能在onLoad里就急着发请求;否则可能 DOM 未就绪,JS-SDK 注入失败 - 签名用的
url必须和当前页面完整 URL 一致(含 hash、query),不能是 history state 后的路径,也不能漏掉#后面的部分 - 后端返回的
nonceStr、timestamp、signature必须和前端传给wx.config的完全匹配,大小写、空格、换行都不能差 - 测试时用微信内置浏览器打开,别用 Safari 或 Chrome 模拟,否则
wx对象根本不存在
朋友圈分享失败常见于 updateTimelineShareData 调用时机不对
微信从 2021 年起强制要求:朋友圈分享数据必须在用户触发行为(比如点击按钮)后 5 秒内调用 updateTimelineShareData,否则静默失败,控制台也不报错。uni-app 的 uni.share 在 target 为 'timeline' 时会自动转成这个调用,但前提是 JS-SDK 已 ready,且没有被其他逻辑阻塞。
容易踩的坑:
- 在
mounted或onShow里提前调用uni.share({ target: 'timeline' })—— 微信直接忽略,不弹窗也不报错 - 分享前做了异步请求(比如拉取标题/图片),但没用
await等待完成就调用了uni.share,导致传入的title是空或默认值 - 图片链接用了本地
static路径(如/static/share.jpg),微信不认,必须是 HTTPS 可直访的线上地址 - 安卓微信 8.0.33+ 对
imageUrl的尺寸有隐式要求:建议 ≥ 300×300px,否则可能降级显示默认图标
uni-app 条件编译下,uni.share 的参数在不同平台差异很大
同一个 uni.share 调用,在微信、QQ、支付宝、App 端行为完全不同。比如 provider: 'weixin' 在 H5 上根本无效,而在小程序里又必须指定;朋友圈分享在 App 端压根不支持 target: 'timeline',只会 fallback 到好友分享。
稳妥做法:
- 用微信分享时,显式写
provider: 'weixin',别依赖自动识别 - H5 环境下不要传
target,因为 H5 的uni.share实际调用的是浏览器分享 API,只支持文本+链接,不支持图片或自定义 title - App 端分享到微信需提前在
manifest.json里配置weixin的appid和 Universal Links,否则调起失败且无提示 - 真机调试时,iOS 微信分享常因
imageUrl跨域被拦截,加个crossOrigin="anonymous"属性没用,得让后端配好 CORS 或改用 base64 图片(注意长度限制)
调试时看不到错误?检查 uni.getProvider 和 uni.onShareAppMessage 是否冲突
很多开发者发现点分享没反应,console 也没报错,其实是 uni.onShareAppMessage(页面级分享钩子)和手动调用 uni.share 冲突了。前者只在小程序里生效,且一旦注册,就会接管所有分享行为——此时再调 uni.share,等于多此一举,还可能被吞掉。
排查步骤:
- 先确认当前环境:
uni.getSystemInfoSync().platform是ios、android还是mp-weixin - 在小程序里,删掉
onShareAppMessage钩子,只用uni.share测试,看是否恢复 - 安卓真机上分享失败,优先查
adb logcat里有没有WXApi相关报错,而不是只盯前端 console - 微信开发者工具里勾选「不校验合法域名」只是跳过 HTTPS 检查,不影响签名逻辑,别误以为开了它就能绕过 config
最麻烦的其实是签名生成环节:时间戳和服务端不一致、URL 多了个斜杠、JSAPI ticket 拿错了,都会让整个链路静默失败。别猜,把前端拼的签名串和服务端打印的原始参数逐字符比对。










