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 相关文章推荐
学习ExtJS(二) Button常用方法
Oct 07 Javascript
javascript 触发HTML元素绑定的函数
Sep 11 Javascript
jQueryMobile之Helloworld与页面切换的方法
Feb 04 Javascript
JS+CSS实现自动切换的网页滑动门菜单效果代码
Sep 14 Javascript
如何使用AngularJs打造权限管理系统【简易型】
May 09 Javascript
JS实现点击事件统计的简单实例
Jul 10 Javascript
JS仿百度自动下拉框模糊匹配提示
Jul 25 Javascript
用jQuery.ajaxSetup实现对请求和响应数据的过滤
Dec 20 Javascript
JavaScript 用fetch 实现异步下载文件功能
Jul 21 Javascript
基于JavaScript实现评论框展开和隐藏功能
Aug 25 Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
Feb 12 Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
Apr 25 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 MYSQL中插入当前时间
2008/04/06 PHP
ThinkPHP实现二级循环读取的方法
2014/11/03 PHP
PHP实现全角字符转为半角方法汇总
2015/07/09 PHP
YII框架批量插入数据的方法
2017/03/18 PHP
TP5多入口设置实例讲解
2020/12/15 PHP
让你的博文自动带上缩址的实现代码,方便发到微博客上
2010/12/28 Javascript
深入了解javascript中的prototype与继承
2013/04/14 Javascript
jquery 合并内容相同的单元格(示例代码)
2013/12/13 Javascript
JSONP跨域的原理解析及其实现介绍
2014/03/22 Javascript
node.js中的fs.lchown方法使用说明
2014/12/16 Javascript
JS更改select内option属性的方法
2015/10/14 Javascript
Angular2 (RC4) 路由与导航详解
2016/09/21 Javascript
jquery判断页面网址是否有效的两种方法
2016/12/11 Javascript
微信小程序实现图片选择并预览功能
2019/07/25 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
js实现消灭星星(web简易版)
2020/03/24 Javascript
Python实现截屏的函数
2015/07/25 Python
Python过滤列表用法实例分析
2016/04/29 Python
python itchat实现微信自动回复的示例代码
2017/08/14 Python
使用python 和 lint 删除项目无用资源的方法
2017/12/20 Python
python3中函数参数的四种简单用法
2018/07/09 Python
python 获得任意路径下的文件及其根目录的方法
2019/02/16 Python
python实现KNN分类算法
2019/10/16 Python
python画图常规设置方式
2020/03/05 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
python request 模块详细介绍
2020/11/10 Python
HTML5 canvas 基本语法
2009/08/26 HTML / CSS
Shopee越南:东南亚与台湾电商平台
2019/02/03 全球购物
房务中心文员岗位职责
2014/04/16 职场文书
药品业务员岗位职责
2014/04/17 职场文书
食品委托检验协议书范本
2014/09/12 职场文书
《小乌鸦爱妈妈》教学反思
2016/02/19 职场文书
幼儿园教学反思范文
2016/03/02 职场文书
带你学习MySQL执行计划
2021/05/31 MySQL
GPU服务器的多用户配置方法
2022/07/07 Servers