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 相关文章推荐
javaScript 判断字符串是否为数字的简单方法
Jul 25 Javascript
jquery CSS选择器笔记
Mar 29 Javascript
javascript代码编写需要注意的7个小细节小结
Sep 21 Javascript
Bootstrap每天必学之进度条
Nov 30 Javascript
Angularjs过滤器使用详解
May 25 Javascript
confirm确认对话框的实现方法总结
Jun 17 Javascript
浅析上传头像示例及其注意事项
Dec 14 Javascript
AngularJS中的promise用法分析
May 19 Javascript
js is_valid_filename验证文件名的函数
Jul 19 Javascript
详解javascript replace高级用法
Feb 17 Javascript
vue实现动态按钮功能
May 13 Javascript
vue中node_modules中第三方模块的修改使用详解
May 31 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 self与$this的详解
2013/06/08 PHP
PHP的引用详解
2015/02/22 PHP
php常用图片处理类
2016/03/16 PHP
PHP crc32()函数讲解
2019/02/14 PHP
关于laravel 子查询 &amp; join的使用
2019/10/16 PHP
tp5.1框架数据库子查询操作实例分析
2020/05/26 PHP
jQuery 表单验证扩展(三)
2010/10/20 Javascript
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
angularJS 入门基础
2015/02/09 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
神奇!js+CSS+DIV实现文字颜色渐变效果
2016/03/16 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
最实用的jQuery分页插件
2016/10/09 Javascript
jQuery EasyUI 右键菜单--关闭标签/选项卡的简单实例
2016/10/10 Javascript
AngularJS的$location使用方法详解
2017/10/19 Javascript
在Angular中使用JWT认证方法示例
2018/09/10 Javascript
javascript异常处理实现原理详解
2020/02/17 Javascript
vue开发简单上传图片功能
2020/06/30 Javascript
[41:37]DOTA2北京网鱼队选拔赛——冲击职业之路
2015/04/13 DOTA
分析python服务器拒绝服务攻击代码
2014/01/16 Python
常用python编程模板汇总
2016/02/12 Python
基于windows下pip安装python模块时报错总结
2018/06/12 Python
django 中的聚合函数,分组函数,F 查询,Q查询
2019/07/25 Python
python能做哪方面的工作
2020/06/15 Python
使用css3做0.5px的细线的示例代码
2018/01/18 HTML / CSS
Grid 宫格常用布局的实现
2020/01/10 HTML / CSS
Fashion Eyewear美国:英国线上设计师眼镜和太阳镜的零售商
2016/08/15 全球购物
世界上最大的专业美容用品零售商:Sally Beauty
2017/07/02 全球购物
护士实习鉴定范文
2013/12/22 职场文书
开工庆典邀请函范文
2014/01/16 职场文书
个人求职自荐信范文
2015/03/06 职场文书
幼儿园工作总结2015
2015/04/01 职场文书
八月一日观后感
2015/06/10 职场文书
小学生反邪教心得体会
2016/01/15 职场文书