vue中使用WX-JSSDK的两种方法(推荐)
公司最近有微信公众号的需求,那么微信登录授权和如何使用WX-JSSDk实现分享等等肯定是最头疼的问题。本人也是第一次开发微信公众号,在网上看了很多篇博客,最终选定了两种方法,并且亲测有效。
一、通过全局,在router.afterEach中定义
1.首先通过yarnaddweixin-js-sdk/npmiweixin-js-sdk
2.将微信jsdk挂载到全局上
在utils目录下新建WechatPlugin.js
WechatPlugin.js
importwxfrom'weixin-js-sdk'
constplugin={
install(Vue){
Vue.prototype.$wechat=wx
Vue.wechat=wx
},
$wechat:wx
}
exportdefaultplugin
exportconstinstall=plugin.install
main.js中
importWechatPluginfrom'./utils/WechatPlugin' //全局注册微信jsdk Vue.use(WechatPlugin)
3.router.afterEach中
importwechatUtilfrom'@/utils/wechatUtil'//在此文件中定义微信的一些方法
router.afterEach((to,from)=>{
letpath=to.fullPath.slice(1)//去除'/'
leturl
constjsApiList=[
'onMenuShareAppMessage',
'onMenuShareTimeline',
'chooseWXPay',
'showOptionMenu',
"updateAppMessageShareData",
"hideMenuItems",
"showMenuItems"
]
if(!sessionStorage.getItem('initLink')){
//解决ios微信下,分享签名不成功的问题,将第一次的进入的url缓存起来。
sessionStorage.setItem('initLink',document.URL)
}
if(!!window.__wxjs_is_wkwebview){
//ios
url=sessionStorage.getItem('initLink')
wechatUtil.setWeChatConfig(url,jsApiList)
}else{
//安卓
url=location.origin+process.env.BASE_URL+path
//setTimeout(()=>{
wechatUtil.setWeChatConfig(url,jsApiList)
//},0)
}
})
3.wechatUtil.js中
importVuefrom'vue'
exportdefault{
appid:process.env.VUE_APP_WECHAT_APPID,//可以在根据不同环境配置appid
setWeChatConfig(url,jsApiList){
getSignature(decodeURIComponent(url))//getSignature需要你自己跟后端约定请求签名时的接口
.then(data=>{
Vue.wechat.config({
debug:false,
signature:data.signature,
nonceStr:data.nonceStr,
timestamp:data.timestamp,
appId:data.appId,
jsApiList
})
})
.catch(err=>{
console.log(err)
})
}
}
上面方法虽然全局可以使用,但是会遇到一个问题,在单个页面调用微信jsddk中的updateAppMessageShareData方法
或者其他方法时,有时成功有时失败,这可能是微信jsdk异步的问题,因此,需要你在单个页面中使用的时候加上setTimeout(()=>{“这里调取微信的接口”},500)。
下面的第二种方法我觉得是最方便也是最自定义能力最好的,在需要的页面的调取。
二、方法二通过newpromise封装成统一的入口,在单个页面中调用
我们还是要在router.afterEach中将进入的url记录下来,我是放在vuex上的(这里要特别注意苹果手机和安卓手机的区别,这里我就不多做讲解,原因是苹果浏览器中的url是第一次进来的url)
1.在router.afterEach中
importstorefrom'@/store'
router.afterEach((to,from)=>{
letpath=to.fullPath.slice(1)//去除'/'
if(!sessionStorage.getItem('initLink')){
//解决ios微信下,分享签名不成功的问题,将第一次的进入的url缓存起来。
sessionStorage.setItem('initLink',document.URL)
}
leturl
if(!!window.__wxjs_is_wkwebview){
//ios
url=sessionStorage.getItem('initLink')
}else{
//安卓process.env.BASE_URL自己定义各个环境下域名变量
url=location.origin+process.env.BASE_URL+path
}
store.commit('page/setInitLink',url)
})
2.在store/page.js中
conststate={
initLink:''
}
constmutations={
setInitLink(state,initLink){
state.initLink=initLink
}
}
exportdefault{
namespaced:true,
state,
mutations
}
3.在utils/wechatUtil.js定义初始化方法
importwxfrom'weixin-js-sdk'
importstorefrom'@/store'
exportdefault{
/*初始化wxjsdk各种接口*/
init(apiList=[],url){
//需要使用的api列表
returnnewPromise((resolve,reject)=>{
getSignature(store.state.page.initLink).then(res=>{
if(res.appId){
wx.config({
//debug:true,
appId:res.appId,
timestamp:res.timestamp,
nonceStr:res.nonceStr,
signature:res.signature,
jsApiList:apiList
})
wx.ready(res=>{
//微信SDK准备就绪后执行的回调。
resolve(wx,res)
})
}else{
reject(res)
}
})
})
}
}
4.在页面中的使用
importwechatUtilfrom'@/utils/wechatUtil'
wechatUtil
.init([
'updateAppMessageShareData',
'onMenuShareAppMessage',
'onMenuShareTimeline',
'updateTimelineShareData'
])
.then((wx,res)=>{
//这里写微信的接口
})
总结:最后我个人推荐第二种方法,第一种方法虽然很方便,但是每次路由跳转都调取了微信获取签名初始化的方法,而且自定义的扩展性不是很强,而且还会有微信接口异步的问题,需要用到微信中的debu:true调试。第二种方法使用和定义起来比较简单。
以上所述是小编给大家介绍的vue中使用WX-JSSDK的两种方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。