基于Koa.js的微信工具类小记

关于微信公众号开发和小程序开发的教程其实网上已经有不少了,可是基于koa.js 开发的教程其实很少,因而接下来对踩坑的经历作一些小结;javascript

本身也写了一个微信工具类,项目地址是微信工具类java


目录结构git


微信网页受权

1. 获取Access_token

access_token是公众号的全局惟一接口调用凭据,公众号调用各接口时都需使用access_token。开发者须要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将致使上次获取的access_token失效。

接口调用请求说明小程序

`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${appsecret}`
复制代码
参数 必须 说明
grant_type 受权类型,获取access_token填写client_credential
appid 用户惟一凭证
appsecret 用户惟一凭证密钥

2. 获取api_ticket

生成签名以前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常状况下,jsapi_ticket的有效期为7200秒,经过access_token来获取。因为获取jsapi_ticket的api调用次数很是有限,频繁刷新jsapi_ticket会致使api调用受限,影响自身业务,开发者必须在本身的服务全局缓存jsapi_ticket 。

接口调用请求说明api

`https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=${accessToken}&type=jsapi`
复制代码
参数 必须 说明
access_token 从上一步中获取或者缓存中未过时的access_token
type 填写为jsapi

3. 获取signature

签名生成规则以下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对全部待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里须要注意的是全部参数名均为小写字符。对string1做sha1加密,字段名和字段值都采用原始值,不进行URL 转义。
  1. noncestr 实现方式
getNonceStr() {
  let text = '';
  const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  for (let i = 0; i < 16; i += 1) {
    text += possible.charAt(Math.floor(Math.random() * possible.length));
  }
  return text;
}
复制代码
  1. timestamp 实现方式
getTimestamp() {
  return (`${new Date().valueOf()}`).slice(0, -3);
}
复制代码
  1. 加密方式
const crypto = require('crypto');
// ...
getSign(apiTicket, noncestr, timestamp, url) {
  const sortData = `jsapi_ticket=${apiTicket}&noncestr=${noncestr}&timestamp=${timestamp}&url=${url}`;
  return crypto.createHash('sha1').update(sortData).digest('hex');
}
复制代码

4. 注入权限验证配置

1、 在须要调用JS接口的页面引入以下JS文件,(支持https): res.wx.qq.com/open/js/jwe…缓存

2、全部须要使用JS-SDK的页面必须先注入配置信息,不然将没法调用微信

wx.config({
  debug: true, // 开启调试模式,调用的全部api的返回值会在客户端alert出来,若要查看传入的参数,能够在pc端打开,参数信息会经过log打出,仅在pc端时才会打印。
  appId: '', // 必填,公众号的惟一标识
  timestamp: , // 必填,生成签名的时间戳
  nonceStr: '', // 必填,生成签名的随机串
  signature: '',// 必填,签名
  jsApiList: [] // 必填,须要使用的JS接口列表
});
复制代码

小程序受权

// 一个存放小程序对应的appid 和secret的对象,这里能够实现为存放在数据,演示说明则简略
const miniGameMap = {
  app: {
    appid: '...',
    appsecret: '...',
  }
}
getMiniLoginData(code, appName) {
    const appInfo = miniGameMap[appName];
    let result = {
      errcode: 40029,
      errMsg: '无效的小程序信息',
    };

    if (appInfo) {
      const miniappid = appInfo.appid;
      const miniappsecret = appInfo.appsecret;
      const reqUrl = `https://api.weixin.qq.com/sns/jscode2session?appid=${miniappid}&secret=${miniappsecret}&js_code=${code}&grant_type=authorization_code`;
      // HttpClient 能够替换为自定义的请求库,不作限制
      result = HttpClient.request(reqUrl).then(HttpClient.responseAdapter);
    }

    return result;
  }
复制代码

参考网址

微信JS-SDK说明文档session

微信公众平台接口调试工具

相关文章
相关标签/搜索