【微信易信公衆平臺開發】開啓開發者模式

本系列文章均爲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代替了。
好了今天就到這裏,下一篇將講解一個非常給力的功能——如何生成自定義菜單。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章