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的强大选择器小结
Dec 27 Javascript
jQuery 文本框得失焦点的简单实例
Feb 19 Javascript
将HTML格式的String转化为HTMLElement的实现方法
Aug 07 Javascript
javascript中Number对象的toString()方法分析
Dec 20 Javascript
jQuery实现长按按钮触发事件的方法
Feb 02 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
May 20 Javascript
Angular.js指令学习中一些重要属性的用法教程
May 24 Javascript
JS沙箱模式实例分析
Sep 04 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
Jul 16 Javascript
函数式编程入门实践(一)
Apr 20 Javascript
详解Vue源码中一些util函数
Apr 24 Javascript
Vue实现下拉加载更多
May 09 Vue.js
纯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实现paypal整合方法
2010/11/28 PHP
PHP中is_file不能替代file_exists的理由
2014/03/04 PHP
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
php实现短信发送代码
2015/07/05 PHP
PHP数组基本用法与知识点总结
2020/06/02 PHP
laravel开发环境homestead搭建过程详解
2020/07/03 PHP
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
jQuery帮助之筛选查找 children([expr])
2011/01/31 Javascript
js不能跳转到上一页面的问题解决方法
2013/03/01 Javascript
javascript实现的DES加密示例
2013/10/30 Javascript
jquery日历控件实现方法分享
2014/03/07 Javascript
AngularJS入门教程之多视图切换用法示例
2016/11/02 Javascript
jQuery学习笔记之入门
2016/12/14 Javascript
使用Vue完成一个简单的todolist的方法
2017/12/01 Javascript
Vue+axios实现统一接口管理的方法
2018/07/23 Javascript
对vue中v-if的常见使用方法详解
2018/09/28 Javascript
使用koa-log4管理nodeJs日志笔记的使用方法
2018/11/30 NodeJs
如何在面试中手写出javascript节流和防抖函数
2020/10/22 Javascript
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
使用pandas读取文件的实现
2019/07/31 Python
Python 调用 Outlook 发送邮件过程解析
2019/08/08 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
Python values()与itervalues()的用法详解
2019/11/27 Python
Html5游戏开发之乒乓Ping Pong游戏示例(二)
2013/01/21 HTML / CSS
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
生产内勤岗位职责
2013/12/07 职场文书
《我的信念》教学反思
2014/02/15 职场文书
网络营销策划方案
2014/06/04 职场文书
装修施工安全责任书
2014/07/24 职场文书
机关党员三严三实心得体会
2014/10/13 职场文书
2015年青年志愿者工作总结
2015/05/20 职场文书
宣传稿格式范文
2015/07/23 职场文书
《称赞》教学反思
2016/02/17 职场文书
MySQL 亿级数据导入导出及迁移笔记
2021/06/18 MySQL
Java字符串逆序方法详情
2022/03/21 Java/Android