node.js微信小程式配置訊息推送
在開發微信小程式時,有一個訊息推送,它的解釋是這樣的。
訊息推送具體的內容是下面的這個網址 https://developers.weixin.qq.com/miniprogram/dev/framework/server-ability/message-push.html,他介紹的也還可以,就是我這裡換成了node程式碼。
訊息推送
啟用並設定訊息推送配置後,使用者發給小程式的訊息以及開發者需要的事件推送,都將被微信轉發至該伺服器地址中。
在微信小程式的首頁開發裡面,開發設定中,微信的官網中,介紹的也還可以,php程式碼寫的差不多也能瞭解什麼意思,但是其中沒有告訴我們要把echostr這個引數在介面中返回出來,所以導致我測試了半天都是那個Token驗證失敗。
寫一下學習記錄吧,方便後來的人遇到同樣的問題,也方便自己以後查閱。

這個裡面的url伺服器地址就是自己的地址(上面那個是我隨便寫的),後面接上自己的介面,比如我的就是 /token,當你點選提交的時候,會發現在伺服器中會有如下的get請求
避免有些人看不清楚上面的我在這裡再用程式碼重新寫一下上面的東西。
GET /checkPushMsg?signature=db6e0c25b7743d8dd7ebfda1db6c742a762a2f37&echostr=1712804002525306855×tamp=1549949926&nonce=982754662 200 1.321 ms - 46
其中的各個引數微信官網中介紹的也非常的詳細。
開發者通過檢驗 signature 對請求進行校驗(下面有校驗方式)。若確認此次 GET 請求來自微信伺服器,請原樣返回 echostr 引數內容,則接入生效,成為開發者成功,否則接入失敗。加密/校驗流程如下:
- 將token、timestamp、nonce三個引數進行字典序排序
- 將三個引數字串拼接成一個字串進行sha1加密
- 開發者獲得加密後的字串可與signature對比,標識該請求來源於微信
驗證URL有效性成功後即接入生效,成為開發者。
檢驗signature的node.js示例程式碼:
1 /* 2驗證伺服器推送url地址 3開發者提交資訊後,微信伺服器將傳送GET請求到填寫的伺服器URL上,GET請求攜帶引數如下 4@params signature 微信加密簽名,signature結合了開發者填寫的token引數和請求中的timestamp引數,nonce引數 5@params timestamp時間戳 6@params nonce隨機數 7@params echostr隨機字串 8 */ 9 exports.check_push = (req, res) => { 10console.log(req.query); 11let signature = req.query.signature, 12timestamp = req.query.timestamp, 13nonce = req.query.nonce, 14echostr = req.query.echostr; 15let a = crypto.createHash('sha1').update([pushToken, timestamp, nonce].sort().join('')).digest('hex');// 這裡的pushToken就是在上面的那裡配置的Token 16 17if(a == signature){ 18// 如果驗證成功則原封不動的返回 19res.send(echostr); 20}else{ 21res.send({ 22status: 400, 23data: "check msg error" 24}) 25} 26 };
其中遇到的兩個問題,上面已經說了,這裡再說一下這兩個問題。
其中一個是把 token、timestamp、nonce三個引數進行字典序排序,當時想自己寫一個方法,寫了好久發現有點難受,所以在網上找了一些東西,發現那個 陣列的sort方法不傳遞引數就是那個 預設字元編碼排序,所以就非常簡單了,加密直接用到crypto模組
另外一個就是微信都沒有告訴我們要把那個echostr返回出去,雖然他的意思就是那個意思。。 這樣就可以配置成功了。
如果你同樣遇到了這個問題,看了我的文章解決了,我會非常高興。