欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

nodeJS微信JSDK 配置

程序员文章站 2022-03-12 08:09:01
nodeJS微信JSDK 配置 一、微信公众平台申请一个测试公众号 二、配置nodeJS 使用express框架搭建服务器 微信生成签名步骤: 1.获取token 2.通过token,获取jsapi_ticket 3.生成随机字符串,获取当前时间戳 4.排序拼接生成签名 + 在routes inde ......

nodejs微信jsdk 配置

一、微信公众平台申请一个测试公众号

二、配置nodejs 使用express框架搭建服务器

微信生成签名步骤:

1.获取token

2.通过token,获取jsapi_ticket

3.生成随机字符串,获取当前时间戳

4.排序拼接生成签名

  • 在routes---->index.js
var express = require('express');
var router = express.router();
var axios = require('axios');
var sha1 = require('sha1');
var fs = require('fs');

let accesstokenjson = require('../user_token');

const app_id = 'wx47159511d53720fb'
const app_secret = 'e8be2675730af8b743769e34fc8a7267'
let config_noncestr = '' //随机字符串
let config_timestamp = '' //时间戳

/* get home page. */
router.get('/', function(req, res, next) {
    res.send('这是首页')
});

router.get('/getwxconfig', function (req, res, next) {
  let url = req.query.url;  // 获取url
  gettoken().then(getticket).then(ret=>{
    res.json({ // 返回前端需要的配置config
      success:true,
      code:200,
      config_appid: app_id,
      config_sign: signature(ret, url),
      config_timestamp,
      config_noncestr
    })
  })
});

/*获取token*/
function gettoken(){
  return new promise((resolve,reject)=>{
    //获取当前时间 
    var currenttime = new date().gettime();
    if (accesstokenjson.access_token === '' || accesstokenjson.expires_time < currenttime){
      axios.get('https://api.weixin.qq.com/cgi-bin/token',{
        params:{
          appid: app_id,
          secret: app_secret,
          grant_type: 'client_credential'
        }
      }).then(res=>{
        accesstokenjson.access_token = res.data.access_token;
        accesstokenjson.expires_time = new date().gettime() + (parseint(res.data.expires_in) - 200) * 1000;
        //更新本地存储
        fs.writefile('../user_token.json', json.stringify(accesstokenjson));
        resolve(accesstokenjson.access_token)
      }).catch(err => {
        return promise.reject(err);
      })
    }else{
      resolve(accesstokenjson.access_token)
    }
  })
}

/* 通过token,获取jsapi_ticket */
function getticket(accesstoken){
  return new promise((resolve,reject)=>{
    axios.get('https://api.weixin.qq.com/cgi-bin/ticket/getticket', {
      params: {
        type: 'jsapi',
        access_token: accesstoken
      }
    }).then(res => {
      resolve(res.data.ticket);
    }).catch(err=>{
      return promise.reject(err);
    })
  })
}

/**
 * 签名算法
 * @param ticket 用于签名的 jsapi_ticket
 * @param url 用于签名的 url ,注意必须动态获取
 * @return sha1算法加密的字符串
 */
function signature(ticket, url){
  config_noncestr = createnoncestr() // 生成随机字符串
  config_timestamp = createtimestamp() // 获取当前时间戳
  let ret ={
    jsapi_ticket: ticket,
    noncestr:config_noncestr,
    timestamp:config_timestamp,
    url: url,
  }
  var string = raw(ret) // 排序拼接为字符串
  console.log(string)
  return sha1(string) // 返回sha1加密的字符串
}

/* 生成随机字符串 */
function createnoncestr(){
  return math.random().tostring(36).substr(2,15);
}

/* 获取当前时间戳 */
function createtimestamp() {
  return parseint(new date().gettime() / 1000) + '';
}

/* 排序拼接 */
function raw(args){
  let keys = object.keys(args).sort(); //获取args对象的键值数组,并对所有待签名参数按照字段名的ascii 码从小到大排序(字典序)
  let newargs ={}
  keys.foreach(key=>{
    newargs[key.tolowercase()] = args[key];
  })
  let string = '';
  for (let k in newargs) {// 循环新对象,拼接为字符串
    string +=`&${k}=${newargs[k]}`
  }
  string = string.substr(1)// 截取第一个字符以后的字符串(去掉第一个'&')
  return string;
}

module.exports = router;

三、使用内网穿透工具(例如:natapp)把本地服务器映射到公网上去

如果有服务器的可以跳过这一步

四、前端使用微信jsdk

使用步骤:

1、绑定域名

2、引入js文件 http://res2.wx.qq.com/open/js/jweixin-1.4.0.js

vue 项目可以下载模块 npm i weixin-js-sdk -s

3、配置config

wx.config({
  debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  appid: '', // 必填,公众号的唯一标识
  timestamp: , // 必填,生成签名的时间戳
  noncestr: '', // 必填,生成签名的随机串
  signature: '',// 必填,签名
  jsapilist: [] // 必填,需要使用的js接口列表
});

4、通过ready接口处理成功验证,通过error接口处理失败验证

5、调用微信接口api

详情见开发文档地址:https://developers.weixin.qq.com/doc/offiaccount/oa_web_apps/js-sdk.html