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'感谢您关注【微人人公众号】 目前功能如下:【1】 库存查询;') return resultStr
21.4. 更新代码到云
代码更新好后,当用户有关注我们的公众号时,就会得到上面的回复。
21.5. 小结
本章节我们简要介绍了如何用户关注订阅号/服务号的关注事件,依此类推我们也可以扩展代码进一步处理用户取消关注的事件或微信接口供处理的其它事件。