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 相关文章推荐
对textarea框的代码调试,而且功能上使用非常方便,酷
Jun 30 Javascript
解决AJAX中跨域访问出现'没有权限'的错误
Aug 20 Javascript
ExtJs 3.1 XmlTreeLoader Example Error
Feb 09 Javascript
JavaScript 题型问答有答案参考
Feb 17 Javascript
Extjs在exlipse中设置自动提示的方法
Apr 07 Javascript
jQuery中读取json文件示例代码
May 10 Javascript
基于JS实现无缝滚动思路及代码分享
Jun 07 Javascript
javaScript给元素添加多个class的简单实现
Jul 20 Javascript
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
Jun 13 jQuery
ES6 javascript中class静态方法、属性与实例属性用法示例
Oct 30 Javascript
Vuex 进阶之模块化组织详解
Jan 12 Javascript
vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法
Aug 22 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
让你同时上传 1000 个文件 (二)
2006/10/09 PHP
Breeze 文章管理系统 v1.0.0正式发布
2006/12/14 PHP
php模块memcache和memcached区别分析
2011/06/14 PHP
php实现自动获取生成文章主题关键词功能的深入分析
2013/06/03 PHP
基于PHP文件操作的详细诠释
2013/06/21 PHP
教你php如何实现验证码
2016/01/20 PHP
利用php的ob缓存机制实现页面静态化方法
2017/07/09 PHP
使用ucenter实现多站点同步登录的讲解
2019/03/21 PHP
js 多浏览器分别判断代码
2010/04/01 Javascript
js网页版计算器的简单实现
2013/07/02 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
node.js中的fs.symlink方法使用说明
2014/12/15 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
JS实现样式清新的横排下拉菜单效果
2015/10/09 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
2016/06/01 Javascript
Vue数据驱动模拟实现4
2017/01/12 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
javascript History对象原理解析
2020/02/17 Javascript
JavaScript实现网页留言板功能
2020/11/23 Javascript
一篇不错的Python入门教程
2007/02/08 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
python 实现PIL模块在图片画线写字
2020/05/16 Python
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
戴森美国官网:Dyson美国
2016/09/11 全球购物
雅高酒店中国:Accorhotels.com China
2018/03/26 全球购物
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
国土资源局开展党的群众路线教育实践活动整改措施
2014/09/26 职场文书
地下停车场租赁协议范本
2014/10/07 职场文书
2014年政府采购工作总结
2014/12/09 职场文书
2015年三万活动总结
2015/03/25 职场文书
财务部岗位职责范本
2015/04/14 职场文书
小学生心理健康活动总结
2015/05/08 职场文书
2016年小学生寒假家长评语
2015/10/10 职场文书
幼儿园开学家长寄语(2016春季)
2015/12/03 职场文书
python 逐步回归算法
2021/04/06 Python
js实现自动锁屏功能
2021/06/02 Javascript