生成微信JSSDK签名接口在Node.js后端

作者:谁偷走了我的奶酪2024.04.15 12:06浏览量:54

简介:本文将介绍如何在Node.js后端编写一个生成微信JSSDK签名的接口,以便在微信网页开发中实现微信登录、分享等功能。

微信JSSDK为开发者提供了在网页中调用微信原生功能的能力,如微信登录、分享、支付等。在使用这些功能之前,开发者需要按照微信JSSDK的要求生成一个签名(signature),并在前端页面中进行验证。下面是一个简单的Node.js后端接口,用于生成微信JSSDK签名。

1. 安装依赖

首先,需要安装一些Node.js的依赖包,包括requestqsrequest用于发起HTTP请求,qs用于将对象转换为查询字符串格式。

  1. npm install request qs

2. 创建签名接口

接下来,创建一个名为wechatSignature.js的文件,并在其中编写生成签名的接口。

```javascript
const request = require(‘request’);
const qs = require(‘qs’);
const crypto = require(‘crypto’);

const APPID = ‘your_appid’; // 替换为你的AppID
const APPSECRET = ‘your_appsecret’; // 替换为你的AppSecret

// 生成随机字符串
function createNonceStr(length) {
const chars = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789’;
let result = ‘’;
for (let i = 0; i < length; i++) {
result += chars[Math.floor(Math.random() * chars.length)];
}
return result;
}
// 生成签名
function generateSignature(url, timestamp, nonceStr) {
const string1 = ${APPID}${timestamp}${nonceStr};
const string2 = crypto.createHash(‘sha1’).update(string1).digest(‘hex’);
return string2;
}
// 获取微信access_token
function getAccessToken(callback) {
const options = {
url: https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APPID}&secret=${APPSECRET},
method: ‘GET’,
};
request(options, (error, response, body) => {
if (!error && response.statusCode === 200) {
const result = JSON.parse(body);
if (result.access_token) {
callback(null, result.access_token);
} else {
callback(new Error(‘Failed to get access_token’));
}
} else {
callback(error);
}
});
}
// 生成微信JSSDK签名
function generateWechatSignature(req, res) {
const url = req.query.url; // 请求中的url参数
const nonceStr = createNonceStr(16); // 生成随机字符串作为nonceStr
const timestamp = Math.floor(Date.now() / 1000).toString(); // 生成时间戳

getAccessToken((error, accessToken) => {
if (error) {
return res.status(500).json({ error: ‘Failed to get access_token’ });
}

  1. const options = {
  2. url: `https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=${accessToken}`,
  3. method: 'GET',
  4. };
  5. request(options, (error, response, body) => {
  6. if (!error && response.statusCode === 200) {
  7. const ticketResult = JSON.parse(body);
  8. if (ticketResult.errcode === 0) {
  9. const signature = generateSignature(url, timestamp, nonceStr);
  10. const jsapiTicket = ticketResult.ticket;
  11. const data = {
  12. appId: APPID,
  13. nonceStr: nonceStr,
  14. timestamp: timestamp,
  15. signature: signature,
  16. jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage'], // 需要的JS接口列表
  17. };
  18. if (jsapiTicket) {
  19. data.jsApiTicket = jsapiTicket;
  20. }
  21. res.json(data);
  22. } else {
  23. res.status(500).json({ error: `Failed to get ticket: ${ticketResult.errmsg}` });
  24. }