本文针对Vue单页应用在微信内分享时,iOS端出现签名不正确及Android端正常的兼容性问题进行解析。核心原因在于iOS微信浏览器不刷新页面地址,导致分享链接与签名URL不一致。通过在前端请求后台签名前截去URL中#号后的参数,确保签名URL与当前页面实际URL一致,从而解决iOS与Android的分享回调差异。
Vue微信分享需求与基础配置
业务需求要求在微信环境中手动配置分享链接、图片及描述内容,以引导用户进行分享操作,并在分享成功的回调函数中执行相应的业务逻辑。
首先,需在项目中引入微信JS-SDK,并通过后端接口获取必要的签名信息。

封装一个用于获取微信分享必填参数的函数。

在配置的jsApiList中,需填入所调用的微信JS接口列表。其中,用于生成签名的URL参数默认取值为location.href,即当前页面的完整URL。
在需要实现分享功能的页面中,引入上述封装好的函数。

调用wxShare方法,将当前URL及配置好的参数传入。需要注意的是,link参数即分享出去的链接,必须与该页面绑定的JS安全域名保持一致。

...shareData表示在函数内部传递的对象,通过ES6的解构赋值语法进行参数处理。

iOS签名不正确问题分析
然而,在测试过程中发现以下问题:
1. 同一套代码在Android端分享正常,但在iOS端报签名错误。主要原因是微信对iOS和Android的处理机制不同:iOS微信浏览器不会刷新当前页面地址,而是使用历史记录中的地址。因此,每次分享出去的链接实际上是用户首次进入系统页面的URL。当用户跳转至子页面时,系统检测到打开的URL与生成签名时的URL不一致,从而导致签名验证失败。
2. Vue单页应用的Hash模式自带#号,但在分享过程中,#号后的参数会被视为无效,导致参数无法传递。解决方法是创建一个不带#号的页面,统一携带参数分享至此页面,再重定向至指定的Vue页面。
URL截取解决方案
解决方案:在向后台请求微信签名时,前端需将传给后台的URL中#号及其后的参数截去。后台根据截取后的URL生成签名,即可解决Android和iOS分享回调成功的问题。

Vue与微信调试环境兼容性问题
补充知识:使用Vue全家桶进行微信分享时可能出现的其他错误。
在使用Vue.js开发微信H5页面时,流程通常为先进行OAuth身份验证,随后使用JSSDK进行微信分享。在分享时,有时会出现自定义分享界面未调用的情况,但刷新页面后可正常显示。
具体表现如下:
正常进入分享流程时的状态:

刷新页面后进行分享的状态:

由于Vue框架与微信调试环境的兼容性问题,经过多次尝试后发现一个现象:如果此时点击“使用Safari打开”,会出现特定的URL显示情况。

这是OAuth认证时跳转的中间界面(即从OAuth回调的页面)。然而,在使用微信调试工具时,显示的URL却是正确的最终页面(即从回调页面跳转后的页面)。
我们知道,在使用JSSDK进行微信认证时,需要使用当前页面的URL调用wx.config。这引发了一种推测:当Vue进行页面跳转时,微信浏览器可能仍认为当前页面停留在原页面,导致传递的URL与微信浏览器认为的当前URL不一致,进而导致认证错误。
wx.config URL传递策略
基于此推测,在尝试给wx.config传递URL时,使用了跳转前中间结果的URL(即保持传递给认证的URL与使用Safari打开时显示的URL一致),结果分享功能恢复正常。
这算是微信在兼容Vue时存在的一个坑,希望读者能尽早规避此类问题。
以上关于Vue微信分享回调在iOS和Android端出现错误的解决方法,希望能为大家提供参考,并欢迎大家支持本站。