nodeJS微信分享

yizhihongxing

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日

相关文章

  • Node.js实战之Buffer和Stream模块系统深入剖析详解

    Node.js实战之Buffer和Stream模块系统深入剖析详解 什么是Buffer和Stream Buffer是用于处理二进制数据的模块,它将数据存储在内存中的固定大小的缓冲区中,可以快速地分配和释放内存并进行快速且高效的读写操作。 Stream则是一种处理数据流的模块,用于处理实时数据源如网络、文件等产生的数据。Stream可以将数据分成小块,这样就可…

    node js 2023年6月8日
    00
  • kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.

    当我们在使用Kafka时,有时会遇到“Connection to node -1 could not be established. Broker may not be available.”这个错误,这在Kafka调试中是比较常见的问题。这个问题的产生可能与以下原因有关: Kafka与Zookeeper连接故障 Kafka Broker宕机 Kafka配置…

    node js 2023年6月8日
    00
  • 在Node.js中使用Javascript Generators详解

    绝大多数JavaScript程序是单线程的,因此通过异步编程实现非阻塞I/O操作是非常重要的,因为它可以增强JavaScript程序性能和可扩展性。而JavaScript中的Generator函数,可以在程序中实现异步编程机制。 本攻略将介绍如何在Node.js中使用JavaScript Generator函数。以下是详细步骤: 第一步:理解Generato…

    node js 2023年6月8日
    00
  • Node.js读取文件内容示例

    下面是关于Node.js读取文件内容示例的完整攻略: 1. 确认读取文件的路径 在使用Node.js读取文件内容之前,我们首先需要确认待读取文件的路径。通常情况下,我们可以通过path模块提供的join方法来拼接文件路径。 const path = require(‘path’); const filePath = path.join(__dirname, …

    node js 2023年6月8日
    00
  • Koa 中的错误处理解析

    Koa 是一个现代化的 Node.js 框架,具有轻量、高效、可定制等特点。在使用 Koa 进行开发的过程中,经常需要对错误进行处理。本文将为大家详细讲解如何在 Koa 中进行错误处理。 1. 错误处理的重要性 在任何项目中,错误都是难免的。对错误进行及时有效的处理,能够提高程序的鲁棒性和健壮性;而忽略错误的处理,则容易导致应用出现不可预料的问题,甚至引发系…

    node js 2023年6月8日
    00
  • Node.js 8 中的重要新特性

    Node.js 8中引入了许多重要新特性,这些特性可能会改变您开发应用程序的方式。下面我们将一一介绍这些新特性。 1. 异步迭代器 Node.js 8中引入了异步迭代器,这是对迭代器ES6规范的扩展。异步迭代器允许我们在处理大量异步数据时更加方便地使用for await…of结构。 const fetch = require(‘node-fetch’);…

    node js 2023年6月7日
    00
  • vue使用jsonp抓取qq音乐数据的方法

    下面是详细讲解vue使用jsonp抓取qq音乐数据的方法的完整攻略。 步骤一:了解JSONP原理 JSONP是一种数据传输方式,它的原理是利用html的script标签没有跨域限制这一特性,在同一个页面中,通过向服务器请求一个jsonp类型的文件,服务器解析后返回数据,并在返回数据中添加一个函数调用语句,浏览器接收到响应文件后自动执行函数,从而实现了跨域访问…

    node js 2023年6月8日
    00
  • Node.js高级编程使用RPC通信示例详解

    关于“Node.js高级编程使用RPC通信示例详解”的完整攻略,我可以给出以下详细讲解。 什么是RPC RPC(Remote Procedure Call)远程过程调用,简单来说它可以让不同的计算机之间通过网络来通信和传输数据,让这些节点彼此之间能够像本地程序一样进行通信和数据交换。RPC的实现可以有多种方法,如使用TCP、HTTP等协议,JSON等数据交换…

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