微信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 面向对象编程 聊聊对象的事
Sep 17 Javascript
Javascript 圆角div的实现代码
Oct 15 Javascript
原生js事件的添加和删除的封装
Jul 01 Javascript
window.location.href的用法(动态输出跳转)
Aug 09 Javascript
JavaScript表单验证实例之验证表单项是否为空
Jan 10 Javascript
AngularJS中的JSONP实例解析
Dec 01 Javascript
微信小程序-小说阅读小程序实例(demo)
Jan 12 Javascript
JS运动特效之同时运动实现方法分析
Jan 24 Javascript
Angular 5.x 学习笔记之Router(路由)应用
Apr 08 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
Nov 23 Javascript
js实现随机圆与矩形功能
Oct 29 Javascript
JS实现简单控制视频播放倍速的实例代码
Apr 18 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
jQuery Mobile + PHP实现文件上传
2014/12/12 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
2016/02/26 PHP
Yii2实现中国省市区三级联动实例
2017/02/08 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
动态样式类封装JS代码
2009/09/02 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
jQuery:delegate中select()不起作用的解决方法(实例讲解)
2014/01/26 Javascript
jQuery使用正则表达式替换dom元素标签用法示例
2017/01/16 Javascript
jQuery简单获取DIV和A标签元素位置的方法
2017/02/07 Javascript
JS和canvas实现俄罗斯方块
2017/03/14 Javascript
node结合swig渲染摸板的方法
2018/04/11 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
2018/12/10 jQuery
JS实现处理时间,年月日,星期的公共方法示例
2019/05/31 Javascript
使用Typescript和ES模块发布Node模块的方法
2020/05/25 Javascript
下载给定网页上图片的方法
2014/02/18 Python
Python实现竖排打印传单手机号码易撕条
2015/03/16 Python
用Python将IP地址在整型和字符串之间轻松转换
2017/03/22 Python
python爬虫入门教程--正则表达式完全指南(五)
2017/05/25 Python
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
python pexpect ssh 远程登录服务器的方法
2019/02/14 Python
python障碍式期权定价公式
2019/07/19 Python
简单了解python数组的基本操作
2019/11/26 Python
使用Python测试Ping主机IP和某端口是否开放的实例
2019/12/17 Python
python正则过滤字母、中文、数字及特殊字符方法详解
2020/02/11 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
2020/05/29 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
HTML5梦幻之旅——炫丽的流星雨效果实现过程
2013/08/06 HTML / CSS
一些Solaris面试题
2013/03/22 面试题
高级人员简历的自我评价分享
2013/11/03 职场文书
魅力教师事迹材料
2014/01/10 职场文书
2014年元旦促销活动方案
2014/02/22 职场文书
《春晓》教学反思
2014/04/20 职场文书
产品售后服务承诺书
2014/05/21 职场文书
2014年计划生育工作总结
2014/11/14 职场文书
组织生活会发言材料
2014/12/15 职场文书
《游戏王:大师决斗》新活动上线 若无符合卡组可免费租用
2022/04/13 其他游戏