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 相关文章推荐
基于JQUERY的两个ListBox子项互相调整的实现代码
May 07 Javascript
js预载入和JavaScript Image()对象使用介绍
Aug 28 Javascript
THREE.JS入门教程(3)着色器-下
Jan 24 Javascript
Jquery AJAX POST与GET之间的区别
Nov 14 Javascript
js AppendChild与insertBefore用法详细对比
Dec 16 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
Mar 03 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
Jun 05 Javascript
JavaScript实现数组全排列、去重及求最大值算法示例
Jul 30 Javascript
在angularJs中进行数据遍历的2种方法
Oct 08 Javascript
JS实现的对象去重功能示例
Jun 04 Javascript
Layui给switch添加响应事件的例子
Sep 03 Javascript
layer弹出层显示在top顶层的方法
Sep 11 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
一条久听不愿放下的DIY森海MX500,三言两语话神奇
2021/03/02 无线电
php 删除无限级目录与文件代码共享
2008/11/22 PHP
ThinkPHP模板判断输出Defined标签用法详解
2014/06/30 PHP
CI框架无限级分类+递归的实现代码
2016/11/01 PHP
Django 中 cookie的使用
2017/08/17 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
2019/10/02 PHP
在Laravel中使用MongoDB的方法示例
2019/11/11 PHP
javascript闭包的理解和实例
2010/08/12 Javascript
javascript 构造函数强制调用经验总结
2012/12/02 Javascript
Javascript delete 引用类型对象
2013/11/01 Javascript
jQuery Ajax异步处理Json数据详解
2013/11/05 Javascript
js实现固定显示区域内自动缩放图片的方法
2015/07/18 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
详解nodejs与javascript中的aes加密
2016/05/22 NodeJs
jQuery自定义数值抽奖活动代码
2016/06/11 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
JS加密插件CryptoJS实现的Base64加密示例
2020/08/16 Javascript
JavaScript设计模式之代理模式实例分析
2019/01/16 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
详解es6新增数组方法简便了哪些操作
2019/05/09 Javascript
jQuery实现高级检索功能
2019/05/28 jQuery
Vue Router 实现动态路由和常见问题及解决方法
2020/03/06 Javascript
进一步理解Python中的函数编程
2015/04/13 Python
Python实现豆瓣图片下载的方法
2015/05/25 Python
Python扫描IP段查看指定端口是否开放的方法
2015/06/09 Python
Python 爬虫的工具列表大全
2016/01/31 Python
关于tf.matmul() 和tf.multiply() 的区别说明
2020/06/18 Python
深入了解Python 方法之类方法 & 静态方法
2020/08/17 Python
HTML5 标准将把互联网视频扔回到黑暗时代
2010/02/10 HTML / CSS
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
标准毕业生自荐信范文
2013/11/04 职场文书
中专三年学习的个人自我评价
2013/12/12 职场文书
爱护公物标语
2014/06/24 职场文书
2014年初一班主任工作总结
2014/11/08 职场文书
黄河绝恋观后感
2015/06/08 职场文书
职业生涯规划书之大学四年
2019/08/07 职场文书