微信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中判断对象类型的几种方法总结
Nov 11 Javascript
js 高效去除数组重复元素示例代码
Dec 19 Javascript
AngularJS入门教程之Hello World!
Dec 06 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
Dec 18 Javascript
jQuery实现的漂亮表单效果代码
Aug 18 Javascript
Node.js静态文件服务器改进版
Jan 10 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
Jun 03 Javascript
详解Vue2 无限级分类(添加,删除,修改)
Mar 07 Javascript
利用Vue v-model实现一个自定义的表单组件
Apr 27 Javascript
JS验证码实现代码
Sep 14 Javascript
laypage.js分页插件使用方法详解
Jul 27 Javascript
js 实现watch监听数据变化的代码
Oct 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
修改了一个很不错的php验证码(支持中文)
2007/02/14 PHP
php中explode与split的区别介绍
2012/10/03 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
不要在cookie中使用特殊字符的原因分析
2010/07/13 Javascript
如何让div span等元素能响应键盘事件操作指南
2012/11/13 Javascript
javascript中eval和with用法实例总结
2015/11/30 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
如何使用jquery修改css中带有!important的样式属性
2016/04/28 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
简单的js表格操作
2016/09/24 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
2017/02/17 Javascript
easy ui datagrid 从编辑框中获取值的方法
2017/02/22 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
node使用promise替代回调函数
2018/05/07 Javascript
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
使用Python求解最大公约数的实现方法
2015/08/20 Python
Python引用模块和查找模块路径
2016/03/17 Python
matplotlib subplots 设置总图的标题方法
2018/05/25 Python
基于随机梯度下降的矩阵分解推荐算法(python)
2018/08/31 Python
用Python实现BP神经网络(附代码)
2019/07/10 Python
Python pandas库中的isnull()详解
2019/12/26 Python
HTML5+CSS3模仿优酷视频截图功能示例
2017/01/05 HTML / CSS
html5教你做炫酷的碎片式图片切换 (canvas)
2017/07/28 HTML / CSS
希尔顿酒店中国网站:Hilton中国
2017/03/11 全球购物
《雷雨》教学反思
2014/02/20 职场文书
工艺工程师岗位职责
2014/03/04 职场文书
消防安全宣传口号
2014/06/10 职场文书
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
2014年转正工作总结
2014/11/08 职场文书
2014年就业工作总结
2014/11/26 职场文书
2014年政教处工作总结
2014/12/20 职场文书
2015年公司工作总结
2015/04/25 职场文书
SONY AN-LP1 短波有源天线放大器
2021/04/22 无线电
mysql中关键词exists的用法实例详解
2022/06/10 MySQL