网络编程 
首页 > 网络编程 > 浏览文章

Vue微信公众号网页分享的示例代码

(编辑:jimmy 日期: 2024/11/26 浏览:3 次 )

前言

今天做了个分享功能,反正挺诡异的,下面就来说一说步骤

后端使用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"htmlcode">
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 + '&timestamp=' + 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="/UploadFiles/2021-04-02/jweixin-1.4.0.js">

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版本,同样的代码用了新版的就直接不行了,也没有任何报错。

暂时没有发现网上所说的苹果会出现问题。经测试都是好的

上一篇:原生js实现五子棋游戏
下一篇:纯JS实现五子棋游戏
荣耀猎人回归!七大亮点看懂不只是轻薄本,更是游戏本的MagicBook Pro 16.
人们对于笔记本电脑有一个固有印象:要么轻薄但性能一般,要么性能强劲但笨重臃肿。然而,今年荣耀新推出的MagicBook Pro 16刷新了人们的认知——发布会上,荣耀宣布猎人游戏本正式回归,称其继承了荣耀 HUNTER 基因,并自信地为其打出“轻薄本,更是游戏本”的口号。
众所周知,寻求轻薄本的用户普遍更看重便携性、外观造型、静谧性和打字办公等用机体验,而寻求游戏本的用户则普遍更看重硬件配置、性能释放等硬核指标。把两个看似难以相干的产品融合到一起,我们不禁对它产生了强烈的好奇:作为代表荣耀猎人游戏本的跨界新物种,它究竟做了哪些平衡以兼顾不同人群的各类需求呢?