Vue微信公众号网页分享的示例代码


Posted in Javascript onMay 28, 2020

前言

今天做了个分享功能,反正挺诡异的,下面就来说一说步骤

后端使用egg.js,代码如下:

'use strict';

const Subscription = require('egg').Subscription;

class AccessToken extends Subscription {
 static get schedule() {
  return {
   interval: '2h',//2小时获取一次
   type: 'all',
  };
 }

 async subscribe() {
  const config = this.ctx.app.config.wechat_config;
  const url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET'.replace('APPID', config.appId)
   .replace('APPSECRET', config.appSecret);
  const res = await this.ctx.curl(url, {
   dataType: 'json',
  });
  console.log(res);//accesstoken
  if (res.data.errcode) {
   return;
  }
  console.log('token ' + res.data.access_token);
  const jsUrl = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi'.replace('ACCESS_TOKEN', res.data.access_token);
  const jsRes = await this.ctx.curl(jsUrl, {
   dataType: 'json',
  });
  console.log('ticket ' + jsRes.data.ticket);//ticket
  this.ctx.app.ticket = jsRes.data.ticket;
  this.ctx.app.access_token = res.data.access_token;
 }
}

module.exports = AccessToken;
async getJSsdk() {
  const appId = this.ctx.app.config.wechat_config.appId;//appid
  const ticket = this.ctx.app.ticket;//初始化时获得的ticket
  const nonceStr = Math.random()
   .toString(36)
   .substr(2, 15);
  const timestamp = parseInt(new Date().getTime() / 1000);//秒为单位的时间戳
  let url = this.ctx.query.link; //前端的页面地址
  url = decodeURIComponent(url);//解码
  const string = 'jsapi_ticket=' + ticket + '&noncestr=' + nonceStr + '×tamp=' + timestamp + '&url=' + url;
  const hash = crypto.createHash('sha1');
  hash.update(string);
  const signature = hash.digest('hex');//生成签名
  this.ctx.body = {
   status: true,
   message: '获取成功',
   data
  };
 };

步骤

1.在vue项目中public目录下的index.html中引入

<script src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>

2.在想分享的组件的mounted中加入如下代码:

//如果不创建meta标签分享出去的就会没有描述
var oMeta = document.createElement('meta');
oMeta.content = '随意的内容';//这里随便写
oMeta.name = 'keywords';
document.getElementsByTagName('head')[0].appendChild(oMeta);
var oMeta1 = document.createElement('meta');
oMeta1.content = '随意的内容';//这里随便写
oMeta1.name = 'description';
document.getElementsByTagName('head')[0].appendChild(oMeta1);

3.initJSSDK方法体:

function initJSSDK() {
  let wechaturl = window.location.href.split('#')[0];//单页应用就获取#前面的东西
   let link = encodeURIComponent(wechaturl);
   const jssdk = await getJSSDK(link); //给后端接口传过去当前页面的地址,注意这个地址要配置在js安全域名里
   wx.ready(() => {
    let shareData = {
     title: this.detail.title,
     desc: this.detail.summary,
     link: location.href, //必须是js安全域名下的地址(分享出去的没有图片显示请检查这里的link参数)
     imgUrl: window.wechatImg,//随意地址的图片都行,最好是jpg的,经测试无图片大小约束
     success: function () {
      console.log(1);
     },
     cancel: function () {
      console.log(2);
     }
    };
    wx.onMenuShareAppMessage(shareData);//分享给好友
    wx.onMenuShareQQ(shareData);//分享给手机QQ
    wx.onMenuShareQZone(shareData);//分享到QQ空间
    wx.onMenuShareTimeline(shareData);//分享到朋友圈
   });
   wx.error(function (res) {
    console.log(res);
   });
   wx.config({
    debug: true,
    appId: jssdk.appId, // 必填,公众号的唯一标识
    timestamp: jssdk.timestamp, // 必填,生成签名的时间戳,精确到秒(后端返回)
    nonceStr: jssdk.nonceStr, // 必填,生成签名的随机串(后端返回)
    signature: jssdk.signature, // 必填,签名(后端返回)
    jsApiList: ['onMenuShareAppMessage', 'onMenuShareTimeline', 'onMenuShareQQ', 'onMenuShareQZone']
   });
}

常见问题

无效的签名:可能是前端encode地址过去后,后端忘记解码了,也有可能是因为前端地址传错了或者没有encode就传过去了,后端签名算法出错的机率比较小.

还有可能是后端的ticket失效了(这个在开发过程中机率比较小)

无效的domain:前端给后端传的地址可能没有配置在js安全域名中

jssdk版本就用上面的1.4版本,同样的代码用了新版的就直接不行了,也没有任何报错。

暂时没有发现网上所说的苹果会出现问题。经测试都是好的

到此这篇关于Vue微信公众号网页分享的示例代码的文章就介绍到这了,更多相关Vue公众号网页分享内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
让firefox支持IE的一些方法的javascript扩展函数代码
Jan 02 Javascript
JavaScript判断用户是否对表单进行了修改的方法
Mar 18 Javascript
jQuery实现图片左右滚动特效
Apr 20 Javascript
详解JavaScript语言的基本语法要求
Nov 20 Javascript
jquery对象访问是什么及使用方法介绍
May 03 Javascript
深入理解JavaScript函数参数(推荐)
Jul 26 Javascript
Vue.js实例方法之生命周期详解
Jul 03 Javascript
浅谈sass在vue注意的地方
Aug 10 Javascript
vue watch自动检测数据变化实时渲染的方法
Jan 16 Javascript
vue中实现图片和文件上传的示例代码
Mar 16 Javascript
微信小程序登录时如何获取input框中的内容
Dec 04 Javascript
Js类的构建与继承案例详解
Sep 15 Javascript
纯JS实现五子棋游戏
May 28 #Javascript
js实现简单五子棋游戏
May 28 #Javascript
js实现双人五子棋小游戏
May 28 #Javascript
vue实现五子棋游戏
May 28 #Javascript
用vue 实现手机触屏滑动功能
May 28 #Javascript
Jquery高级应用Deferred对象原理及使用实例
May 28 #jQuery
JQuery插件tablesorter表格排序实现过程解析
May 28 #jQuery
You might like
php 表单验证实现代码
2009/03/10 PHP
PHP array 的加法操作代码
2010/07/24 PHP
php中计算未知长度的字符串哪个字符出现的次数最多的代码
2012/08/14 PHP
php批量删除cookie的简单实现方法
2015/01/26 PHP
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
javascript setTimeout()传递函数参数(包括传递对象参数)
2010/04/07 Javascript
jQuery 表单验证扩展代码(二)
2010/10/20 Javascript
网页编辑器ckeditor和ckfinder配置步骤分享
2012/05/24 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
js 采用delete实现继承示例代码
2014/05/20 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
原生JS实现图片左右轮播
2016/12/30 Javascript
angular实现表单验证及提交功能
2017/02/01 Javascript
基于JavaScript实现下拉列表左右移动代码
2017/02/07 Javascript
Express + Node.js实现登录拦截器的实例代码
2017/07/01 Javascript
Vue0.1的过滤代码如何添加到Vue2.0直接使用
2017/08/23 Javascript
jquery在vue脚手架中的使用方式示例
2017/08/29 jQuery
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
JS学习笔记之原型链和利用原型实现继承详解
2019/05/29 Javascript
功能完善的小程序日历组件的实现
2020/03/31 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
python编写微信远程控制电脑的程序
2018/01/05 Python
python中logging包的使用总结
2018/02/28 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
Django中信号signals的简单使用方法
2019/07/04 Python
python+opencv3生成一个自定义纯色图教程
2020/02/19 Python
使用Python实现音频双通道分离
2020/12/25 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
2020/12/27 Python
Europcar西班牙:全球汽车租赁领域的领导者
2018/09/17 全球购物
乡镇庆八一活动方案
2014/02/02 职场文书
采购员岗位职责范本
2015/04/07 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
2016创先争优活动党员公开承诺书
2016/03/24 职场文书
html css3不拉伸图片显示效果
2021/06/07 HTML / CSS