本系列文章均爲A2BGeek原創,轉載務必在明顯處註明:
轉載自A2BGeek的【微信易信公衆平臺開發】系列,原文鏈接:http://blog.csdn.net/a2bgeek/article/details/17250383
我的個人博客站點已經開通,會有技術分享和其他一些有意思的東西,希望讀者能去訪問一下,網址是http://a2bgeek.me
我把微信/易信的公衆號看成一個APP內的輕量級APP(此時可以把微信/易信看成是應用商店),爲什麼這麼說呢?因爲有很多日常生活需要的服務都能在公衆號中得到,比如查詢天氣、查詢快遞、辦理銀行業務、辦理手機業務等,再加上現在有了自定義菜單,儼然已經成爲了一個APP,但是這種APP是有侷限性的,其一是這種APP只是一個I/O型的APP,即用戶輸入然後得到一個輸出;其二是交互方式比較單調,除了I/O就是跳轉到網頁,只能在網頁上想想有什麼好的交互方式了。
編輯模式與開發模式的區別
玩公衆平臺開發首先要明白“編輯模式”(易信中叫做“自動回覆”)和“開發者模式”的區別,下面兩張圖可以清楚地看到區別:
在編輯模式下,用戶在公衆號內的輸入被髮送到微信服務器上,微信服務器根據預先設置的“消息自動回覆”、“關鍵詞自動回覆”把消息發回給客戶端。
在開發模式下,用戶的輸入首先發送到微信服務器上,微信服務器把消息轉發給開發者的服務器,開發者的服務器處理之後給微信服務器發消息,微信服務器再把消息轉發給客戶端。微信服務器在某種意義上成了一個代理服務器,不過有個特殊的限制就是開發者服務器在收到消息後必須在5s內給微信服務器發消息,否則微信服務器不會接受此次返回的消息。
成爲開發者
這部分大概說一下就可以了,首先你要註冊公衆平臺的賬號,微信的是https://mp.weixin.qq.com,易信的是https://plus.yixin.im/,然後登錄,然後在“高級功能”中會看到有“編輯模式”/“自動回覆”和“開發模式”,微信和易信都是同時不能開啓兩種模式,需要先關閉“編輯模式”/“自動回覆”,然後打開“開發模式”,這時會提示申請成爲開發者,申請一下就行了,審覈大概半天時間。
開啓開發者模式
如上圖所示,開發模式需要開發者有一個個人的服務器,不過對於大多數開發者來說弄一個服務器有點奢侈,還好我們已經進入了所謂的雲計算時代,有土豪已經爲我們搭好了服務器,你可以隨便選擇一個ae,比如gae、bae、sae等等。我個人的習慣是用bae,用git克隆一個版本到電腦上,寫好了再push上去。這裏就不介紹雲引擎的用法了,不會的讀者可以花上一點兒時間玩一玩,很好上手。
在有了個人服務器之後,你需要做的就是“網址接入”,接入後微信/易信服務器就能和你的個人服務器通信了。
如圖,當你填寫上URL和Token後,點擊“提交驗證”的按鈕後,微信/易信服務器會發送GET請求到你的服務器上,如果有對HTTP不熟悉的朋友,可以看我的這篇博客http://blog.csdn.net/a2bgeek/article/details/11580395,GET請求的參數分別是:
參數 | 描述 |
---|---|
signature | 易信加密簽名 |
timestamp | 時間戳 |
nonce | 隨機數 |
echostr | 隨機字符串 |
開發者通過檢驗signature對請求進行校驗,校驗方式如下:
加密/校驗流程: 1. 將token、timestamp、nonce三個參數進行字典序排序 2. 將三個參數字符串拼接成一個字符串進行sha1加密 3. 開發者獲得加密後的字符串可與signature對比,標識該請求來源於微信/易信
若確認此次GET請求來自微信/易信服務器,請原樣返回echostr參數內容,則接入生效,否則接入失敗。
signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。
下面上代碼,服務器端我使用的是Tornado框架:
from bae.api import logging
import tornado.wsgi
import hashlib
class MainHandler(tornado.web.RequestHandler):
def get(self):
signature = self.get_argument('signature')
timestamp = self.get_argument('timestamp')
nonce = self.get_argument('nonce')
echostr = self.get_argument('echostr')
if checksignature(signature, timestamp, nonce):
logging.info('return echostr')
self.write(echostr)
else:
logging.info('return fail')
self.write('fail')
app = tornado.wsgi.WSGIApplication([
(r"/", MainHandler),
])
from bae.core.wsgi import WSGIApplication
application = WSGIApplication(app)
def checksignature(signature, timestamp, nonce):
args = []
args.append("XXXXXXXX")
args.append(timestamp)
args.append(nonce)
args.sort()
mysig = hashlib.sha1(''.join(args)).hexdigest()
logging.info('mysig is %s' % mysig)
return mysig == signature
代碼中我自己的Token用XXXXXXX代替了。好了今天就到這裏,下一篇將講解一個非常給力的功能——如何生成自定義菜單。