使用Bmob雲端代碼開發微信公衆平臺(教程)php
這篇微信公衆平臺開發教程將帶領你一步一步領略Bmob後端雲開發的方便性,並讓你輕鬆學會用Bmob進行微信公衆號平臺開發。html
使用bmob有什麼好處,下面一一爲你道來:java
不須要購買服務器,不須要懂linux,不須要懂運維知識,零成本地擁有屬於本身的後臺系統。node
不在須要mysql,輕鬆存儲和獲取數據,同時提供了一個方便的數據管理後臺。mysql
提供靈活的「雲端代碼」,其融合了bmob的數據服務和大量的第三方服務,讓你輕鬆應對複雜的業務邏輯。同時雲端代碼能被第三方平臺調用,不再須要php,java等複雜的web服務。linux
本教程將引導你完成以下任務:web
建立bmob應用算法
使用bmob雲端代碼實現微信公衆平臺的開發sql
在這節中,將會從基本的建立bmob帳號開始,到建立應用,數據的基本操做,到雲端代碼的運行,使讀者對bmob的功能有初步的瞭解。數據庫
在這個教程中,用到了bmob的兩個功能:
數據存儲:把訂閱者發到微信公衆號的信息存儲起來。
雲端代碼:微信後臺回調雲端代碼後,完成公衆號所需的業務邏輯:信息存儲,把信息加工後返回給訂閱者的微信。
在網址欄輸入www.bmob.cn或者在百度輸入Bmob進行搜索,打開Bmob官網後,點擊右上角的「註冊」,在跳轉頁面填入你的姓名、郵箱、設置密碼,以下圖1所示:
圖1
註冊成功,到註冊所填入的郵箱查看bmob發送的郵件,點擊其中激活連接後,就能使用郵箱和密碼登陸bmob。
登陸後,點擊「個人控制檯」,進入到了管理後臺,以下圖2所示:
圖2
在bmob中,一個用戶能夠建立多個應用,每一個應用擁有其所屬的專用數據庫,多個應用之間相互獨立。
用戶須要建立一個應用,先點擊管理後臺中的「建立應用」按鈕,以下圖3所示:
圖3
在建立應用的輸入框中輸入app的名稱,點擊「建立應用」,就能成功建立應用,以下圖4所示:
圖4
建立應用成功後,開發者在管理後臺點擊剛纔建立的應用,進入到應用的後臺界面,其中最經常使用的是「數據瀏覽界面」,在該界面提供了便利的圖形化操做,讓開發者輕鬆地對該應用所屬的數據庫進行表的增刪,數據的增刪改查等操做,以下圖5所示:
圖5
每一個應用的數據庫都有一個默認的表"_User",其提供了一些經常使用的字段來記錄該應用的用戶信息。
開發者須要增長新的表來存儲信息時,點擊「添加表」按鈕,輸入表名,就能建立一張新表,以下圖6所示:
圖6
在"添加新的表"界面中,選項「自定義」選項便可建立一張新的普通表,另外兩個選項是較高級的功能,在本教程中暫時不須要用到。
在這裏,建立了一張名爲"message"的表,用於存儲訂閱者發送到公衆號後臺的信息。
在表"message"的操做界面中可看到,表"message"有4個默認的字段,其中3個最經常使用字段的含義以下:
objectId:該行的id,objectId的做用和mysql中的常用的id相似,用於惟一標示一行。
createdAt:改行數據的建立時間。
updatedAt:改行數據的最後修改時間。
當操做一行數據的時候,以上的3個字段的值由bmob後臺自動管理。另外這些字段的名字是保留的,你不能自行設置它們。
因爲表"message"是須要把訂閱者發到微信公衆號的信息存儲起來,存儲信息的兩個屬性:誰發送這條信息,信息的內容,因此添加下面所需的字段:
userId:訂閱者的id,String類型。 content:發送的內容,String。
經過圖8的「添加一列」功能,依次把userId和content這兩個字段添加到表"message"中。
圖8
注意:在用雲端代碼添加數據時,若是發現其所操做的表和所操做的列不存,bmob後臺會自動建立。這裏爲了演示bmob的數據瀏覽操做,因此才手動建立一次。
閱讀了上面的「數據的基本操做」的內容後,讀者可能有個疑問,怎麼對錶的數據進行增刪改查等操做呢?除了能夠在"數據瀏覽"界面能夠進行操做外,也能夠經過雲端代碼進行數據的增刪改查,開發者也能夠經過雲端代碼完成更加複雜的業務邏輯。
對於一些複雜的應用,您可能但願增長一些特有的業務邏輯,並能靈活掌控,Bmob 雲端代碼提供了這種靈活性,可讓您的代碼直接在 Bmob雲上運行, 經過SDK(Android,iOS),restful api或者任何http的方式調用,便可獲取結果數據。
雲端代碼的編碼採用nodejs語法,簡單易用。在雲端代碼的編輯器中,系統默認生成了雲端代碼的入口函數function onRequest(request, response, modules),你能夠根據本身的需求實現業務邏輯代碼。
在雲端代碼界面,建立一個名爲"helloworld"的雲端代碼,以下圖9所示:
圖9
生成雲端代碼後,可看到雲端代碼生成的入口方法,以下圖10所示:
圖10
開發者按照雲端代碼的相關語法和提供的模塊編寫雲端代碼,就能實現各類業務邏輯。
從雲端代碼的入口方法function onRequest(request, response, modules)可知,雲端代碼包含三個模塊,分別是request模塊、response模塊和modules模塊。
request模塊用於獲取傳入的參數。因爲如今調用雲端代碼有兩種方式(get和post),因此獲取傳入的參數的方式須要使用不一樣的方法。
當用get請求的方式傳入參數,可用以下的方法獲取參數的值:
request.query.name //獲取傳入參數name的值
當用post請求的方式傳入參數,可用以下的方法獲取參數的值:
request.body.name //獲取傳入參數name的值
response爲雲端代碼的信息回傳模塊,該模塊包含了一個end方法,實現將雲端的執行結果(如查詢的數據)返回給SDK或者RestApi等調用端:
response.end(string result)
modules是Bmob雲端代碼提供給你們的各類對象處理的模塊,包括數據庫對象(oData)、文件對象(oFile)、地理位置對象(oLocation)、關聯關係對象(oRelation)、原子操做對象(oAtom)、數據批量操做對象(oBatch)、數組對象(oArray)、消息推送對象(oPush)、雲代碼對象(oFunctions)、郵件發送對象(oMail)、同步對象(oAsync)、HTTP對象(oHttp)、字符編碼轉換對象(oEncodeing)、事件對象(oEvent)、bql對象(oBql)、html元素解析對象(oHtmlparser)、加密對象(oCrypto)。雲端代碼想要調用這些對象時,只須要用以下的方法便可獲取:
//獲取數據庫對象 var db = modules.oData; //下面進行其餘操做
下面用雲端代碼輸出一個經典的"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
除了使用bmob提供的雲端代碼調式工具外,bmob容許開發者以http的方式直接調用雲端代碼。
用戶須要以http的方式運行雲端代碼,須要先肯定應用的Secret Key。 調用雲端代碼時,經過Secret Key標識一個應用,獲取Secret Key的路徑: 管理後臺->應用密鑰->Secret Key, 以下圖14所示:
圖14
注意:請妥善保管Secret Key,避免Secret Key的泄露!!!
下面展現了以Get的方式調用雲端代碼,在瀏覽器中輸入下面的url:
http://cloud.bmob.cn/a12af19a1b8bf434/helloworld
其中:
a12af19a1b8bf434:應用的Secret Key。
helloworld:雲端代碼的名稱
看到雲端代碼的返回結果以下圖15所示:
圖15
下面經過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操做的返回結果後才調用回調函數。
當使用php,java等非異步編程語言時,若是須要插入數據後再查找數據,可用相似下面的代碼:
db->insert(xxxxx); db->find(xxxxx);
在同步型的編程語言中,find和insert都是數據庫的操做,有文件讀寫的IO操做,在db->find執行前,能確保db->insert已經執行完畢了。
在異步編程中,用相似下面的代碼才能保證執行完db.insert後才執行:
db.insert({xxx},function(xxx){ db.find({xxx},function(xxx){xxxx}); });
只有經過在db.insert的回調函數中執行db.find,才能保證執行db.find前db.insert的數據庫操做已經完成。
舉個生活中的例子說明異步編程。在飯館裏,服務員接待客人通常是這樣的:
「服務員指引客人就座,把菜單遞給客人,在客人瀏覽菜單時服務員在旁邊一直等待,當客戶點菜後,服務員把訂單交給廚房後繼續幹別的事情。」
採用異步模式的服務員能夠這樣接待客人:
「服務員指引客人就座,把菜單遞給客人,在客人瀏覽菜單時服務員就去幹別的事情。當客戶決定點菜後,客人把服務員招來,服務員把客人下的訂單交給廚房後繼續幹別的事情。」
在服務員接待客人的行爲中,經過比較普通的作法和異步的作法,能發現採用異步的方法後服務員的效率大大提升,雲端代碼使用異步也是基於一樣的理由,當雲端代碼在等待IO操做(文件讀寫請求,網絡請求)的結果時是一直空閒,若是不等待IO的結果繼續執行下面的語句,能大大提升系統的效率。
在雲端代碼異步編程中「function(xxx){xxxx}」部分稱爲回調函數,雲端代碼會把IO操做的返回結果封裝後傳入到function函數執行裏面的邏輯。
db.insert({xxx},function(xxx){xxxx});
在本節中,經過bmob雲端代碼開發微信公衆平臺,實現一個反饋意見收集的功能: 1.把訂閱者發送到公衆號後臺的反饋意見存儲在上一節在bmob中建立的表「message」中。 2.訂閱者提交反饋意見後,公衆號自動給訂閱者發送消息,表示消息已收到。
建立一個名爲"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); }); }}
這個雲代碼的內容暫時看不懂不要緊,下面會逐漸解釋其中的含義。
只有啓用微信公衆號的開發模式後,才能把訂閱者發送到微信公衆號後臺的消息發送到bmob雲端代碼中進行處理。
微信公衆平臺地址:https://mp.weixin.qq.com
登陸微信公衆平臺後臺,在左側列表中最下方,找到「開發者中心」,點擊進入,如圖19所示:
圖19
進入服務器配置填寫框,如圖20所示:
圖20
點擊「修改配置」按鈕,如圖21所示:
圖21
此處的URL(http://cloud.bmob.cn/a12af19a1b8bf434/feedback)爲上節中生成的雲端代碼「feedback」的調用,按照雲端代碼的調用規格,a12af19a1b8bf434爲該應用的Secret Key,標明調用的是哪一個應用,feedback爲雲端代碼的名稱。Token定義爲weixin。EncodingAESKey則不用填,點擊「隨機生成」讓自動生成一個,消息加解密方式選擇「明文模式」,而後點擊「提交」按鈕,如圖22所示:
圖22
點擊「啓用」,如圖23所示:
圖23
在彈出框中點擊肯定,如圖24所示:
圖24
成功啓用後如圖25所示:
圖25
恭喜,你成功啓用開發模式。
用戶往該公衆號發送消息後,用戶收到的反饋內容如圖27所示:
圖27
查看應用的後臺,可看到接收的消息已存儲在表message中,如圖28所示:
圖28
雲端代碼開發微信公衆號有兩個重要原理必定要弄明白:
變爲開發模式時,微信公衆號後臺往配置的url發送校驗請求,這個過程雲端代碼校驗信息的原理。
雲端代碼收發微信公衆號後臺傳遞過來的消息的原理。
在開發者首次提交驗證申請時,微信公衆號後臺將發送GET請求到填寫的URL上,而且帶上四個參數(signature、timestamp、nonce、echostr),開發者經過對簽名(signature)的效驗來判斷此條消息的真實性。
這4個參數的含義以下:
signature:微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。
timestamp:時間戳。
nonce:隨機數
echostr:隨機字符串
此後,每次開發者接收用戶消息的時候,微信公衆號後臺也都會帶上前面三個參數(signature、timestamp、nonce)訪問開發者設置的URL,開發者依然經過對簽名的效驗判斷此條消息的真實性。效驗方式與首次提交驗證申請一致。
開發者經過檢驗signature對請求進行校驗(下面有校驗方式)。若確認這次GET請求來自微信公衆號後臺,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,不然接入失敗。
消息校驗流程以下:
a.將token、timestamp、nonce三個參數進行字典序排序。
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這個雲端代碼的加密對象模塊,提供md5和sha1兩種加密算法。經過這個模塊,按照微信校驗的流程完成校驗。oCrypto更多的功能詳細參考:https://www.npmjs.org/package/crypto
另外,雲端代碼使用了oHttptype模塊獲取當前的http調用方式。由於微信公衆平臺調用雲端代碼有兩種方式:
get方式,用於檢驗。
post方式,用於轉發訂閱者往公衆平臺發送的消息。
經過oHttptype模塊得知是用採用get方式調用雲端代碼,運行校驗的代碼並返回echostr參數。
在上一節的演示中,訂閱者往該公衆號發送消息後,返回已收到反饋內容的消息。
這一原理的消息流程如圖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-Type爲text/xml的請求後,雲端代碼自動把xml消息轉換爲一個對象放在request.body.xml中,經過獲取request.body.xml對應的屬性就能獲取xml節點的值。
雲端代碼解析xml對象,根據節點信息,把發送者(request.body.xml.FromUserName)和消息內容(request.body.xml.Content)存儲在表「message」後,而後經過必定的規則組裝成一個xml文本回復給微信公衆號後臺,微信公衆號後臺再回復給用戶。在這個收發過程當中,發送方和接收方進行了調換(ToUserName和FromUserName值互換),收發都是以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
經過本教程,你獲得瞭如下收穫:
瞭解bmob應用和雲端代碼的功能。
在不須要搭建服務器,不須要懂得基本的運維知識下,使用bmob雲端代碼在30分鐘內實現微信公衆平臺的開發,完了消息存儲和消息自動回覆這兩個功能。
閱讀本教程後,想了解雲後端服務bmob能夠實現哪些更酷的功能嗎?點擊http://www.bmob.cn,馬上進入bmob瞭解更多。
詳盡教程地址:http://docs.bmob.cn/cloudcodeweixin/index.html
有任何疑問,能夠加羣:483253876