根本原因是微信对h5分享的域名访问路径有硬性限制:仅公众号菜单、扫码、收藏等可信入口打开的页面才支持卡片展示,其他方式均降级为纯链接;且签名url必须去除hash,spa路由切换需重新签名并调用wx.config。

为什么分享到朋友圈只显示链接,不显示卡片?
根本原因不是 uni-app 写得不对,而是微信对 H5 分享的“域名访问路径”做了硬性限制:只有通过公众号菜单、扫码、收藏后打开的页面,才允许触发 updateTimelineShareData 渲染卡片;直接粘贴链接或从非可信入口(比如浏览器地址栏输入、微信会话里点开)进入的页面,哪怕 config 和 ready 全部成功,也只会 fallback 成纯链接展示。
这不是签名失败,也不是 JS-SDK 没加载,是微信客户端主动降级——你调了、它收了、但它不渲染卡片。
- ✅ 正确入口:公众号自定义菜单跳转、带参数的二维码扫码、用户收藏后点开
- ❌ 无效入口:微信聊天窗口粘贴 URL、浏览器直接访问、Safari 打开、微信内“浮窗”点开
- ⚠️ 注意:uni-app 的
router.push或uni.navigateTo在 H5 环境下本质仍是 URL 跳转,若目标页未走上述可信入口,照样不显示卡片
uni-app 中 wx.config 签名必须用「无 hash 的当前 URL」
微信 JS-SDK 的 signature 是后端根据当前页面完整 URL(不含 # 及之后)+ nonceStr + timestamp + jsapi_ticket 等生成的。uni-app 默认使用哈希路由(/#/pages/index/index),但微信校验时只认 location.href.split('#')[0] 这部分。
如果你把带 # 的 URL 直接传给后端签名,后端算出的 signature 一定校验失败,wx.ready 不会触发,所有分享接口静默失效。
- 务必在调用后端签名接口前剥离哈希:
const url = window.location.href.split('#')[0] - 不要用
uni.getStorageSync('currentUrl')或 history.state —— 它们可能滞后或为空 - SPA 路由变化时(如 tab 切换),需重新请求签名并调用
wx.config,否则新页分享配置不会更新
分享数据必须在 wx.ready 里设置,且 API 名已更新
微信早在 1.4.2 版本后废弃了 onMenuShareTimeline 等旧接口,uni-app H5 环境必须用 updateTimelineShareData(朋友圈)和 updateAppMessageShareData(好友)——即使你引入的是 jweixin-1.6.0.js,老写法也会直接报错或无反应。
-
wx.ready是唯一安全调用时机,onLoad或onShow里直接调会失败 - 两个接口都要求传
title、desc、link、imgUrl,缺一不可;link必须和签名时用的 URL 同源且路径一致(建议统一用window.location.href.split('#')[0]) -
imgUrl必须是 HTTPS、可公开访问、尺寸建议 ≥ 300×300px,否则卡片可能不显示图片
后端签名接口最容易被忽略的三个细节
签名本身不难,但 uni-app H5 场景下,90% 的问题出在后端返回参数没对齐微信要求,前端又没做容错,导致 config 报 invalid signature 或 config:fail error 却查不出原因。
-
appId必须和公众号后台「开发者中心」里的一致,不是小程序的 AppID,也不是开放平台的 -
timestamp必须是整数秒(Math.floor(Date.now() / 1000)),不能带毫秒,也不能是字符串 -
nonceStr必须是纯字母数字、长度 16–32 位,不能含下划线或短横线(微信校验严格);很多后端用uuid.v4()返回带-的字符串,会导致签名失败
真机调试时,打开 debug: true,看 alert 弹窗里的错误提示,比 console 日志更直接——微信客户端的报错信息往往就藏在那里面。











