微信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 相关文章推荐
JavaScript中变量提升 Hoisting
Jul 03 Javascript
js 获取计算后的样式写法及注意事项
Feb 25 Javascript
jquery使用ColorBox弹出图片组浏览层实例演示
Mar 14 Javascript
JavaScript数组和循环详解
Apr 27 Javascript
javascript的几种继承方法介绍
Mar 22 Javascript
使用vue.js制作分页组件
Jun 27 Javascript
bootstrap快速制作后台界面
Dec 05 Javascript
微信小程序 video详解及简单实例
Jan 16 Javascript
vue-router 学习快速入门
Mar 01 Javascript
详解webpack自动生成html页面
Jun 29 Javascript
详解vue-meta如何让你更优雅的管理头部标签
Jan 18 Javascript
vue基于element-ui的三级CheckBox复选框功能的实现代码
Oct 15 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
浅谈php中的访问修饰符private、protected、public的作用范围
2016/11/20 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
PHP 文件上传限制问题
2019/09/01 PHP
使用JavaScript库还是自己写代码?
2010/01/28 Javascript
你必须知道的JavaScript 变量命名规则详解
2013/05/07 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
jQuery validate插件功能与用法详解
2016/12/15 Javascript
通过button将form表单的数据提交到action层的实例
2017/09/08 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
js设置鼠标悬停改变背景色实现详解
2019/06/26 Javascript
vue引入微信sdk 实现分享朋友圈获取地理位置功能
2019/07/04 Javascript
基于vue-cli3创建libs库的实现方法
2019/12/04 Javascript
JS快速实现简单计算器
2020/04/08 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
2020/07/19 Javascript
jQuery实现简单评论功能
2020/08/19 jQuery
wxPython框架类和面板类的使用实例
2014/09/28 Python
python基于隐马尔可夫模型实现中文拼音输入
2016/04/01 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
2017/12/25 Python
Python入门必须知道的11个知识点
2018/03/21 Python
Python装饰器知识点补充
2018/05/28 Python
Python爬取数据并写入MySQL数据库的实例
2018/06/21 Python
利用Python实现原创工具的Logo与Help
2018/12/03 Python
Python编程深度学习计算库之numpy
2018/12/28 Python
django2.0扩展用户字段示例
2019/02/13 Python
Python pandas用法最全整理
2019/08/04 Python
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
MADE荷兰:提供原创设计师家具
2018/04/03 全球购物
UGG澳洲官网:UGG Australia
2018/04/26 全球购物
伦敦剧院门票:From The Box Office
2018/06/30 全球购物
同学会邀请书大全
2014/01/12 职场文书
2014年采购部工作总结
2014/11/20 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
导游词之无锡古运河
2019/11/14 职场文书
小米11和iphone12哪个值得买?小米11对比iphone12评测
2021/04/21 数码科技
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL