H5端必须用微信JS-SDK,小程序原生支持分享,App需调用原生SDK;三端逻辑不同,不可混用。可靠判断微信H5需组合检测window.wx、UA及非小程序环境,并验证wx.checkJsApi。

直接上结论:H5端必须用微信JS-SDK,不能靠 uni.share;小程序端根本不用集成——它原生支持 onShareAppMessage 和 onShareTimeline;App端则要走原生插件或微信Android/iOS SDK。三端逻辑完全不同,混用会失败。
怎么判断当前环境是微信H5
不能只靠 uni.getSystemInfo 或 UA 字符串硬匹配,微信内核版本、iOS 微信 WebView、安卓微信浏览器行为差异大。可靠方式是组合检测:
- 检查
window.wx是否存在(脚本加载后) - 验证
navigator.userAgent.toLowerCase().includes('micromessenger') - 排除小程序环境:
!/miniprogram/.test(window.location.href) - 补充兜底:调用
wx.checkJsApi看updateAppMessageShareData是否可用
只满足前两项就贸然执行 wx.config,大概率触发 config:invalid signature 错误。
为什么 wx.config 总是失败
90% 的问题出在签名 URL 和后端生成逻辑不一致。微信校验的是「去掉 hash 后的完整 URL」,但很多项目传了带 # 的地址,或者没做 URL encode。关键点:
- 前端传给后端的 URL 必须是
window.location.href.split('#')[0] - 后端签名时使用的
jsapi_ticket必须是有效期内的,且不能复用过期 ticket -
nonceStr必须每次请求都随机生成(不能缓存),长度建议 16 位以上 -
timestamp是秒级时间戳(Math.floor(Date.now() / 1000)),不是毫秒
哪怕只错一位字符,wx.error 就会抛出 invalid signature,但不会告诉你哪错了。
分享卡片不显示图片或标题怎么办
updateAppMessageShareData 和 updateTimelineShareData 不是“点击即分享”,只是预设文案。用户仍需手动点右上角菜单——这点常被忽略。另外:
-
imgUrl必须是 HTTPS 绝对路径,且服务器需允许跨域(CORS header 中含Access-Control-Allow-Origin: *) - 图片尺寸建议 300×300px,太大(>120KB)可能被微信截断或降质
- 朋友圈分享(
updateTimelineShareData)只读取title,desc和imgUrl会被忽略 - 分享链接
link必须和 JS 安全域名一致,否则 iOS 微信会静默丢弃配置
调试时开 debug: true,但上线前务必关掉——开启后某些 Android 微信版本会阻止分享接口就绪。
uni-app 多端怎么统一调用入口
别写一套 if-else 分支逻辑。推荐用 Composition API 封装一个 useWxShare 工具函数:
export function useWxShare() {
const isWechatH5 = ref(false)
<p>// H5:走 wx.updateAppMessageShareData
// 小程序:return { title, path, imageUrl } 给 onShareAppMessage
// App:调用 uni.share({ provider: 'weixin', ... })</p><p>return {
shareToFriend: (options) => { /<em> 分支实现 </em>/ },
shareToTimeline: (options) => { /<em> 分支实现 </em>/ }
}
}真正的难点不在代码,而在签名服务的稳定性——后端必须能抗住高并发签名请求,且缓存策略要精细到 URL 级。一旦签名接口抖动,整个 H5 分享就不可用,而这个故障点往往被前端忽视。



















