每回遇到微信分享都是一个坑,目前的商城项目使用Vue开发,采用历史的路由模式,配置微信分享又遇到了很多问题,最后终于解决了,现将解决的过程分享一下。
<>强技术要点强>
Vue、历史
<强>常见问题及说明强>
调试模式下报假
这个没得说,就是调用wx.config方法的参数错误造成的,请确认以下事项:
-
<李>是否成功绑定了域名(域名校验文件要能被访问到)李>
<李>使用最新的js-sdk文件,因为微信会改部分api李>
<李>配置方法的参数是否传正确了(拼写错误,大小写…)李>
<李>需要使用的方法是否写在了jsApiList中李>
<李>获取签名的url需要decodeURIComponent李>
<李>后台的生成签名的加密方法需要对照官方文档李>
<强>调试返回好,分享不成功强>
-
<李>确保代码拼写正确李>
<李>分享链接域名或路径必须与当前页面对应的公众号JS安全域名一致李>
<李>接口调用需要放在wx.ready方法中李>
<强>单页项目(SPA)中的一些要点强>
所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web应用程序可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web应用程序的页面会导致签名失败,此问题会在Android6.2中修复)。
上面那段话摘自官方文档
开发者需要注意的事项:
-
<李> android和ios需要分开处理李>
<李>需要在页url面变化的时候重新调用wx.config方法,android获取签名的url就传window.location.href李>
<李> Vue项目在切换页面时,IOS中浏览器的url并不会改变,依旧是第一次进入页面的地址,所以IOS获取签名的url需要传第一次进入的页面url李>
路由器/index.js
…… 从“@进口{wechatAuth}/共同/wechatConfig.js”; …… const路由器=new路由器({ 模式:“历史”, 基地:process.env.BASE_URL, 路线:[ { 路径:“/? 名称:“家”, 元:{ 标题:“首页”, showTabbar:没错, allowShare:真 }, }, { 路径:“/购物车”, 名称:“购物车”, 元:{ 标题:“购物车”, showTabbar:真 }, 组件:()=比;导入(“。/视图/车/index.vue”) } …… ] }); 路由器。afterEach((,)=比;{ 让authUrl=" $ {window.location.origin} $ {to.fullPath} '; 让allowShare=! ! to.meta.allowShare; 如果(! ! window.__wxjs_is_wkwebview) {//IOS 如果窗口。entryUrl==" | |窗口。entryUrl==未定义){ 窗口。entryUrl=authUrl;//将后面的参数去除 } wechatAuth (authUrl ios, allowShare); 其他}{//安卓 setTimeout(函数(){ wechatAuth (authUrl,“android”, allowShare); },500); } }); >之前代码要点:
<李>元中的allowShare用于判断页面是否可分享李> <李> window.__wxjs_is_wkwebview可用来判断是否是微信IOS浏览器李> <李> entryUrl是项目第一次进入的页面的地址,将其缓存在窗口对象上李> <李>为什么安卓的时候要增加一个延时器,因为安卓会存在一些情况,就是即便签名成功,但是还是会唤不起功能,这个貌似是一个比较稳妥的解决办法李>
wechatConfig.js
进口http“. ./api/http”; 从“. ./商店/进口商店商店”; 设备,出口const wechatAuth=异步(authUrl allowShare)=比;{ 让shareConfig={ 标题:“xx一站式服务平台”, 描述:“xxxx”, 链接:allowShare & # 63;authUrl: window.location.origin, imgUrl: window.location。起源+”/share.png” }; 让authRes=等待http。get ("/pfront/wxauth/jsconfig”, { 参数:{ url: decodeURIComponent(设备==" ios " & # 63;窗口。entryUrl authUrl): } }); 如果(authRes,,authRes。代码==101){ wx.config ({//调试:没错, appId: authRes.data.appId, 时间戳:authRes.data.timestamp, nonceStr: authRes.data.nonceStr, 签名:authRes.data.signature, jsApiList:(“updateAppMessageShareData”、“updateTimelineShareData”,“onMenuShareAppMessage”、“onMenuShareTimeline”) }); wx.ready(()=比;{ wx.updateAppMessageShareData ({ 标题:shareConfig.title, 描述:shareConfig.desc, 链接:shareConfig.link, imgUrl: shareConfig.imgUrl, 成功:函数(){//设置成功//shareSuccessCallback (); } }); wx.updateTimelineShareData ({ 标题:shareConfig.title, 链接:shareConfig.link, imgUrl: shareConfig.imgUrl, 成功:函数(){//设置成功//shareSuccessCallback (); } }); wx.onMenuShareTimeline ({ 标题:shareConfig.title, 链接:shareConfig.link, imgUrl: shareConfig.imgUrl, 成功:函数(){ shareSuccessCallback (); } }); wx.onMenuShareAppMessage ({ 标题:shareConfig.title, 描述:shareConfig.desc, 链接:shareConfig.link, imgUrl: shareConfig.imgUrl, 成功:函数(){ shareSuccessCallback (); } }); }); } }; 函数shareSuccessCallback () { 如果(! store.state.user.uid) { 返回错误; } store.state.cs.stream ({ 开斋节:“共享”, tpc:“所有”, 数据:{ uid: store.state.user.uid, truename: store.state.user。truename | |”“ } }); http。get ("/pfront/会员/share_score”, { 参数:{ uid: store.state.user.uid } }); }Vue项目历史模式下微信分享爬坑总结