微信公衆平臺開發教程

使用Bmob雲端代碼開發微信公衆平臺(教程)php

 

1、簡介

這篇微信公衆平臺開發教程將帶領你一步一步領略Bmob後端雲開發的方便性,並讓你輕鬆學會用Bmob進行微信公衆號平臺開發。html

 

使用bmob有什麼好處,下面一一爲你道來:java

  • 不須要購買服務器,不須要懂linux,不須要懂運維知識,零成本地擁有屬於本身的後臺系統。node

  • 不在須要mysql,輕鬆存儲和獲取數據,同時提供了一個方便的數據管理後臺。mysql

  • 提供靈活的「雲端代碼」,其融合了bmob的數據服務和大量的第三方服務,讓你輕鬆應對複雜的業務邏輯。同時雲端代碼能被第三方平臺調用,不再須要phpjava等複雜的web服務。linux

本教程將引導你完成以下任務:web

  • 建立bmob應用算法

  • 使用bmob雲端代碼實現微信公衆平臺的開發sql

2、建立bmob應用

在這節中,將會從基本的建立bmob帳號開始,到建立應用,數據的基本操做,到雲端代碼的運行,使讀者對bmob的功能有初步的瞭解。數據庫

 

在這個教程中,用到了bmob的兩個功能:

  • 數據存儲:把訂閱者發到微信公衆號的信息存儲起來。

  • 雲端代碼:微信後臺回調雲端代碼後,完成公衆號所需的業務邏輯:信息存儲,把信息加工後返回給訂閱者的微信。

1.註冊bmob帳號

在網址欄輸入www.bmob.cn或者在百度輸入Bmob進行搜索,打開Bmob官網後,點擊右上角的「註冊」,在跳轉頁面填入你的姓名、郵箱、設置密碼,以下圖1所示:

1

註冊成功,到註冊所填入的郵箱查看bmob發送的郵件,點擊其中激活連接後,就能使用郵箱和密碼登陸bmob

2. 建立應用

登陸後,點擊「個人控制檯」,進入到了管理後臺,以下圖2所示:

2

bmob中,一個用戶能夠建立多個應用,每一個應用擁有其所屬的專用數據庫,多個應用之間相互獨立。

用戶須要建立一個應用,先點擊管理後臺中的「建立應用」按鈕,以下圖3所示:

3

 

在建立應用的輸入框中輸入app的名稱,點擊「建立應用」,就能成功建立應用,以下圖4所示:

4

3. 數據的基本操做     

建立應用成功後,開發者在管理後臺點擊剛纔建立的應用,進入到應用的後臺界面,其中最經常使用的是「數據瀏覽界面」,在該界面提供了便利的圖形化操做,讓開發者輕鬆地對該應用所屬的數據庫進行表的增刪,數據的增刪改查等操做,以下圖5所示:

5

 

每一個應用的數據庫都有一個默認的表"_User",其提供了一些經常使用的字段來記錄該應用的用戶信息。

開發者須要增長新的表來存儲信息時,點擊「添加表」按鈕,輸入表名,就能建立一張新表,以下圖6所示:

6

 

"添加新的表"界面中,選項「自定義」選項便可建立一張新的普通表,另外兩個選項是較高級的功能,在本教程中暫時不須要用到。

 

在這裏,建立了一張名爲"message"的表,用於存儲訂閱者發送到公衆號後臺的信息。

在表"message"的操做界面中可看到,表"message"4個默認的字段,其中3個最經常使用字段的含義以下:

  • objectId:該行的idobjectId的做用和mysql中的常用的id相似,用於惟一標示一行。

  • createdAt:改行數據的建立時間。

  • updatedAt:改行數據的最後修改時間。

當操做一行數據的時候,以上的3個字段的值由bmob後臺自動管理。另外這些字段的名字是保留的,你不能自行設置它們。

因爲表"message"是須要把訂閱者發到微信公衆號的信息存儲起來,存儲信息的兩個屬性:誰發送這條信息,信息的內容,因此添加下面所需的字段:

userId:訂閱者的idString類型。 content:發送的內容,String

 

經過圖8的「添加一列」功能,依次把userIdcontent這兩個字段添加到表"message"中。

8

注意:在用雲端代碼添加數據時,若是發現其所操做的表和所操做的列不存,bmob後臺會自動建立。這裏爲了演示bmob的數據瀏覽操做,因此才手動建立一次。

 

4. 雲端代碼

閱讀了上面的「數據的基本操做」的內容後,讀者可能有個疑問,怎麼對錶的數據進行增刪改查等操做呢?除了能夠在"數據瀏覽"界面能夠進行操做外,也能夠經過雲端代碼進行數據的增刪改查,開發者也能夠經過雲端代碼完成更加複雜的業務邏輯。

 

4.1雲端代碼的基本知識

對於一些複雜的應用,您可能但願增長一些特有的業務邏輯,並能靈活掌控,Bmob 雲端代碼提供了這種靈活性,可讓您的代碼直接在 Bmob雲上運行, 經過SDKAndroidiOS),restful api或者任何http的方式調用,便可獲取結果數據。

 

雲端代碼的編碼採用nodejs語法,簡單易用。在雲端代碼的編輯器中,系統默認生成了雲端代碼的入口函數function onRequest(request, response, modules),你能夠根據本身的需求實現業務邏輯代碼。

 

在雲端代碼界面,建立一個名爲"helloworld"的雲端代碼,以下圖9所示:

9

 

生成雲端代碼後,可看到雲端代碼生成的入口方法,以下圖10所示:

10

開發者按照雲端代碼的相關語法和提供的模塊編寫雲端代碼,就能實現各類業務邏輯。

 

從雲端代碼的入口方法function onRequest(request, response, modules)可知,雲端代碼包含三個模塊,分別是request模塊、response模塊和modules模塊。

 

4.1.1 request模塊

request模塊用於獲取傳入的參數。因爲如今調用雲端代碼有兩種方式(getpost),因此獲取傳入的參數的方式須要使用不一樣的方法。

 

當用get請求的方式傳入參數,可用以下的方法獲取參數的值:

request.query.name  //獲取傳入參數name的值

 

當用post請求的方式傳入參數,可用以下的方法獲取參數的值:

request.body.name  //獲取傳入參數name的值

 

4.1.2  response模塊

response爲雲端代碼的信息回傳模塊,該模塊包含了一個end方法,實現將雲端的執行結果(如查詢的數據)返回給SDK或者RestApi等調用端:

response.end(string result)

 

4.1.3  modules模塊

modulesBmob雲端代碼提供給你們的各類對象處理的模塊,包括數據庫對象(oData)、文件對象(oFile)、地理位置對象(oLocation)、關聯關係對象(oRelation)、原子操做對象(oAtom)、數據批量操做對象(oBatch)、數組對象(oArray)、消息推送對象(oPush)、雲代碼對象(oFunctions)、郵件發送對象(oMail)、同步對象(oAsync)、HTTP對象(oHttp)、字符編碼轉換對象(oEncodeing)、事件對象(oEvent)、bql對象(oBql)、html元素解析對象(oHtmlparser)、加密對象(oCrypto)。雲端代碼想要調用這些對象時,只須要用以下的方法便可獲取:

//獲取數據庫對象
  var db = modules.oData;
  //下面進行其餘操做

4.2 用雲端代碼實現"helleworld"

下面用雲端代碼輸出一個經典的"helleworld"程序,讓開發者對編寫雲端代碼有個初步的瞭解。

輸出"helleworld"的雲端代碼以下:

function onRequest(request, response, modules) {
    response.end("this is hello world");  //返回字符串"this is hello world"}

"helloworld"的雲端代碼編輯界面上輸入上面的代碼,按下「保存」按鈕就能把編輯完畢的代碼保存在雲端,以下圖11所示:

11

 

怎麼運行上面編輯完畢雲端代碼呢?bmob在每一個雲端代碼的編輯界面下方提供了一個方便的調試工具,以下圖12所示:

這個工具備下面的功能:

 

  • 可選擇以http "post"或者"get"的方法運行雲端代碼。

  • 選擇request的參數和對應值:可添加傳入雲端代碼的request的參數和對應值,參數的數目能夠經過「再添加一個」按鈕調整。

須要運行名稱爲"helloworld"的雲端代碼,在"helloworld"的雲端代碼編輯界面下點擊「發送請求」按鈕,就能在調試工具上看到雲端代碼返回的字符串「this is hello world」,以下圖13所示:

13

 

 

整個雲端代碼的執行流程如圖13.1所示:

13.1

 

4.3 調用雲端代碼的方式

除了使用bmob提供的雲端代碼調式工具外,bmob容許開發者以http的方式直接調用雲端代碼。

 

4.3.1 獲取Secret Key

用戶須要以http的方式運行雲端代碼,須要先肯定應用的Secret Key 調用雲端代碼時,經過Secret Key標識一個應用,獲取Secret Key的路徑: 管理後臺->應用密鑰->Secret Key, 以下圖14所示:

14

注意:請妥善保管Secret Key,避免Secret Key的泄露!!!

 

4.3.2Get的方式調用雲端代碼

下面展現了以Get的方式調用雲端代碼,在瀏覽器中輸入下面的url

http://cloud.bmob.cn/a12af19a1b8bf434/helloworld

其中:

  • a12af19a1b8bf434:應用的Secret Key

  • helloworld:雲端代碼的名稱

看到雲端代碼的返回結果以下圖15所示:

15

4.3.3 Post的方式調用雲端代碼

下面經過curl工具展現了以Post的方式調用雲端代碼:

curl -X POST \
    http://cloud.bmob.cn/a12af19a1b8bf434/helloworld

其中:

 

  • a12af19a1b8bf434:應用的Secret Key

  • helloworld:雲端代碼的名稱

  • 雲端代碼操做數據庫初步入門

bmob提供了數據庫對象(oData)用於操做數據。

 

用雲端代碼往數據表「message」插入一條數據,可用以下的代碼

function onRequest(request, response, modules) {
    //獲取數據庫對象
    var db = modules.oData;
    db.insert({
      "table":"message",             //表名
      "data":{"userId":"dsfd2324","content":"插入的第一條信息"}            //須要插入的數據,格式爲JSON
    },function(err,data){         //回調函數
        response.end("success");  //運行完畢後返回「success」
    });}

點擊保存後在雲端代碼調試區按「發送請求」,返回「success」的值,以下圖16所示:

16

在管理後臺->數據瀏覽->應用表「message」下查看經過雲端代碼新增的數據,以下圖17所示:

17

 

用雲端代碼查詢數據表「message」的數據,可用以下的代碼:

function onRequest(request, response, modules) {
    //獲取數據庫對象
    var db = modules.oData;
    db.find({
      "table":"message"             //表名
    },function(err,data){         //回調函數
        response.end(data);       //data爲返回的數據,格式爲json
    });}

 

點擊保存後在雲端代碼調試區按「發送請求」,返回「success」的值,以下圖18所示:

18

 

須要瞭解更多雲端代碼的操做,可閱讀:

http://docs.bmob.cn/cloudcode/developdoc/index.html?menukey=develop_doc&key=develop_cloudcode

 

在編寫雲端代碼時有個注意事項:雲端代碼是使用異步編程。也就是說,當遇到文件讀寫請求,網絡請求等IO操做時,代碼不等待IO操做返回結果就執行後面的語句,當接收到IO操做的返回結果後才調用回調函數。

當使用phpjava等非異步編程語言時,若是須要插入數據後再查找數據,可用相似下面的代碼:

 db->insert(xxxxx);
    db->find(xxxxx);

在同步型的編程語言中,findinsert都是數據庫的操做,有文件讀寫的IO操做,在db->find執行前,能確保db->insert已經執行完畢了。

 

在異步編程中,用相似下面的代碼才能保證執行完db.insert後才執行:

db.insert({xxx},function(xxx){
        db.find({xxx},function(xxx){xxxx});
    });

只有經過在db.insert的回調函數中執行db.find,才能保證執行db.finddb.insert的數據庫操做已經完成。

 舉個生活中的例子說明異步編程。在飯館裏,服務員接待客人通常是這樣的:

服務員指引客人就座,把菜單遞給客人,在客人瀏覽菜單時服務員在旁邊一直等待,當客戶點菜後,服務員把訂單交給廚房後繼續幹別的事情。」

採用異步模式的服務員能夠這樣接待客人:

「服務員指引客人就座,把菜單遞給客人,在客人瀏覽菜單時服務員就去幹別的事情。當客戶決定點菜後,客人把服務員招來,服務員把客人下的訂單交給廚房後繼續幹別的事情。」

在服務員接待客人的行爲中,經過比較普通的作法和異步的作法,能發現採用異步的方法後服務員的效率大大提升,雲端代碼使用異步也是基於一樣的理由,當雲端代碼在等待IO操做(文件讀寫請求,網絡請求)的結果時是一直空閒,若是不等待IO的結果繼續執行下面的語句,能大大提升系統的效率。

 

在雲端代碼異步編程中「function(xxx){xxxx}」部分稱爲回調函數,雲端代碼會把IO操做的返回結果封裝後傳入到function函數執行裏面的邏輯。

db.insert({xxx},function(xxx){xxxx});

 

3、微信公衆平臺的開發

在本節中,經過bmob雲端代碼開發微信公衆平臺,實現一個反饋意見收集的功能: 1.把訂閱者發送到公衆號後臺的反饋意見存儲在上一節在bmob中建立的表「message」中。 2.訂閱者提交反饋意見後,公衆號自動給訂閱者發送消息,表示消息已收到。

1. 建立雲端代碼

建立一個名爲"feedback"的雲端代碼用於實現上面的功能,代碼以下:

function onRequest(request, response, modules) {
    var token = "weixin";         //這裏的值必須與在微信公衆號後臺填入的token值一致
    var crypto = modules.oCrypto; //使用加解密模塊
    var httptype = modules.oHttptype; //獲取調用雲端代碼的是post或者get方式
    var xml2js = modules.oXml2js; //實現xml和js格式之間的相互轉換
    var db = modules.oData;         //數據庫對象
    if ("get" == httptype) {
         //是get方法,則是微信驗證回調的url是否有效
          var oriStr = [token, request.query.timestamp, request.query.nonce].sort().join('')
          var code = crypto.createHash('sha1').update(oriStr).digest('hex');
          if (code == request.query.signature) { //驗證經過,輸出
              response.end(request.query.echostr);
          } else {
              response.end("Unauthorized");
          }
    } else {
           //是post,接收定閱者發送過來的消息後返回,把反饋意見存儲表「message」中。
            db.insert({
              "table":"message",             //表名
              "data":{"userId":request.body.xml.FromUserName,"content":request.body.xml.Content}           
            },function(err,data){                        
              //構造公衆號後臺所須要的xml格式,並返回給公衆號後臺  
               var result = {
                    xml: {
                      ToUserName: request.body.xml.FromUserName,
                      FromUserName: request.body.xml.ToUserName ,
                      CreateTime: new Date().getTime(),
                      MsgType: 'text',
                      Content: '你好,你發送的反饋內容「' + request.body.xml.Content + '」已收到。'
                    }
                }
                var builder = new xml2js.Builder();
                var xml = builder.buildObject(result); //利用模塊xml2js,把json對象轉換爲一個xml文本
                response.set('Content-Type', 'text/xml'); //設置返回的http header
                response.end(xml);
            });



    }}

這個雲代碼的內容暫時看不懂不要緊,下面會逐漸解釋其中的含義。

 

2. 啓用微信公衆號的開發模式

只有啓用微信公衆號的開發模式後,才能把訂閱者發送到微信公衆號後臺的消息發送到bmob雲端代碼中進行處理。

 

微信公衆平臺地址:https://mp.weixin.qq.com

 

登陸微信公衆平臺後臺,在左側列表中最下方,找到「開發者中心」,點擊進入,如圖19所示:

19

進入服務器配置填寫框,如圖20所示:

 

20

 

 

點擊「修改配置」按鈕,如圖21所示:

21

此處的URLhttp://cloud.bmob.cn/a12af19a1b8bf434/feedback)爲上節中生成的雲端代碼「feedback」的調用,按照雲端代碼的調用規格,a12af19a1b8bf434爲該應用的Secret Key,標明調用的是哪一個應用,feedback爲雲端代碼的名稱。Token定義爲weixinEncodingAESKey則不用填,點擊「隨機生成」讓自動生成一個,消息加解密方式選擇「明文模式」,而後點擊「提交」按鈕,如圖22所示:

22

 

點擊「啓用」,如圖23所示:

23

 

在彈出框中點擊肯定,如圖24所示:

24

成功啓用後如圖25所示:

25

 

恭喜,你成功啓用開發模式。

 

用戶往該公衆號發送消息後,用戶收到的反饋內容如圖27所示:

27

 

查看應用的後臺,可看到接收的消息已存儲在表message中,如圖28所示:

28

 

3. 數據收發原理及消息數據格式

雲端代碼開發微信公衆號有兩個重要原理必定要弄明白:

 

  • 變爲開發模式時,微信公衆號後臺往配置的url發送校驗請求,這個過程雲端代碼校驗信息的原理。

  • 雲端代碼收發微信公衆號後臺傳遞過來的消息的原理。

3.1變爲開發模式時的消息校驗原理

在開發者首次提交驗證申請時,微信公衆號後臺將發送GET請求到填寫的URL上,而且帶上四個參數(signaturetimestampnonceechostr),開發者經過對簽名(signature)的效驗來判斷此條消息的真實性。

 

4個參數的含義以下:

 

  • signature:微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。

  • timestamp:時間戳。

  • nonce:隨機數

  • echostr:隨機字符串

此後,每次開發者接收用戶消息的時候,微信公衆號後臺也都會帶上前面三個參數(signaturetimestampnonce)訪問開發者設置的URL,開發者依然經過對簽名的效驗判斷此條消息的真實性。效驗方式與首次提交驗證申請一致。

開發者經過檢驗signature對請求進行校驗(下面有校驗方式)。若確認這次GET請求來自微信公衆號後臺,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,不然接入失敗。

消息校驗流程以下:

a.tokentimestampnonce三個參數進行字典序排序。

b.將三個參數字符串拼接成一個字符串進行sha1加密。

c.開發者得到加密後的字符串可與signature對比,標識該請求來源於微信。

 

整個流程如圖29所示:

29

 

使用的雲端代碼以下:

//是get方法,則是微信驗證回調的url是否有效
          var oriStr = [token, request.query.timestamp, request.query.nonce].sort().join('')
          var code = crypto.createHash('sha1').update(oriStr).digest('hex');
          if (code == request.query.signature) { //驗證經過,輸出
              response.end(request.query.echostr);
          } else {
              response.end("Unauthorized");
          }

其中token的值是在微信公衆號後臺填入的token值:「weixin」。

 

在這個校驗流程的雲端代碼中,使用oCrypto這個雲端代碼的加密對象模塊,提供md5sha1兩種加密算法。經過這個模塊,按照微信校驗的流程完成校驗。oCrypto更多的功能詳細參考:https://www.npmjs.org/package/crypto

 

另外,雲端代碼使用了oHttptype模塊獲取當前的http調用方式。由於微信公衆平臺調用雲端代碼有兩種方式:

  • get方式,用於檢驗。

  • post方式,用於轉發訂閱者往公衆平臺發送的消息。

經過oHttptype模塊得知是用採用get方式調用雲端代碼,運行校驗的代碼並返回echostr參數。

3.2雲端代碼收發微信公衆號後臺傳遞過來的消息的原理

在上一節的演示中,訂閱者往該公衆號發送消息後,返回已收到反饋內容的消息。

 

這一原理的消息流程如圖30所示:

30

 

 

雲端代碼內部經過下面的代碼處理用戶發送的消息:

 //是post,接收定閱者發送過來的消息後返回,把反饋意見存儲表「message」中。
            db.insert({
              "table":"message",             //表名
              "data":{"userId":request.body.xml.FromUserName,"content":request.body.xml.Content}           
            },function(err,data){         
              //構造公衆號後臺所須要的xml格式,並返回給公衆號後臺  
               var result = {
                    xml: {
                      ToUserName: request.body.xml.FromUserName,
                      FromUserName: request.body.xml.ToUserName ,
                      CreateTime: new Date().getTime(),
                      MsgType: 'text',
                      Content: '你好,你發送的反饋內容「' + request.body.xml.Content + '」已收到。'
                    }
                }
                var builder = new xml2js.Builder();
                var xml = builder.buildObject(result); //利用模塊xml2js,把json對象轉換爲一個xml文本
                response.set('Content-Type', 'text/xml'); //設置返回的http header
                response.end(xml);
            });

從上圖能夠看出,用戶在發送一個文本後,微信公衆號後臺將組裝一個xml消息發送給雲端代碼服務器。當雲端代碼接收到http頭部Content-Typetext/xml的請求後,雲端代碼自動把xml消息轉換爲一個對象放在request.body.xml中,經過獲取request.body.xml對應的屬性就能獲取xml節點的值。

 

雲端代碼解析xml對象,根據節點信息,把發送者(request.body.xml.FromUserName)和消息內容(request.body.xml.Content)存儲在表「message」後,而後經過必定的規則組裝成一個xml文本回復給微信公衆號後臺,微信公衆號後臺再回復給用戶。在這個收發過程當中,發送方和接收方進行了調換(ToUserNameFromUserName值互換),收發都是以xml格式在後臺進行傳輸的。因此掌握各類消息類型的接收回復是進行微信公衆平臺開發的基礎!

 

最多見的消息類型爲文本的xml格式以下:

<xml>
<ToUserName><![CDATA[gh_b36303ca8941]]></ToUserName><FromUserName>
<![CDATA[oqwUds6-SG7L8t6ZBDexZvaRWnXM]]></FromUserName>
<CreateTime>1444464955</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[這個公衆號不錯]]></Content>
<MsgId>6203929742163889773</MsgId>
</xml>

 

 

XML格式講解:

 

  • ToUserName 消息接收方微信號,通常爲公衆平臺帳號微信號

  • FromUserName 消息發送方微信號

  • CreateTime 消息建立時間

  • MsgType 消息類型;文本消息爲text

  • Content 消息內容

  • MsgId 消息ID

各類類型的消息詳解,請查看微信開發文檔:

http://mp.weixin.qq.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html

 

4、總結

經過本教程,你獲得瞭如下收穫:

 

瞭解bmob應用和雲端代碼的功能。

在不須要搭建服務器,不須要懂得基本的運維知識下,使用bmob雲端代碼在30分鐘內實現微信公衆平臺的開發,完了消息存儲和消息自動回覆這兩個功能。

閱讀本教程後,想了解雲後端服務bmob能夠實現哪些更酷的功能嗎?點擊http://www.bmob.cn,馬上進入bmob瞭解更多。

 

 

詳盡教程地址:http://docs.bmob.cn/cloudcodeweixin/index.html

有任何疑問,能夠加羣:483253876

相關文章
相關標籤/搜索