微信jssdk逻辑在vue中的运用详解


Posted in Javascript onNovember 14, 2018

微信 jssdk 在 vue 中的简单使用

import wx from 'weixin-js-sdk';

wx.config({
 debug: true,
 appId: '',
 timestamp: ,
 nonceStr: '',
 signature: '',
 jsApiList: []
});

wx.ready(() => {
 // do something...
});

wx.error((err) => {
 // do something...
});

以上是微信官方给出的示例代码,但是对于实际项目使用,还需要进一步对代码进行封装。本文基于 vue 进行示范,其余类框架同理。

在微信公众平台的官方文档中已经指出,由于安全性考虑,需要将签名逻辑放在后端处理,所以签名原理不在此赘述,主要讲讲如何使用后端返回后的签名调用 jssdk。在逻辑层面,由于 wx.config 方法是调用任何接口前所必须的,所以我们可以尽可能将其抽离出来单独放置。

# utils/
.
├── common.js      # 通用函数
└── lib
  └── wechat      # 微信相关代码
    ├── auth     # 微信用户登陆获取信息相关代码
    │  ├── auth.js
    │  └── index.js
    ├── config    # jssdk 初始化相关代码
    │  └── index.js
    ├── helper.js  # 微信相关操作
    └── share    # 分享接口相关代码
      └── index.js
import sdk from 'weixin-js-sdk';

export function initSdk({ appid, timestamp, noncestr, signature, jsApiList }) { // 从后端获取
 sdk.config({
  debug: process.env.VUE_APP_ENV !== 'production',
  appId: appid,
  timestamp: timestamp,
  nonceStr: noncestr,
  signature: signature,
  jsApiList: jsApiList
 });
}

这样就可以完成对 jssdk 的初始化,之后可以进行分享接口的初始化。最初的时候我想分享接口既然是可能对应每一个 url 页面(SPA 应用中的 view),那么就应该在 view 中使用 mixin 混入来书写,所以产生了第一版实现。

// example.vue
export default {
 name: 'example',

 wechatShareConfig() {
  return {
   title: 'example',
   desc: 'example desc',
   imgUrl: 'http://xxx/example.png',
   link: window.location.href.split('#')[0]
  };
 }
}
// wechatMixin.js
import { share } from '@/utils/lib/wechat/share';

// 获取 wechat 分享接口配置
function getWechatShareConfig(vm) {
 const { wechatShareConfig } = vm.$options;
 if (wechatShareConfig) {
  return typeof wechatShareConfig === 'function'
   ? wechatShareConfig.call(vm)
   : wechatShareConfig;
 }
}

const wechatShareMixin = {
 created() {
  const wechatShareConfig = getWechatShareConfig(this);
  if (wechatShareConfig) {
   share({ ...wechatShareConfig });
  }
 }
};

export default wechatShareMixin;
// utils/lib/wechat/share
import { getTicket } from '@/utils/lib/wechat/helper'; // 签名接口
import { initSdk } from '@/utils/lib/wechat/config';
import sdk from 'weixin-js-sdk';

// 接口清单
const JS_API_LIST = ['onMenuShareAppMessage', 'onMenuShareTimeline'];

// 消息分享
function onMenuShareAppMessage(config) {
 const { title, desc, link, imgUrl } = config;
 sdk.onMenuShareAppMessage({ title, desc, link, imgUrl });
}

// 朋友圈分享
function onMenuShareTimeline(config) {
 const { title, link, imgUrl } = config;
 sdk.onMenuShareTimeline({ title, link, imgUrl });
}

export function share(wechatShareConfig) {
 if (!wechatShareConfig.link) return false;

 // 签名验证
 getTicket(wechatShareConfig.link).then(res => {
  // 初始化 `jssdk`
  initSdk({
   appid: res.appid,
   timestamp: res.timestamp,
   noncestr: res.noncestr,
   signature: res.signature,
   jsApiList: JS_API_LIST
  });

  sdk.ready(() => {
   // 初始化目标接口
   onMenuShareAppMessage(wechatShareConfig);
   onMenuShareTimeline(wechatShareConfig);
  });
 });
}

写完之后乍一看似乎没什么毛病,但是每个 view 文件夹下的 .vue 都有一份微信配置显得很是臃肿,所以第二版实现则是将 jssdk 初始化放在 vue-router 的 beforeEach 钩子中进行,这样可以实现分享配置的统一配置,更加直观一些。

// router.js

//...
routes: [
 {
  path: '/',
  component: Example,
  meta: {
   wechat: {
    share: {
     title: 'example',
     desc: 'example desc',
     imgUrl: 'https://xxx/example.png'
    }
   }
  }
 }
]
//...

// 初始化分享接口
function initWechatShare (config) {
 if (config) {
  share(config);
 }
}

router.beforeEach((to, from, next) => {
 const { shareConfig } = to.meta && to.meta.wechat;
 const link = window.location.href;

 if (!shareConfig) next();

 initWechatShare({ ...shareConfig, link });
 switchTitle(shareConfig.title); // 切换标题
 next();
});

这样一来,会显得 .vue 清爽很多,不会有太多业务逻辑之外的代码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
extjs之去除s.gif的影响
Dec 25 Javascript
jquery 插件学习(六)
Aug 06 Javascript
js防止表单重复提交的两种方法
Sep 30 Javascript
js中confirm实现执行操作前弹出确认框的方法
Nov 01 Javascript
js实现点击图片改变页面背景图的方法
Feb 28 Javascript
JavaScript控制按钮可用或不可用的方法
Apr 03 Javascript
JavaScript中的条件判断语句使用详解
Jun 03 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
Oct 06 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
Apr 13 Javascript
详解JS数据类型的值拷贝函数(深拷贝)
Jul 13 Javascript
微信小程序实现下拉刷新和轮播图效果
Nov 21 Javascript
bootstrap-paginator服务器端分页使用方法详解
Feb 13 Javascript
Puppeteer 爬取动态生成的网页实战
Nov 14 #Javascript
React和Vue中监听变量变化的方法
Nov 14 #Javascript
详解jQuery获取特殊属性的值以及设置内容
Nov 14 #jQuery
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
Nov 14 #Javascript
js html实现计算器功能
Nov 13 #Javascript
JavaScript使用类似break机制中断forEach循环的方法
Nov 13 #Javascript
小程序登录态管理的方法示例
Nov 13 #Javascript
You might like
FCKeditor的安装(PHP)
2007/01/13 PHP
php常用Output和ptions/Info函数集介绍
2013/06/19 PHP
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
php使用function_exists判断函数可用的方法
2014/11/19 PHP
PHP获取Exif缩略图的方法
2015/07/13 PHP
优化WordPress中文章与评论的时间显示
2016/01/12 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
表单序列化与jq中的serialize使用示例
2014/02/21 Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
2014/09/01 Javascript
jquery中checkbox全选失效的解决方法
2014/12/26 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
javascript实现图片跟随鼠标移动效果的方法
2015/05/13 Javascript
javascript特殊文本输入框网页特效
2016/09/13 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
详解Angular调试技巧之报错404(not found)
2018/01/31 Javascript
vue.js的computed,filter,get,set的用法及区别详解
2018/03/08 Javascript
js实现for循环跳过undefined值示例
2019/07/02 Javascript
详解JavaScript匿名函数和闭包
2020/07/10 Javascript
原生JS实现京东查看商品点击放大
2020/12/21 Javascript
Python下singleton模式的实现方法
2014/07/16 Python
跟老齐学Python之坑爹的字符编码
2014/09/28 Python
python中的__slots__使用示例
2015/02/26 Python
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
python同步两个文件夹下的内容
2019/08/29 Python
Python数据处理篇之Sympy系列(五)---解方程
2019/10/12 Python
python实现斗地主分牌洗牌
2020/06/22 Python
你正在寻找的CSS3 动画技术
2011/07/27 HTML / CSS
仿酷狗html5手机音乐播放器主要部分代码
2013/05/15 HTML / CSS
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
世界上最大的各式箱包网络零售店:eBag
2016/07/21 全球购物
美体小铺瑞典官方网站:The Body Shop瑞典
2018/01/27 全球购物
毕业生就业自荐信
2013/12/04 职场文书
餐饮业创业计划书范文
2014/01/06 职场文书
解除处分决定书
2015/06/25 职场文书
七年级作文之冬景
2019/11/07 职场文书
MySQL普通表如何转换成分区表
2022/05/30 MySQL