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 相关文章推荐
前端开发必须知道的JS之原型和继承
Jul 06 Javascript
Jquery Ajax xmlhttp请求成功问题
Feb 04 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
Sep 16 Javascript
JS实现的3D拖拽翻页效果代码
Oct 31 Javascript
jQuery动画效果相关方法实例分析
Dec 31 Javascript
JS中的forEach、$.each、map方法推荐
Apr 05 Javascript
bootstrap table操作技巧分享
Feb 15 Javascript
微信小程序 开发之顶部导航栏实例代码
Feb 23 Javascript
浅析Angular2子模块以及异步加载
Apr 24 Javascript
Angular 5.0 来了! 有这些大变化
Nov 15 Javascript
angular 实现同步验证器跨字段验证的方法
Apr 11 Javascript
Vue中this.$nextTick的作用及用法
Feb 04 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递归创建和删除文件夹的代码小结
2012/04/13 PHP
php编译安装php-amq扩展简明教程
2016/06/25 PHP
CI框架实现优化文件上传及多文件上传的方法
2017/01/04 PHP
JavaScript 私有成员分析
2009/01/13 Javascript
JQuery获取各种宽度、高度(format函数)实例
2013/03/04 Javascript
jquery sortable的拖动方法示例详解
2014/01/16 Javascript
node.js中的fs.unlinkSync方法使用说明
2014/12/15 Javascript
纯JavaScript代码实现文本比较工具
2016/02/17 Javascript
基于jQuery的checkbox全选问题分析
2016/11/18 Javascript
javascript简单进制转换实现方法
2016/11/24 Javascript
JS实战篇之收缩菜单表单布局
2016/12/10 Javascript
Vue学习笔记进阶篇之函数化组件解析
2017/07/21 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
2017/10/28 jQuery
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
简述vue状态管理模式之vuex
2018/08/29 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
vue动态绘制四分之三圆环图效果
2019/09/03 Javascript
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
Python用GET方法上传文件
2015/03/10 Python
在Python中操作字典之update()方法的使用
2015/05/22 Python
Python Dataframe 指定多列去重、求差集的方法
2018/07/10 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
2019/05/28 Python
python and or用法详解
2019/06/26 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
2019/07/16 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
python第三方库学习笔记
2020/02/07 Python
查看已安装tensorflow版本的方法示例
2020/04/19 Python
德国机车企业:FC-Moto
2017/10/27 全球购物
全球最大的生存食品、水和装备专用在线市场:BePrepared.com
2020/01/02 全球购物
shell变量的作用空间是什么
2013/08/17 面试题
2014年煤矿安全工作总结
2014/12/04 职场文书
毕业设计致谢语
2015/05/14 职场文书
小马王观后感
2015/06/11 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
python脚本框架webpy模板赋值实现
2021/11/20 Python