微信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 相关文章推荐
How to Auto Include a Javascript File
Feb 02 Javascript
11款基于Javascript的文件管理器
Oct 25 Javascript
Javascript中valueOf与toString区别浅析
Mar 19 Javascript
javascript中数组的定义及使用实例
Jan 21 Javascript
js钢琴按钮波浪式图片排列效果代码分享
Aug 26 Javascript
JS根据key值获取URL中的参数值及把URL的参数转换成json对象
Aug 26 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
May 16 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
Jun 17 Javascript
数组Array的排序sort方法
Feb 17 Javascript
微信小程序发送短信验证码完整实例
Jan 07 Javascript
jquery操作select常见方法大全【7种情况】
May 28 jQuery
js点击事件的执行过程实例分析【冒泡与捕获】
Apr 11 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编程中八种常见的文件操作方式
2006/11/19 PHP
第4章 数据处理-php字符串的处理-郑阿奇(续)
2011/07/04 PHP
微信公众号判断用户是否已关注php代码解析
2016/06/24 PHP
iis6+javascript Add an Extension File
2007/06/13 Javascript
javascript入门·图片对象(无刷新变换图片)\滚动图像
2007/10/01 Javascript
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
IE6 hack for js 集锦
2014/09/23 Javascript
常用的jquery模板插件——jQuery Boilerplate介绍
2014/09/23 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
JavaScript内存管理介绍
2015/03/13 Javascript
jquery验证邮箱格式是否正确实例讲解
2015/11/16 Javascript
BootStrap实现手机端轮播图左右滑动事件
2016/10/13 Javascript
深入对Vue.js $watch方法的理解
2017/03/20 Javascript
js 去掉字符串前后空格实现代码集合
2017/03/25 Javascript
js脚本编写简单刷票投票系统
2017/06/27 Javascript
vue父子组件的嵌套的示例代码
2017/09/08 Javascript
vue router仿天猫底部导航栏功能
2017/10/18 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
js实现列表按字母排序
2020/08/11 Javascript
Python列出一个文件夹及其子目录的所有文件
2016/06/30 Python
python hash每次调用结果不同的原因
2019/11/21 Python
Python利用FFT进行简单滤波的实现
2020/02/26 Python
python中的时区问题
2021/01/14 Python
一款纯css3实现的tab选项卡的实列教程
2014/12/11 HTML / CSS
荷兰男士时尚网上商店:Suitable
2017/12/25 全球购物
新品发布会主持词
2014/04/02 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
2014党的群众路线教育实践活动总结材料
2014/10/31 职场文书
2014年大学宣传部工作总结
2014/12/19 职场文书
幼儿园安全教育月活动总结
2015/05/08 职场文书
2015年安全生产月工作总结
2015/07/27 职场文书
小学四年级作文之最感动的一件事
2019/11/01 职场文书
js之ajax文件上传
2021/05/13 Javascript
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL