https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html

请先查阅官方的说明文档,本教程主要是帮助你如何获取当前页面的签名数据,签名正确有方可调用文档中的各种js方法:

image.png

签名正确后,将会回调 wx.ready 方法,反之会调用 wx.error 方法,开发阶段,建议设置 debug: true ,将会输出丰富的调试信息。

签名接口

详见前端接口文档中的:“微信公众号js-sdk获取sign签名” 接口:

image.png

示例代码

下面将举例 vue 开发模式下的使用方法:

vue调用分享

  1. npm install weixin-js-sdk --save

安装好插件以后,创建一个公共js文件,方便后续调用:

wxShare.js

  1. /* eslint-disable */
  2. import Vue from 'vue';
  3. import wx from 'weixin-js-sdk';
  4. //存储各个链接的签名信息
  5. const signMap = new Map();
  6. // 设置默认的分享信息,因为如分享图、请求授权项、隐藏授权项等基本不变,此处设置直接引用,避免使用时繁琐设置
  7. const defaultWxShareConfig = {
  8. title: "分享标题(通常是动态的)",
  9. desc: '分享描述(通常是动态的)',
  10. link: window.location.href,
  11. imgUrl: '分享图片地址',
  12. jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage', 'hideMenuItems', 'closeWindow'],
  13. hideMenuList: ['menuItem:editTag', 'menuItem:delete', 'menuItem:originPage', 'menuItem:readMode','menuItem:openWithQQBrowser', 'menuItem:openWithSafari', 'menuItem:share:email', 'menuItem:share:brand']
  14. }
  15. //存储临时的分享信息
  16. const wxShareConfig = {
  17. }
  18. const wxShare = {
  19. //各个页面加载后,调用此方法,传入的参数config是对象,其属性参考defaultWxShareConfig
  20. updateWxShareConfig(config = {}) {
  21. wxShareConfig.title = config.title || defaultWxShareConfig.title;
  22. wxShareConfig.desc = config.desc || defaultWxShareConfig.desc;
  23. wxShareConfig.link = config.link || defaultWxShareConfig.link;
  24. wxShareConfig.imgUrl = config.imgUrl || defaultWxShareConfig.imgUrl;
  25. wxShareConfig.jsApiList = config.jsApiList || defaultWxShareConfig.jsApiList;
  26. wxShareConfig.hideMenuList = config.hideMenuList || defaultWxShareConfig.hideMenuList;
  27. var authUrl = window.location.href
  28. const ua = navigator.userAgent
  29. const isAndroid = ua.indexOf('Android') > -1 || ua.indexOf('Adr') > -1
  30. const isiOS = !!ua.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)
  31. if (isiOS) {
  32. authUrl = 'ios系统,授权地址必须使用第一次打开时候的地址,中途换的地址不识别'
  33. }
  34. //判断是否已经签名了
  35. if (signMap.has(authUrl)) {
  36. this._wxConfigJSSDK(signMap.get(authUrl), wxShareConfig);
  37. } else {
  38. this.wxShareAuth(authUrl);
  39. }
  40. },
  41. //从服务器获取某分享链接的签名信息,并存储起来
  42. async wxShareAuth(authUrl) {
  43. //此处我使用的是自己封装的网络请求方法
  44. var postData = {
  45. url: authUrl
  46. }
  47. const res = await requestApi('/gooking/wx/jssdk/sign', 'post', postData)
  48. if (res.code == 0) {
  49. //分享链接授权签名信息
  50. const sign = res.data;
  51. signMap.set(authUrl, sign);
  52. this._wxConfigJSSDK(sign);
  53. }
  54. },
  55. //将签名信息更新到微信的SDK中
  56. _wxConfigJSSDK(shareSign) {
  57. wx.config({
  58. debug: false,
  59. appId: shareSign.appid,
  60. timestamp: shareSign.timestamp,
  61. nonceStr: shareSign.noncestr,
  62. signature: shareSign.sign,
  63. jsApiList: ['onMenuShareAppMessage', 'onMenuShareTimeline']
  64. })
  65. // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
  66. wx.ready(function() {
  67. const {title,desc,link,imgUrl} = wxShareConfig;
  68. wx.onMenuShareAppMessage({
  69. title,
  70. desc,
  71. link,
  72. imgUrl,
  73. success: function() {
  74. console.log("分享成功");
  75. },
  76. fail: function() {
  77. console.log("分享失败");
  78. },
  79. cancel: function() {
  80. console.log("取消分享");
  81. }
  82. })
  83. wx.onMenuShareTimeline({
  84. title,
  85. link,
  86. imgUrl,
  87. success: function() {
  88. console.log("分享成功");
  89. },
  90. cancel: function() {
  91. console.log("取消分享");
  92. }
  93. })
  94. });
  95. // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
  96. wx.error(function(res) {
  97. console.log("分享失败: error", res);
  98. });
  99. }
  100. }
  101. //导出工具类
  102. export default wxShare;
  103. //将工具类添加到Vue静态方法方便调用
  104. Vue.prototype.$wxShare = wxShare;

上述代码中,调用接口的代码,根据你自己的实际情况调用

main.js 中全局引入:

  1. import './utils/wxShare'

需要分享的页面,直接调用:

  1. this.$wxShare.updateWxShareConfig({
  2. title: '分享标题',
  3. desc: '分享介绍',
  4. imgUrl: '分享图片地址',
  5. link: '链接地址'
  6. })