nodeJS微信分享

NodeJS微信分享的完整攻略

微信分享可以让我们的网站在微信中分享链接,提高网站的露出率,这对于初创企业或新兴网站来说非常有用。可以使用NodeJS编写一个中间层,来实现生成微信签名以及管理分享的过程。

分享流程简介

用户点击“分享到微信朋友圈”或“分享给微信好友”按钮时,微信客户端会请求我们网站的签名信息和分享页面的链接。我们的网站需要在请求到来时,返回一组签名信息和分享页面的链接,微信客户端则会使用这组信息进行微信分享。

以下为分享流程的详细说明:

  1. 用户在微信中点击分享链接,微信会向服务器请求签名信息和分享页面的链接。

  2. 服务器接收到请求,根据分享页面的链接和当前用户的查询生成签名信息。

  3. 服务器将签名信息和分享页面链接返回给微信客户端。

  4. 微信客户端使用签名信息和分享链接进行分享。

生成签名信息

生成签名信息的过程中,需要使用到微信提供的API以及NodeJS中的crypto模块。

步骤1:获取AccessToken

使用微信提供的https://api.weixin.qq.com/cgi-bin/token接口,获取AccessToken。AccessToken是微信用来验证我们身份的必要参数,需要使用申请的appId和appSecret。

示例代码:

/**
 * 获取AccessToken
 * @param {string} appId 应用ID
 * @param {string} appSecret 应用Secret
 * @returns {Promise<string>}
 */
async function getAccessToken(appId, appSecret) {
  const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appId}&secret=${appSecret}`;

  const res = await axios.get(url);
  const accessToken = res?.data?.access_token;

  if (!accessToken) {
    console.error('获取access_token失败');
    return '';
  }

  return accessToken;
}

步骤2:生成签名信息

使用微信提供的https://api.weixin.qq.com/cgi-bin/ticket/getticket接口,获取api ticket。 ticket过期时间为7200秒,需要在使用前检查ticket是否过期,如果过期则重新获取。

示例代码:

/**
 * 生成签名信息
 * @param {string} url 分享链接
 * @param {string} accessToken 微信AccessToken
 * @returns {Object} WX api signature object
 */
async function makeWXSignature(url, accessToken) {
  // 检查 ticket 是否过期
  let ticket = config.WXTicket;
  let expiredAt = config.WXTicketExpiredAt;
  if (new Date().getTime() > expiredAt) {
    const ticketUri = `https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=${accessToken}&type=jsapi`;
    const res = await axios.get(ticketUri);
    if (res.data.errcode === 0) {
      ticket = res.data.ticket;
      expiredAt = new Date().getTime() + (res.data.expires_in - 300) * 1000; // 过期时间比实际过期时间少300秒,以防万一
      config.WXTicket = ticket;
      config.WXTicketExpiredAt = expiredAt;
    } else {
      console.error(`获取WX ticket失败: ${JSON.stringify(res.data)}`);
      return null;
    }
  }

  // 生成签名信息
  const nonceStr = crypto.randomBytes(16).toString('hex');
  const timestamp = parseInt(new Date().getTime() / 1000);
  const wxParams = {
    noncestr: nonceStr,
    jsapi_ticket: ticket,
    timestamp: timestamp,
    url: url
  };

  const sortKeys = Object.keys(wxParams).sort();
  const wxString = sortKeys.map(key => `${key}=${wxParams[key]}`).join('&');
  const signature = crypto.createHash('sha1').update(wxString).digest('hex');

  return {
    appId: config.WXAppId,
    timestamp: timestamp,
    nonceStr: nonceStr,
    signature: signature
  };
}

分享页面元标签

我们需要在网站的head标签中定义好微信分享所需要的元标签。以下为一个示例:

<meta property="og:title" content="这里是标题" />
<meta property="og:description" content="这里是简介" />
<meta property="og:image" content="这里是图片链接" />
<meta property="og:type" content="website" />
<meta property="og:url" content="这里是分享的地址" />

其中,og:title代表分享的标题,og:description代表分享的简介,og:image代表分享的缩略图,og:type代表分享的类型,可以是websitemusic等,og:url代表分享的链接地址。

分享实现

点击“分享到微信朋友圈”或者“分享给微信好友”按钮后,需要调用客户端的分享接口。

朋友圈分享

/**
 * 微信分享到朋友圈
 * @param {string} title 分享的标题
 * @param {string} link 分享的链接
 * @param {string} imgUrl 分享的图片地址
 * @returns {Promise<void>}
 */
async function shareTimeline(title, link, imgUrl) {
  wx.onMenuShareTimeline({
    title: title,
    link: link,
    imgUrl: imgUrl,
    success: function () {
      console.log('分享成功');
    },
    fail: function (err) {
      console.error('分享失败', err);
    }
  });
}

好友分享

/**
 * 微信分享给好友
 * @param {string} title 分享的标题
 * @param {string} desc 分享的描述
 * @param {string} link 分享的链接
 * @param {string} imgUrl 分享的缩略图链接
 */
async function shareFriend(title, desc, link, imgUrl) {
  wx.onMenuShareAppMessage({
    title: title,
    desc: desc,
    link: link,
    imgUrl: imgUrl,
    success: function () {
      console.log('分享成功');
    },
    fail: function (err) {
      console.error('分享失败', err);
    }
  });
}

以上两个函数均需要在初始化微信JSSDK时调用。具体实现请参照微信JSSDK开发文档。

结语

通过以上步骤,我们可以实现一个完整的微信分享功能。生成微信签名信息时,需要获取微信AccessToken以及API Ticket,分享流程中需要在网站head标签中定义分享的元标签,并且点击分享按钮时,需要在前端调用微信JSSDK提供的分享接口。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:nodeJS微信分享 - Python技术站

(0)
上一篇 2023年6月9日
下一篇 2023年6月9日

相关文章

  • 使用js实现单链解决前端队列问题的方法

    使用 JavaScript 实现单链解决前端队列问题的方法,可以分为以下几个步骤: 1. 创建队列类 我们可以使用面向对象的思想,创建一个队列类,里面包含一些常用的属性和方法。具体来说,我们可以定义一个 Queue 类,其中包含属性 head 和 tail 分别代表队列头尾指针,为空时都指向 null,以及方法 enqueue() 和 dequeue() 分…

    node js 2023年6月8日
    00
  • 使用imba.io框架得到比 vue 快50倍的性能基准

    使用imba.io框架得到比vue快50倍的性能基准是基于一个开源项目的比较得出的结论。下面是如何进行该测试的攻略: 1. 准备工作 首先,需要确保计算机上已经安装了Node.js和NPM。然后,在命令行中运行以下命令来安装依赖项: npm install -g vue-cli npm install -g imba 这将安装Vue和Imba的命令行工具。 …

    node js 2023年6月8日
    00
  • 关于npm主版本升级及其相关知识点总结

    关于npm主版本升级及其相关知识点总结,我会从以下几个方面逐一进行讲解: npm版本号格式 npm主版本升级的含义 如何进行npm主版本升级 升级后的注意事项 1. npm版本号格式 在深入讲解npm主版本升级之前,我们首先需要了解npm版本号的格式。npm版本号是由三个部分组成的,分别是:主版本号、次版本号和修订号,格式为:X.Y.Z。 其中,X代表主版本…

    node js 2023年6月8日
    00
  • JavaScript实现单链表过程解析

    JavaScript实现单链表过程解析 什么是单链表? 单链表是一种常见的数据结构,它由若干个节点组成,每个节点包含两个部分:数据域和指针域。数据域用来存储节点的数据,指针域则用来存储下一个节点的地址。由于每个节点只包含一个指针域,所以它们被称为单链表。 实现单链表的关键操作 1.创建节点 创建节点的过程就是一个简单的对象创建过程,我们可以使用对象字面量来表…

    node js 2023年6月8日
    00
  • nodejs 中模拟实现 emmiter 自定义事件

    下面是详细讲解 “nodejs 中模拟实现 emitter 自定义事件” 的完整攻略。 1. 什么是 emitter 自定义事件 在 nodejs 中,EventEmitter 是一个非常重要的模块。其作用是提供了处理事件的基本机制,可以用于实现自定义事件。 实际上,EventEmitter 可以理解为用于注册和监听事件的中介。我们可以通过它来注册自定义事件…

    node js 2023年6月8日
    00
  • Node.js express中的身份认证的实现

    Node.js express中的身份认证是Web应用开发中非常重要的一环。以下是实现身份认证的完整攻略: Step1:安装相关模块 首先安装以下模块: express-session:用于维持用户的会话状态 passport:提供了运用于Node.js的身份验证中间件 passport-local:用于基于用户名和密码的身份验证策略 bcryptjs:用于…

    node js 2023年6月8日
    00
  • 使用GruntJS构建Web程序之Tasks(任务)篇

    使用GruntJS构建Web程序之Tasks(任务)篇 在 GruntJS 中,任务(Tasks)是指一组执行一些特定的工作的命令。GruntJS 提供了很多内置的任务,比如文件的复制、合并、压缩等等,同时也支持使用插件编写自定义任务。在本篇中,我们将深入学习 GruntJS 的任务相关知识。 任务的定义 下面是一个使用 GruntJS 定义任务的示例: m…

    node js 2023年6月8日
    00
  • node删除、复制文件或文件夹示例代码

    下面是针对Node.js删除、复制文件或文件夹的完整攻略。 删除文件或文件夹 删除单个文件 使用fs.unlink()可以删除单个文件,示例代码如下: const fs = require(‘fs’); fs.unlink(‘/path/to/file’, (err) => { if (err) throw err; console.log(‘文件已经…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部