使用Bmob云端代碼開發(fā)微信公眾平臺(教程)
目錄 4.2 用云端代碼實現(xiàn)"helleworld".7 4.4 云端代碼操作數(shù)據(jù)庫初步入門...12 3. 數(shù)據(jù)收發(fā)原理及消息數(shù)據(jù)格式...19 3.1變?yōu)殚_發(fā)模式時的消息校驗原理...20 3.2云端代碼收發(fā)微信公眾號后臺傳遞過來的消息的原理...21
一,、簡介這篇微信公眾平臺開發(fā)教程將帶領你一步一步領略Bmob后端云開發(fā)的方便性,并讓你輕松學會用Bmob進行微信公眾號平臺開發(fā),。
使用bmob有什么好處,,下面一一為你道來: ? 不需要購買服務器,不需要懂linux,,不需要懂運維知識,,零成本地擁有屬于自己的后臺系統(tǒng)。 ? 不在需要mysql,,輕松存儲和獲取數(shù)據(jù),,同時提供了一個方便的數(shù)據(jù)管理后臺。 ? 提供靈活的“云端代碼”,,其融合了bmob的數(shù)據(jù)服務和大量的第三方服務,,讓你輕松應對復雜的業(yè)務邏輯。同時云端代碼能被第三方平臺調(diào)用,,再也不需要php,,java等復雜的web服務。 本教程將引導你完成如下任務: ? 創(chuàng)建bmob應用 ? 使用bmob云端代碼實現(xiàn)微信公眾平臺的開發(fā)
二,、創(chuàng)建bmob應用在這節(jié)中,,將會從基本的創(chuàng)建bmob賬號開始,到創(chuàng)建應用,,數(shù)據(jù)的基本操作,,到云端代碼的運行,使讀者對bmob的功能有初步的了解,。
在這個教程中,,用到了bmob的兩個功能: ? 數(shù)據(jù)存儲:把訂閱者發(fā)到微信公眾號的信息存儲起來。 ? 云端代碼:微信后臺回調(diào)云端代碼后,,完成公眾號所需的業(yè)務邏輯:信息存儲,,把信息加工后返回給訂閱者的微信。
1.注冊bmob賬號在網(wǎng)址欄輸入www.或者在百度輸入Bmob進行搜索,,打開Bmob官網(wǎng)后,,點擊右上角的“注冊”,在跳轉(zhuǎn)頁面填入你的姓名,、郵箱,、設置密碼,如下圖1所示:
圖1 注冊成功,,到注冊所填入的郵箱查看bmob發(fā)送的郵件,,點擊其中激活鏈接后,就能使用郵箱和密碼登錄bmob,。
2. 創(chuàng)建應用登錄后,,點擊“我的控制臺”,,進入到了管理后臺,如下圖2所示:
圖2 在bmob中,,一個用戶可以創(chuàng)建多個應用,,每個應用擁有其所屬的專用數(shù)據(jù)庫,多個應用之間相互獨立,。
用戶需要創(chuàng)建一個應用,,先點擊管理后臺中的“創(chuàng)建應用”按鈕,如下圖3所示:
圖3
在創(chuàng)建應用的輸入框中輸入app的名稱,,點擊“創(chuàng)建應用”,,就能成功創(chuàng)建應用,如下圖4所示:
圖4 3. 數(shù)據(jù)的基本操作創(chuàng)建應用成功后,,開發(fā)者在管理后臺點擊剛才創(chuàng)建的應用,,進入到應用的后臺界面,其中最常用的是“數(shù)據(jù)瀏覽界面”,,在該界面提供了便利的圖形化操作,,讓開發(fā)者輕松地對該應用所屬的數(shù)據(jù)庫進行表的增刪,數(shù)據(jù)的增刪改查等操作,,如下圖5所示: 圖5
每個應用的數(shù)據(jù)庫都有一個默認的表"_User",其提供了一些常用的字段來記錄該應用的用戶信息。 開發(fā)者需要增加新的表來存儲信息時,,點擊“添加表”按鈕,,輸入表名,就能創(chuàng)建一張新表,,如下圖6所示:
圖6
在"添加新的表"界面中,選項“自定義”選項即可創(chuàng)建一張新的普通表,,另外兩個選項是較高級的功能,在本教程中暫時不需要用到,。
在這里,,創(chuàng)建了一張名為"message"的表,用于存儲訂閱者發(fā)送到公眾號后臺的信息,。 在表"message"的操作界面中可看到,,表"message"有4個默認的字段,其中3個最常用字段的含義如下: ? objectId:該行的id,,objectId的作用和mysql中的經(jīng)常使用的id類似,,用于唯一標示一行。 ? createdAt:改行數(shù)據(jù)的創(chuàng)建時間,。 ? updatedAt:改行數(shù)據(jù)的最后修改時間,。 當操作一行數(shù)據(jù)的時候,以上的3個字段的值由bmob后臺自動管理,。另外這些字段的名字是保留的,,你不能自行設置它們,。 由于表"message"是需要把訂閱者發(fā)到微信公眾號的信息存儲起來,存儲信息的兩個屬性:誰發(fā)送這條信息,,信息的內(nèi)容,,所以添加下面所需的字段: userId:訂閱者的id,String類型,。 content:發(fā)送的內(nèi)容,,String。
通過圖8的“添加一列”功能,,依次把userId和content這兩個字段添加到表"message"中,。
圖8 注意:在用云端代碼添加數(shù)據(jù)時,如果發(fā)現(xiàn)其所操作的表和所操作的列不存,,bmob后臺會自動創(chuàng)建,。這里為了演示bmob的數(shù)據(jù)瀏覽操作,所以才手動創(chuàng)建一次,。
4. 云端代碼閱讀了上面的“數(shù)據(jù)的基本操作”的內(nèi)容后,,讀者可能有個疑問,怎么對表的數(shù)據(jù)進行增刪改查等操作呢,?除了可以在"數(shù)據(jù)瀏覽"界面可以進行操作外,,也可以通過云端代碼進行數(shù)據(jù)的增刪改查,開發(fā)者也可以通過云端代碼完成更加復雜的業(yè)務邏輯,。
4.1云端代碼的基本知識對于一些復雜的應用,,您可能希望增加一些特有的業(yè)務邏輯,并能靈活掌控,,Bmob 云端代碼提供了這種靈活性,,可以讓您的代碼直接在 Bmob云上運行, 通過SDK(Android,iOS),,restful api或者任何http的方式調(diào)用,,即可獲取結(jié)果數(shù)據(jù)。
云端代碼的編碼采用nodejs語法,,簡單易用,。在云端代碼的編輯器中,系統(tǒng)默認生成了云端代碼的入口函數(shù)function onRequest(request, response, modules),,你可以根據(jù)自己的需求實現(xiàn)業(yè)務邏輯代碼,。
在云端代碼界面,創(chuàng)建一個名為"helloworld"的云端代碼,,如下圖9所示:
圖9
生成云端代碼后,,可看到云端代碼生成的入口方法,如下圖10所示:
圖10 開發(fā)者按照云端代碼的相關語法和提供的模塊編寫云端代碼,,就能實現(xiàn)各種業(yè)務邏輯,。
從云端代碼的入口方法function onRequest(request, response, modules)可知,,云端代碼包含三個模塊,分別是request模塊,、response模塊和modules模塊,。
4.1.1 request模塊request模塊用于獲取傳入的參數(shù)。由于現(xiàn)在調(diào)用云端代碼有兩種方式(get和post),,所以獲取傳入的參數(shù)的方式需要使用不同的方法,。
當用get請求的方式傳入?yún)?shù),可用如下的方法獲取參數(shù)的值: request.query.name //獲取傳入?yún)?shù)name的值
當用post請求的方式傳入?yún)?shù),,可用如下的方法獲取參數(shù)的值: request.body.name //獲取傳入?yún)?shù)name的值
4.1.2 response模塊response為云端代碼的信息回傳模塊,,該模塊包含了一個end方法,實現(xiàn)將云端的執(zhí)行結(jié)果(如查詢的數(shù)據(jù))返回給SDK或者RestApi等調(diào)用端: response.end(string result)
4.1.3 modules模塊modules是Bmob云端代碼提供給大家的各種對象處理的模塊,,包括數(shù)據(jù)庫對象(oData),、文件對象(oFile)、地理位置對象(oLocation),、關聯(lián)關系對象(oRelation),、原子操作對象(oAtom)、數(shù)據(jù)批量操作對象(oBatch),、數(shù)組對象(oArray),、消息推送對象(oPush)、云代碼對象(oFunctions),、郵件發(fā)送對象(oMail),、同步對象(oAsync)、HTTP對象(oHttp),、字符編碼轉(zhuǎn)換對象(oEncodeing)、事件對象(oEvent),、bql對象(oBql),、html元素解析對象(oHtmlparser)、加密對象(oCrypto),。云端代碼想要調(diào)用這些對象時,,只需要用如下的方法即可獲取:
4.2 用云端代碼實現(xiàn)"helleworld"下面用云端代碼輸出一個經(jīng)典的"helleworld"程序,,讓開發(fā)者對編寫云端代碼有個初步的了解,。 輸出"helleworld"的云端代碼如下:
在"helloworld"的云端代碼編輯界面上輸入上面的代碼,,按下“保存”按鈕就能把編輯完畢的代碼保存在云端,,如下圖11所示:
圖11
怎么運行上面編輯完畢云端代碼呢,?bmob在每個云端代碼的編輯界面下方提供了一個方便的調(diào)試工具,如下圖12所示:
這個工具有下面的功能:
? 可選擇以http"post"或者"get"的方法運行云端代碼,。 ? 選擇request的參數(shù)和對應值:可添加傳入云端代碼的request的參數(shù)和對應值,參數(shù)的數(shù)目可以通過“再添加一個”按鈕調(diào)整,。 需要運行名稱為"helloworld"的云端代碼,,在"helloworld"的云端代碼編輯界面下點擊“發(fā)送請求”按鈕,就能在調(diào)試工具上看到云端代碼返回的字符串“this is hello world”,,如下圖13所示:
圖13
整個云端代碼的執(zhí)行流程如圖13.1所示:
圖13.1
4.3 調(diào)用云端代碼的方式除了使用bmob提供的云端代碼調(diào)式工具外,,bmob允許開發(fā)者以http的方式直接調(diào)用云端代碼,。
4.3.1 獲取Secret Key用戶需要以http的方式運行云端代碼,需要先確定應用的Secret Key,。調(diào)用云端代碼時,通過Secret Key標識一個應用,,獲取Secret Key的路徑:管理后臺->應用密鑰->Secret Key, 如下圖14所示:
圖14 注意:請妥善保管Secret Key,避免Secret Key的泄露?。?!
4.3.2以Get的方式調(diào)用云端代碼下面展示了以Get的方式調(diào)用云端代碼,,在瀏覽器中輸入下面的url:
其中: ? a12af19a1b8bf434:應用的Secret Key。 ? helloworld:云端代碼的名稱
看到云端代碼的返回結(jié)果如下圖15所示:
圖15 4.3.3 以Post的方式調(diào)用云端代碼下面通過curl工具展示了以Post的方式調(diào)用云端代碼:
其中:
? a12af19a1b8bf434:應用的Secret Key,。 ? helloworld:云端代碼的名稱 4.4 云端代碼操作數(shù)據(jù)庫初步入門bmob提供了數(shù)據(jù)庫對象(oData)用于操作數(shù)據(jù)。
用云端代碼往數(shù)據(jù)表“message”插入一條數(shù)據(jù),,可用如下的代碼
點擊保存后在云端代碼調(diào)試區(qū)按“發(fā)送請求”,返回“success”的值,,如下圖16所示:
圖16 在管理后臺->數(shù)據(jù)瀏覽->應用表“message”下查看通過云端代碼新增的數(shù)據(jù),,如下圖17所示:
圖17
用云端代碼查詢數(shù)據(jù)表“message”的數(shù)據(jù),可用如下的代碼:
點擊保存后在云端代碼調(diào)試區(qū)按“發(fā)送請求”,,返回“success”的值,,如下圖18所示:
圖18
需要了解更多云端代碼的操作,,可閱讀: http://docs./cloudcode/developdoc/index.html?menukey=develop_doc&key=develop_cloudcode
在編寫云端代碼時有個注意事項:云端代碼是使用異步編程,。也就是說,當遇到文件讀寫請求,,網(wǎng)絡請求等IO操作時,,代碼不等待IO操作返回結(jié)果就執(zhí)行后面的語句,當接收到IO操作的返回結(jié)果后才調(diào)用回調(diào)函數(shù)。 當使用php,,java等非異步編程語言時,,如果需要插入數(shù)據(jù)后再查找數(shù)據(jù),,可用類似下面的代碼:
在同步型的編程語言中,,find和insert都是數(shù)據(jù)庫的操作,,有文件讀寫的IO操作,在db->find執(zhí)行前,,能確保db->insert已經(jīng)執(zhí)行完畢了,。 在異步編程中,用類似下面的代碼才能保證執(zhí)行完db.insert后才執(zhí)行:
只有通過在db.insert的回調(diào)函數(shù)中執(zhí)行db.find,,才能保證執(zhí)行db.find前db.insert的數(shù)據(jù)庫操作已經(jīng)完成,。
舉個生活中的例子說明異步編程。在飯館里,,服務員接待客人一般是這樣的: ”服務員指引客人就座,,把菜單遞給客人,在客人瀏覽菜單時服務員在旁邊一直等待,,當客戶點菜后,,服務員把訂單交給廚房后繼續(xù)干別的事情?!?/span>
采用異步模式的服務員可以這樣接待客人: ”服務員指引客人就座,,把菜單遞給客人,在客人瀏覽菜單時服務員就去干別的事情,。當客戶決定點菜后,,客人把服務員招來,服務員把客人下的訂單交給廚房后繼續(xù)干別的事情,?!?/span>
在服務員接待客人的行為中,通過比較普通的做法和異步的做法,,能發(fā)現(xiàn)采用異步的方法后服務員的效率大大提高,,云端代碼使用異步也是基于同樣的理由,當云端代碼在等待IO操作(文件讀寫請求,,網(wǎng)絡請求)的結(jié)果時是一直空閑,,如果不等待IO的結(jié)果繼續(xù)執(zhí)行下面的語句,能大大提高系統(tǒng)的效率,。
在云端代碼異步編程中“function(xxx){xxxx}”部分稱為回調(diào)函數(shù),,云端代碼會把IO操作的返回結(jié)果封裝后傳入到function函數(shù)執(zhí)行里面的邏輯。
三,、微信公眾平臺的開發(fā)在本節(jié)中,,通過bmob云端代碼開發(fā)微信公眾平臺,實現(xiàn)一個反饋意見收集的功能: 1.把訂閱者發(fā)送到公眾號后臺的反饋意見存儲在上一節(jié)在bmob中創(chuàng)建的表“message”中,。 2.訂閱者提交反饋意見后,,公眾號自動給訂閱者發(fā)送消息,,表示消息已收到。 1. 創(chuàng)建云端代碼創(chuàng)建一個名為"feedback"的云端代碼用于實現(xiàn)上面的功能,,代碼如下:
這個云代碼的內(nèi)容暫時看不懂沒關系,下面會逐漸解釋其中的含義,。
2. 啟用微信公眾號的開發(fā)模式只有啟用微信公眾號的開發(fā)模式后,,才能把訂閱者發(fā)送到微信公眾號后臺的消息發(fā)送到bmob云端代碼中進行處理。
微信公眾平臺地址:https://mp.weixin.qq.com
登錄微信公眾平臺后臺,,在左側(cè)列表中最下方,,找到“開發(fā)者中心”,點擊進入,,如圖19所示:
圖19 進入服務器配置填寫框,,如圖20所示:
圖20
點擊“修改配置”按鈕,如圖21所示:
圖21 此處的URL(http://cloud./a12af19a1b8bf434/feedback)為上節(jié)中生成的云端代碼“feedback”的調(diào)用,,按照云端代碼的調(diào)用規(guī)格,,a12af19a1b8bf434為該應用的Secret Key,標明調(diào)用的是哪個應用,,feedback為云端代碼的名稱,。Token定義為weixin。EncodingAESKey則不用填,,點擊“隨機生成”讓自動生成一個,,消息加解密方式選擇“明文模式”,然后點擊“提交”按鈕,,如圖22所示:
圖22
點擊“啟用”,,如圖23所示:
圖23
在彈出框中點擊確定,如圖24所示:
圖24 成功啟用后如圖25所示:
圖25
恭喜,,你成功啟用開發(fā)模式,。
用戶往該公眾號發(fā)送消息后,用戶收到的反饋內(nèi)容如圖27所示:
圖27
查看應用的后臺,,可看到接收的消息已存儲在表message中,,如圖28所示:
圖28
3. 數(shù)據(jù)收發(fā)原理及消息數(shù)據(jù)格式云端代碼開發(fā)微信公眾號有兩個重要原理一定要弄明白:
? 變?yōu)殚_發(fā)模式時,微信公眾號后臺往配置的url發(fā)送校驗請求,,這個過程云端代碼校驗信息的原理,。 ? 云端代碼收發(fā)微信公眾號后臺傳遞過來的消息的原理,。
3.1變?yōu)殚_發(fā)模式時的消息校驗原理在開發(fā)者首次提交驗證申請時,微信公眾號后臺將發(fā)送GET請求到填寫的URL上,,并且?guī)纤膫€參數(shù)(signature,、timestamp、nonce,、echostr),開發(fā)者通過對簽名(signature)的效驗來判斷此條消息的真實性,。
這4個參數(shù)的含義如下:
? signature:微信加密簽名,,signature結(jié)合了開發(fā)者填寫的token參數(shù)和請求中的timestamp參數(shù)、nonce參數(shù),。 ? timestamp:時間戳,。 ? nonce:隨機數(shù) ? echostr:隨機字符串
此后,每次開發(fā)者接收用戶消息的時候,,微信公眾號后臺也都會帶上前面三個參數(shù)(signature,、timestamp、nonce)訪問開發(fā)者設置的URL,,開發(fā)者依然通過對簽名的效驗判斷此條消息的真實性,。效驗方式與首次提交驗證申請一致。
開發(fā)者通過檢驗signature對請求進行校驗(下面有校驗方式),。若確認此次GET請求來自微信公眾號后臺,,請原樣返回echostr參數(shù)內(nèi)容,則接入生效,,成為開發(fā)者成功,,否則接入失敗。
消息校驗流程如下:
a.將token,、timestamp,、nonce三個參數(shù)進行字典序排序。 b.將三個參數(shù)字符串拼接成一個字符串進行sha1加密,。 c.開發(fā)者獲得加密后的字符串可與signature對比,,標識該請求來源于微信。
整個流程如圖29所示:
圖29
使用的云端代碼如下:
其中token的值是在微信公眾號后臺填入的token值:“weixin”,。
在這個校驗流程的云端代碼中,使用oCrypto這個云端代碼的加密對象模塊,,提供md5和sha1兩種加密算法,。通過這個模塊,按照微信校驗的流程完成校驗,。oCrypto更多的功能詳細參考:https://www./package/crypto
另外,,云端代碼使用了oHttptype模塊獲取當前的http調(diào)用方式,。因為微信公眾平臺調(diào)用云端代碼有兩種方式: ? get方式,用于檢驗,。 ? post方式,,用于轉(zhuǎn)發(fā)訂閱者往公眾平臺發(fā)送的消息。 通過oHttptype模塊得知是用采用get方式調(diào)用云端代碼,,運行校驗的代碼并返回echostr參數(shù),。
3.2云端代碼收發(fā)微信公眾號后臺傳遞過來的消息的原理在上一節(jié)的演示中,訂閱者往該公眾號發(fā)送消息后,,返回已收到反饋內(nèi)容的消息,。
這一原理的消息流程如圖30所示:
圖30
云端代碼內(nèi)部通過下面的代碼處理用戶發(fā)送的消息:
從上圖可以看出,用戶在發(fā)送一個文本后,,微信公眾號后臺將組裝一個xml消息發(fā)送給云端代碼服務器,。當云端代碼接收到http頭部Content-Type為text/xml的請求后,云端代碼自動把xml消息轉(zhuǎn)換為一個對象放在request.body.xml中,,通過獲取request.body.xml對應的屬性就能獲取xml節(jié)點的值,。
云端代碼解析xml對象,根據(jù)節(jié)點信息,,把發(fā)送者(request.body.xml.FromUserName)和消息內(nèi)容(request.body.xml.Content)存儲在表“message”后,,然后通過一定的規(guī)則組裝成一個xml文本回復給微信公眾號后臺,微信公眾號后臺再回復給用戶,。在這個收發(fā)過程中,,發(fā)送方和接收方進行了調(diào)換(ToUserName和FromUserName值互換),收發(fā)都是以xml格式在后臺進行傳輸?shù)?。所以掌握各種消息類型的接收回復是進行微信公眾平臺開發(fā)的基礎,!
最常見的消息類型為文本的xml格式如下:
XML格式講解:
? ToUserName 消息接收方微信號,一般為公眾平臺賬號微信號 ? FromUserName 消息發(fā)送方微信號 ? CreateTime 消息創(chuàng)建時間 ? MsgType 消息類型,;文本消息為text ? Content 消息內(nèi)容 ? MsgId 消息ID號 各種類型的消息詳解,,請查看微信開發(fā)文檔: http://mp.weixin.qq.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html
四、總結(jié)通過本教程,,你得到了以下收獲:
了解bmob應用和云端代碼的功能,。 在不需要搭建服務器,不需要懂得基本的運維知識下,,使用bmob云端代碼在30分鐘內(nèi)實現(xiàn)微信公眾平臺的開發(fā),,完了消息存儲和消息自動回復這兩個功能,。 閱讀本教程后,想了解云后端服務bmob可以實現(xiàn)哪些更酷的功能嗎,?點擊http://www.,,立刻進入bmob了解更多。
|
|