nodejs微信開發---接入指南

首先github地址奉上:https://github.com/xiadd/shorthand 歡迎star?
最近又拾起了微信開發,以前的公衆號是用的flask進行開發的,因此最近想要用nodejs改寫一下,這些算是記錄吧,邊寫代碼邊寫下這篇文章。
由於我對nodejs也並非那麼的熟悉,僅僅是新手的狀態,若是有錯誤的地方請指出。
文章最後會放出源碼。公衆號部署在leancloud,這裏也會稍微介紹一下leancloud的雲引擎,方便部署。
這部分文章涉及的代碼很少,可能是工具的介紹以及一個接入指南。html

內網穿透

因爲微信開發的端口必須是80(最近貌似增長了443),因此一個內網穿透工具仍是頗有必要的。我我的使用的是qq瀏覽器微信調試工具。node

微信調試
我也推薦這個,畢竟一家的。
可是也有其餘的選擇:python

  1. 花生殼
    這個速度還能夠,可是隻有window客戶端的,貌似還能夠折騰路由器那邊的東西,我也沒深刻折騰。git

  2. nat123
    與花生殼相似,可是速度着實不太給力。常常配置錯誤。說是免費可是須要預充幾塊錢進去,不是很推薦。github

  3. ngrok
    一個開源軟件,能夠本身在服務器上部署也可使用現成的,其實qq瀏覽器的微信調試就是基於這個搭建的。算是比較好用的。web

leancloud

爲何使用leancloud,實際上是我沒太接觸其餘的雲服務,也無從比較,另一個就是heroku,可是國內的訪問速度感人。
leancloud應該是一個相似parse(其實parse我也不是很瞭解hhhh)的服務,但還提供了託管web的雲引擎。包括python和nodejs兩種,這裏介紹nodejs的引擎。雲引擎入門的話請看leancloud雲引擎入門,畢竟比我講的強多了。
對於我的開發者,leancloud算是免費的,限制不是很大,可是貌似最近出了個實名認證,可是沒認證好像也沒啥問題。可是對於面試用戶,若是應用沒有請求,就是睡眠,因此若是應用打不開多試兩次就好了,極有多是睡眠了。面試

經常使用命令

lean new新建項目
lean app add [appname] [appid] 關聯項目到leancloud 雲引擎
lean up 啓動服務
lean deploy部署應用(貌似收費用戶是部署到測試環境)
lean publish部署到開發環境(免費用戶用不着)數據庫

雲引擎簡介

進入控制檯後如圖所示:
雲引擎
存儲是數據庫,各個功能如名字所說。一些暫時用不着的功能就不提了。
主要是雲引擎這個選項,須要進入設置中配置好域名。
clipboard.pngflask

數據庫

leancloud的數據庫是一個半殘的mongo,基本是夠用的。文檔在這js數據開發數組

公衆號的接入

我這邊使用的是公衆號測試號,由於我的申請到的訂閱號的功能嚴重缺失。
首先看微信文檔
clipboard.png

填寫服務器配置

clipboard.png
也就上圖的接口配置信息,url是你服務部署的地方,圖中的url是微信調試工具生成的,因此有些亂,token是隨意填寫的,注意下面仍是要用到的,注意保存好。

驗證服務器地址的有效性

這裏就是代碼部分了。先上目錄結構:

clipboard.png
app目錄放業務邏輯代碼。
config.js存放相關配置,包括微信公衆號的appId ,Token等

module.exports = {
  'token': 'yourtoken',//配置中的token
  'appId': 'your appid',//配置裏的appid
  'appSecret': 'your appsecret'//配置中的appsecret
};

注:這部分引自微信公衆平臺文檔
開發者提交信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶參數以下表所示:

clipboard.png
者經過檢驗signature對請求進行校驗(下面有校驗方式)。若確認這次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,不然接入失敗。加密/校驗流程以下:
1)將token、timestamp、nonce三個參數進行字典序排序
2)將三個參數字符串拼接成一個字符串進行sha1加密
3)開發者得到加密後的字符串可與signature對比,標識該請求來源於微信
這部分的代碼以下:

const crypto = require('crypto');
const path = require('path');
const url = require('url');

//import config
const config = require('../../config');

//進行sha1加密
function sha1(str) {
  var shasum = crypto.createHash("sha1");
  shasum.update(str);
  str = shasum.digest("hex");
  return str;
}

function wechatAuth(req, res) {
  var query = url.parse(req.url, true).query;
  var signature = query.signature;
  var echostr = query.echostr;
  var timestamp = query['timestamp'];
  var nonce = query.nonce;

  var reqArray = [nonce, timestamp, config.token];

  //對數組進行字典排序
  reqArray.sort();
  var sortStr = reqArray.join('');//鏈接數組
  var sha1Str = sha1(sortStr);

  if (signature === sha1Str) {
    res.end(echostr);
  } else {
    res.end("false");
    console.log("受權失敗!");
  }
}

module.exports = wechatAuth;

相信代碼說的老是比我清楚,首先獲取請求url中的四個參數,對nonce,timestamp, 和token進行字典排序也就是Array.sort(),而後進行字符串拼接,進行sha1加密,若是結果和signature相等則成功,(順便說一句,其實直接返回echostr也是能夠成功的,不事後面的請求就不太好辦了?)。這樣來講接入應該就算是成功了。

相關文章
相關標籤/搜索