21. 訂閱事件(subscribe)
新用戶關注微信公眾平台,將產生一個訂閱事件,即subscribe事件,在新用戶關注公眾平台后為新用戶提供一些簡明扼要的公眾號說明
事件推送(event);
接收到消息后,首先需要對消息類型做出判斷,然后再針對不同類型的消息做出處理。在事件推送中,事件類型又分為三種,subscribe(訂閱)、unsubscribe(取消訂閱)、CLICK(自定義菜單點擊事件),還需要再加一次判斷;判斷為subscribe事件后,根據設定好的歡迎消息,回復給用戶
21.1. 修改微信服務入口函數wechat
首先,我們修改前面的微信入口函數wechat,增加處理Post內容功能。
@csrf_exempt def wechat(request): response = None if request.method == 'GET': response = HttpResponse(checkSignature(request),content_type="text/plain")
elif request.method == 'POST': response= HttpResponse(responseMsg(request.body),content_type="application/xml") else: response = None return response
21.2. 增加responseMsg函數來專門處理微信的事件推送
def responseMsg(postContent): postStr = smart_str(postContent) if postStr: msg = xmlContent2Dic(postStr) if msg['MsgType']: if msg['MsgType'] == 'event': resultStr = handleEvent(msg) #處理事件推送 else: resultStr = 'Input something...' return resultStr #函數把微信XML格式信息轉換成字典格式 def xmlContent2Dic(xmlContent): dics = {} elementTree = ElementTree.fromstring(xmlContent) if elementTree.tag == 'xml': for child in elementTree : dics[child.tag] = smart_unicode(child.text) return dics
21.3. 增加handleEvent函數來專門處理微信的事件推送
在“微信”的事件推送中,事件類型又分為三種,subscribe(訂閱)、unsubscribe(取消訂閱)、CLICK(自定義菜單點擊事件),這樣我們在handleEvent函數里判斷本次推送是subscribe事件,然后根據設定好的歡迎消息,回復給用戶。
def handleEvent(msg): if msg['Event'] == 'subscribe': resultStr="<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content></xml>" resultStr = resultStr % (msg['FromUserName'],msg['ToUserName'],str(int(time.time())),'text',u'感謝您關注【微人人公眾號】\n目前功能如下:【1】 庫存查詢;') return resultStr
21.4. 更新代碼到雲
代碼更新好后,當用戶有關注我們的公眾號時,就會得到上面的回復。
21.5. 小結
本章節我們簡要介紹了如何用戶關注訂閱號/服務號的關注事件,依此類推我們也可以擴展代碼進一步處理用戶取消關注的事件或微信接口供處理的其它事件。

