Open yoowinsu opened 6 years ago
if (navigator.userAgent.toLowerCase().match(/iphone|ipad/i)) { url = global.entryUrl; } else { url = location.href.split('#')[0]; } 请教下,这么写不是一样的吗,有什么区别呢?
global.entryUrl = location.href.split('#')[0]; if (navigator.userAgent.toLowerCase().match(/iphone|ipad/i)) { url = global.entryUrl; } else { url = location.href.split('#')[0]; }
问题
此次的问题是在SPA(单页面应用)中存在的问题。在微信分享时,需要获取到前台页面的url,因为微信需要签名认证前台页面url是否是所在安全域名下的页面,如果url出错,一般会报
invalid signature
的签名错误。 url怎样才算是出错呢? 一般来讲,后台获取签名配置是需要前台把当前页面的url传给后台的(如果已知只有一个不会变的url,后台可以写死),后台需要传api_ticket(临时票据)、随机字符串、时间戳、前台页面url这几个数据给微信才会获取到签名配置。 上面的url要与前台页面的真实url一致! 这里在安卓机中一般没有问题,在IOS下排查后会发现传给后台的url并不是当前页面
的真实url,而是第一次进入页面的url,这也是问题所在,这是因为微信IOS系统的机制问题,两种机制如下解决办法(两种):
1.写一个公共变量储存当前页面url
1.写一个全局变量
global.entryUrl
(可以写到一个公共的js文件中,main.js里面import一下就可以)ps: 公共配置下的
global.entryUrl
获取的是第一次进入页面的url或者刷新后页面的url,页面内的location.href.split('#')[0]
获取的是所在页面的url,两者是不同的 2. 微信规定 签名的URL要与当前页面URL一致! 微信规定 签名的URL要与当前页面URL一致! 微信规定 签名的URL要与当前页面URL一致!所以每次分享的时候判断是否是IOS系统,IOS微信会认为当前页面的URL是第一次进入时的URL,所以把入口的
global.entryUrl
传给服务器,安卓传当前页面的URL即可2.
location.href
跳转到该分享页面这种办法其实相当于改变了IOS下当前URL为要分享的URL,其实是和vue-router的思想相违背的,所以只有一个分享页面的情况下可以这样解决,要分享页面多的话就不推荐这样的方法来解决了