基於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

微信公衆平臺接口調試工具

相關文章
相關標籤/搜索