微信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 相关文章推荐
document.getElementById的简写方式(获取id对象的简略写法)
Sep 10 Javascript
jquery.validate的使用说明介绍
Nov 12 Javascript
在页面上用action传递参数到后台出现乱码的解决方法
Dec 31 Javascript
jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
Aug 26 Javascript
基于JavaScript实现TAB标签效果
Jan 12 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
May 02 Javascript
Vue关于数据绑定出错解决办法
May 15 Javascript
详解ES6之async+await 同步/异步方案
Sep 19 Javascript
vue+vue-validator 表单验证功能的实现代码
Nov 13 Javascript
vue-i18n结合Element-ui的配置方法
May 20 Javascript
Vue实现点击按钮复制文本内容的例子
Nov 09 Javascript
HTML+JS实现在线朗读器
Feb 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中Smarty模板初体验
2011/08/08 PHP
PHP获取客户端及服务器端IP的封装类
2016/07/21 PHP
php post换行的方法
2020/02/03 PHP
ThinkPHP5分页paginate代码实例解析
2020/11/10 PHP
非常好的js代码
2006/06/27 Javascript
javascript编程起步(第七课)
2007/02/27 Javascript
基于jquery实现后台左侧菜单点击上下滑动显示
2013/04/11 Javascript
鼠标拖动实现DIV排序示例代码
2013/10/14 Javascript
基于jquery扩展漂亮的下拉框可以二次修改
2013/11/19 Javascript
JS注释所产生的bug 即使注释也会执行
2013/11/19 Javascript
微信分享的标题、缩略图、连接及描述设置方法
2014/10/14 Javascript
DOM节点删除函数removeChild()用法实例
2015/01/12 Javascript
JQuery对ASP.NET MVC数据进行更新删除
2016/07/13 Javascript
JS中如何比较两个Json对象是否相等实例代码
2016/07/13 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
2016/07/22 Javascript
JS实现的系统调色板完整实例
2016/12/21 Javascript
AngularJS监听路由变化的方法
2017/03/07 Javascript
vue使用Font Awesome的方法步骤
2019/02/26 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
[04:42]5分钟带你了解什么是DOTA2(第一期)
2017/02/07 DOTA
python中使用百度音乐搜索的api下载指定歌曲的lrc歌词
2014/07/18 Python
Python调用C语言的方法【基于ctypes模块】
2018/01/22 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
Python 从subprocess运行的子进程中实时获取输出的例子
2019/08/14 Python
利用keras使用神经网络预测销量操作
2020/07/07 Python
Matplotlib 折线图plot()所有用法详解
2020/07/28 Python
pip install命令安装扩展库整理
2021/03/02 Python
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
深入理解HTML的FormData对象
2016/05/17 HTML / CSS
公务员上班玩游戏检讨书
2014/09/17 职场文书
2015财务年度工作总结范文
2015/05/04 职场文书
2015大学党建带团建工作总结
2015/07/23 职场文书
2016年暑期教师培训心得体会
2016/01/09 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书
virtualenv隔离Python环境的问题解析
2022/06/21 Python