vue中使用WX-JSSDK的两种方法(推荐)


Posted in Javascript onJanuary 18, 2020

公司最近有微信公众号的需求,那么微信登录授权和如何使用WX-JSSDk实现分享等等肯定是最头疼的问题。本人也是第一次开发微信公众号,在网上看了很多篇博客,最终选定了两种方法,并且亲测有效。

一、通过全局,在router.afterEach中定义

1.首先通过yarn add weixin-js-sdk/ npm i weixin-js-sdk

2.将微信jsdk挂载到全局上

在utils目录下新建WechatPlugin.js

WechatPlugin.js

import wx from 'weixin-js-sdk'
const plugin = {
 install(Vue) {
 Vue.prototype.$wechat = wx
 Vue.wechat = wx
 },
 $wechat: wx
}
export default plugin
export const install = plugin.install

main.js中

import WechatPlugin from './utils/WechatPlugin'
// 全局注册微信jsdk
Vue.use(WechatPlugin)

3.router.afterEach中

import wechatUtil from '@/utils/wechatUtil' // 在此文件中定义微信的一些方法
router.afterEach((to, from) => {
 let path = to.fullPath.slice(1) // 去除'/'
 let url
 const jsApiList = [
 '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中

import Vue from 'vue'
export default {
 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)。

下面的第二种方法我觉得是最方便也是最自定义能力最好的,在需要的页面的调取。

二、方法二通过new promise封装成统一的入口,在单个页面中调用

我们还是要在router.afterEach中将进入的url记录下来,我是放在vuex上的(这里要特别注意苹果手机和安卓手机的区别,这里我就不多做讲解,原因是苹果浏览器中的url是第一次进来的url)

1.在router.afterEach中

import store from '@/store'
router.afterEach((to, from) => {
 let path = to.fullPath.slice(1) // 去除'/'
 if (!sessionStorage.getItem('initLink')) {
 // 解决ios微信下,分享签名不成功的问题,将第一次的进入的url缓存起来。
 sessionStorage.setItem('initLink', document.URL)
 }
 let url
 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中

const state = {
 initLink: ''
}
const mutations = {
 setInitLink (state, initLink) {
 state.initLink = initLink
 }
}

export default {
 namespaced: true,
 state,
 mutations
}

3.在utils/wechatUtil.js定义初始化方法

import wx from 'weixin-js-sdk'
import store from '@/store'

export default {
 /* 初始化wxjsdk各种接口 */
 init(apiList = [], url) {
 //需要使用的api列表
 return new Promise((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.在页面中的使用

import wechatUtil from '@/utils/wechatUtil'
 wechatUtil
 .init([
  'updateAppMessageShareData',
  'onMenuShareAppMessage',
  'onMenuShareTimeline',
  'updateTimelineShareData'
 ])
 .then((wx, res) => {
  // 这里写微信的接口
 })

总结:最后我个人推荐第二种方法,第一种方法虽然很方便,但是每次路由跳转都调取了微信获取签名初始化的方法,而且自定义的扩展性不是很强,而且还会有微信接口异步的问题,需要用到微信中的debu:true调试。第二种方法使用和定义起来比较简单。

以上所述是小编给大家介绍的vue中使用WX-JSSDK的两种方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
juqery 学习之三 选择器 可见性 元素属性
Nov 25 Javascript
5个最佳的Javascript日期处理类库分享
Apr 15 Javascript
jquery组件使用中遇到的问题整理及解决
Feb 21 Javascript
使用jQuery判断IE浏览器版本的代码
Jun 14 Javascript
javascript控制图片播放的实现代码
Jul 29 Javascript
js实现创建删除html元素小结
Sep 30 Javascript
微信小程序 特效菜单抽屉效果实例代码
Jan 11 Javascript
Javascript中click与blur事件的顺序详析
Apr 25 Javascript
node.js连接MongoDB数据库的2种方法教程
May 17 Javascript
详解react-router如何实现按需加载
Jun 15 Javascript
js实现input密码框显示/隐藏功能
Sep 10 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
Aug 04 Javascript
JS数组方法join()用法实例分析
Jan 18 #Javascript
JavaScript进制转换实现方法解析
Jan 18 #Javascript
js滚轮事件 js自定义滚动条的实现
Jan 18 #Javascript
vue实现扫码功能
Jan 17 #Javascript
js实现轮播图效果 z-index实现轮播图
Jan 17 #Javascript
js键盘事件实现人物的行走
Jan 17 #Javascript
javascript实现简易的计算器
Jan 17 #Javascript
You might like
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
2011/05/25 PHP
PHP实现时间轴函数代码
2011/10/08 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
PHP页面输出搜索后跳转下一页的处理方法
2016/09/30 PHP
关于JS字符串函数String.replace()
2013/04/07 Javascript
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
一款基jquery超炫的动画导航菜单可响应单击事件
2014/11/02 Javascript
javascript中CheckBox全选终极方案
2015/05/20 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
在knockoutjs 上自己实现的flux(实例讲解)
2017/12/18 Javascript
浅析Vue 生命周期
2018/06/21 Javascript
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
vue.js使用v-model实现父子组件间的双向通信示例
2020/02/05 Javascript
Python中对列表排序实例
2015/01/04 Python
Python网页解析利器BeautifulSoup安装使用介绍
2015/03/17 Python
利用Tkinter(python3.6)实现一个简单计算器
2017/12/21 Python
python format 格式化输出方法
2018/07/16 Python
windows下安装Python虚拟环境virtualenvwrapper-win
2019/06/14 Python
对python中基于tcp协议的通信(数据传输)实例讲解
2019/07/22 Python
Python3 实现减少可调用对象的参数个数
2019/12/20 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
2020/02/21 Python
Python捕获异常堆栈信息的几种方法(小结)
2020/05/18 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
2020/06/09 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
2020/07/09 Python
Python实现王者荣耀自动刷金币的完整步骤
2021/01/22 Python
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
html5拖拽应用记录及注意点
2020/05/27 HTML / CSS
台湾深度自由行旅游平台:Tripbaa趣吧
2017/10/10 全球购物
Ellesse英国官网:意大利高级运动品牌
2019/07/23 全球购物
WEB控件可以激发服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回?
2012/02/21 面试题
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
培训讲师邀请函
2014/01/10 职场文书
人力资源作业细则
2014/03/03 职场文书
运动会演讲稿
2014/05/07 职场文书
12.4法制宣传日标语
2014/10/08 职场文书