阿里雲應用第四彈~依託阿里雲平臺使用Node+express實現微信公衆號開發

截止目前,阿里雲服務器已經搭建差很少了,你能夠將本身編寫的網站部署到阿里雲上,將IP地址告訴的小夥伴們,你們就能夠看到你的做品了,如今企業愈來愈重視學生的動手能力,若是你能自主搭建一個我的網站,那仍是很受企業歡迎的。2018新年到來時,微信又狠狠的將小程序往前推了一把。跳一跳遊戲相信你們都玩了吧。相信小程序將會被愈來愈多人使用。在這一章中,咱們不講解小程序,而是講解微信公衆號的開發。都是微信的產品,觸類旁通。小程序應該也不會很難的。

1. 公衆號的申請

要想進行公衆號開發,必須進行公衆號的申請。地址爲:https://mp.weixin.qq.com/
申請成功後進行登陸。經過查看介紹後,咱們註冊訂閱號!服務號不容許我的註冊,圖文不符,請注意。node

clipboard.png
選定類型後,按照要求完成信息登記與公衆號信息登記。程序員

clipboard.png

2. 申請成爲開發者

微信只對企業開放高級接口,可是若是咱們想學習開發又不能註冊企業號該怎麼辦呢?微信取了一個折中的辦法,容許程序員申請測試號,熟悉微信公衆號開發。
clipboard.png算法

clipboard.png

  • 配置服務器
    咱們須要有一個服務器來部署程序。當用戶在操做公衆號的時候會將信息發送到咱們指定的服務器程序中。

clipboard.png

clipboard.png
固然,若是你只是這麼簡單的配置上,那必然會報錯。提示咱們token驗證失敗。express

clipboard.png
查看微信開發文檔發現npm

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

也就是說在上面咱們設置的URL其實是校驗程序地址,該程序須要完成的事情是接受指定參數後進行排序,排序後加密,若是加密值爲signature。返回該值。直接上代碼吧。這裏代碼我使用依賴Node的Express框架。小程序

#安裝express腳手架
# npm install -g express-generator@4

#建立express項目app,而後安裝依賴
# express app
# cd app
# npm install

接下來進行token驗證程序的開發(這裏我只是貼出了部分核心代碼)服務器

var sha1 = require('node-sha1');

//驗證
router.get('/', function(req, res, next) {
  //與服務器設置的時候設置的Token保持一致
  var token = 'helloweixin';
  //獲取客戶端發來的三個參數
  var signature = req.query.signature;

  var nonce = req.query.nonce;
  var timestamp = req.query.timestamp;
  var echostr = req.query.echostr;
  //排序後拼接爲字符串
  var str = [token,timestamp,nonce].sort().join(''); 
  //使用SHA1算法進行加密
  var sha = sha1(str); 
  //判斷加密後的值
  var result = (sha === signature)? echostr + '' : 'failed'; 
  res.send(result);
});

3. 回覆信息

驗證成功後就能夠正式進行微信公衆號的開發了!這裏介紹消息回覆程序的實現。微信

若是用戶給公衆號發送一個消息,咱們如何接收到用戶請求信息而且給出迴應。是這樣,當用戶發送消息的時候,微信會將用戶的消息封裝成一個XML發送給後臺程序,那是哪一個後臺程序呢?就是你剛剛設置的url,只不過此次是以POST方式提交的。服務器接收到請求後該如何迴應呢。公衆號開發者文檔中給給出了說明,須要後臺程序也返回已給xml,與請求的XML格式相同。微信開發

<?xml version="1.0" encoding="utf-8"?>

<xml> 
  <ToUserName>接受者</ToUserName>  
  <FromUserName>發送者</FromUserName>  
  <CreateTime>建立時間</CreateTime>  
  <MsgType>信息類型</MsgType>  
  <Content>內容</Content> 
</xml>

那麼在express中如何接受xml類型的數據呢?body-parser?只能接受form類型或者JSON類型,body-parser-xml中間件是能夠預處理xml格式的數據。app

# npm install body-parser-xml --save

var bodyParser = require('body-parser');
require('body-parser-xml')(bodyParser);

app.use(bodyParser.xml({
  limit: '1MB',   // Reject payload bigger than 1 MB 
  xmlParseOptions: {
    normalize: true,     // Trim whitespace inside text nodes 
    normalizeTags: true, // Transform tags to lowercase 
    explicitArray: false // Only put nodes in array if >1 
  }
}));

以後使用req.body.xml來獲取接收到的xml數據。那麼接收到數據以後又如何返回xml數據呢?可使用object-to-xml模塊。

var o2x = require('object-to-xml');
//  回覆消息
router.post('/', function(req, res, next) {
  //設置返回對象
  var obj = { 
    '?xml version=\"1.0\" encoding=\"utf-8\"?' : null,
    xml : {
      '#' : {
        ToUserName : req.body.xml.fromusername,
        FromUserName:req.body.xml.tousername,
        CreateTime:req.body.xml.createtime,
        MsgType:req.body.xml.msgtype,
        Content:'你好...,我是微信服務端程序'
      }
    }
  };
  res.header("Content-Type", "text/xml")
  //將返回對象轉換爲xml返回
  res.send(o2x(obj));
});

clipboard.png

若是是Java開發者能夠查看博客 http://blog.csdn.net/z6918378...

相關文章
相關標籤/搜索