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 相关文章推荐
编写自己的jQuery插件简单实现代码
Apr 19 Javascript
JavaScript之编码规范 推荐
May 23 Javascript
Document.location.href和.replace的区别示例介绍
Mar 04 Javascript
jQuery绑定事件不执行但alert后可以正常执行
Jun 03 Javascript
JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js
Sep 14 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
Feb 18 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
Sep 05 Javascript
JavaScript字符集编码与解码详谈
Feb 02 Javascript
AngularJS表单验证功能
Oct 19 Javascript
vue2.0 资源文件assets和static的区别详解
Apr 08 Javascript
JavaScript ES6常用基础知识总结
Feb 09 Javascript
微信小程序下拉菜单效果的实例代码
May 14 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 特殊字符处理函数
2008/09/05 PHP
PHP 数组基础知识小结
2010/08/20 PHP
Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解
2016/03/07 PHP
Thinkphp 中 distinct 的用法解析
2016/12/14 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
28个JS验证函数收集
2010/03/02 Javascript
使用JQuery和CSS模拟超链接的用户单击事件的实现代码
2012/05/23 Javascript
利用JS解决ie6不支持max-width,max-height问题的方法
2014/01/02 Javascript
javascript消除window.close()的提示窗口
2015/05/20 Javascript
jQuery内容折叠效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
jQuery简单实现上下,左右滑动的方法
2016/06/01 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
2016/06/07 Javascript
JavaScript之Vue.js【入门基础】
2016/12/06 Javascript
利用vue写todolist单页应用
2016/12/15 Javascript
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
JavaScript 防盗链的原理以及破解方法
2020/12/29 Javascript
[01:43]3.19DOTA2发布会 三代刀塔人第三代
2014/03/25 DOTA
[47:03]Ti4第二日主赛事败者组 LGD vs iG 2
2014/07/21 DOTA
[48:30]LGD vs infamous Supermajor小组赛D组 BO3 第一场 6.3
2018/06/04 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
python实现批量改文件名称的方法
2015/05/25 Python
Python实现获取命令行输出结果的方法
2017/06/10 Python
详解python3中socket套接字的编码问题解决
2017/07/01 Python
python按时间排序目录下的文件实现方法
2018/10/17 Python
python实现微信自动回复及批量添加好友功能
2019/07/03 Python
Python assert语句的简单使用示例
2019/07/28 Python
HTML5不支持标签和新增标签详解
2016/06/27 HTML / CSS
独特的礼品和创新的科技产品:The Grommet
2018/02/24 全球购物
Baracuta官方网站:Harrington夹克,G9,G4,G10等
2018/03/06 全球购物
美体小铺印度官网:The Body Shop印度
2019/10/17 全球购物
施工员岗位职责
2014/03/16 职场文书
优秀少先队员主要事迹材料
2014/05/28 职场文书
初中毕业生感言
2015/07/31 职场文书
2019开业庆典剪彩仪式主持词!
2019/07/22 职场文书
如何有效防止sql注入的方法
2021/05/25 SQL Server