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 相关文章推荐
javascript 冒号 使用说明
Jun 06 Javascript
写JQuery插件的基本知识
Nov 25 Javascript
JavaScript设计模式之外观模式实例
Oct 10 Javascript
jQuery的animate函数实现图文切换动画效果
May 03 Javascript
jQuery基本选择器之标签名选择器
Sep 03 Javascript
textarea 在浏览器中固定大小和禁止拖动的实现方法
Dec 03 Javascript
微信小程序实战篇之购物车的实现代码示例
Nov 30 Javascript
vue-cli3.0 特性解读
Apr 22 Javascript
vue elementUI tree树形控件获取父节点ID的实例
Sep 12 Javascript
vue实现的上拉加载更多数据/分页功能示例
May 25 Javascript
webpack3.0升级4.0的方法步骤
Apr 02 Javascript
Vue实现简单的拖拽效果
Aug 25 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
这东西价格,可以买几台TECSUN S-2000
2021/03/02 无线电
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
2013/06/24 PHP
php处理复杂xml数据示例
2016/07/11 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
2016/10/08 PHP
php 使用curl模拟ip和来源进行访问的实现方法
2017/05/02 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
input 输入框内的输入事件详细分析
2010/03/17 Javascript
js中eval详解
2012/03/30 Javascript
javascript生成随机大小写字母的方法
2014/02/20 Javascript
jQuery实现菜单感应鼠标滑动动画效果的方法
2015/02/28 Javascript
jQuery实现简易的天天爱消除小游戏
2015/10/16 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
2015/12/17 Javascript
基于JavaScript实现简单的随机抽奖小程序
2016/01/05 Javascript
解析javascript图片懒加载与预加载的分析总结
2016/10/27 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
2017/04/17 Javascript
自定义事件解决重复请求BUG的问题
2017/07/11 Javascript
JS实现简单的浮动碰撞效果示例
2017/12/28 Javascript
jQuery实现页码跳转式动态数据分页
2017/12/31 jQuery
element-ui表格列金额显示两位小数的方法
2018/08/24 Javascript
vue中动态添加class类名的方法
2018/09/05 Javascript
解决vue打包后刷新页面报错:Unexpected token
2019/08/27 Javascript
python实现用于测试网站访问速率的方法
2015/05/26 Python
Python进阶篇之字典操作总结
2016/11/16 Python
Python 遍历列表里面序号和值的方法(三种)
2017/02/17 Python
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
Python爬虫实现爬取百度百科词条功能实例
2019/04/05 Python
python多进程并行代码实例
2019/09/30 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
python实现拼接图片
2020/03/23 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
python中pickle模块浅析
2020/12/29 Python
python 检测nginx服务邮件报警的脚本
2020/12/31 Python
劳动工资科岗位职责范本
2014/03/02 职场文书
安全生产活动月方案
2014/03/09 职场文书
个人授权委托书样本
2014/09/13 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python