最后一个基础模块就是对来自微信服务器的请求进行处理和响应。
一般来说,当普通微信用户向公众账号发消息时或产生关注/取消关注、点击自定义菜单等动作后,微信服务器会将消息的XML数据包以POST的形式发送到我们的服务器来。其中,XML数据包形式如下(以文本消息为例):
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[this is a test]]></Content> <MsgId>1234567890123456</MsgId> </xml>
所有类型的XML数据包内都会包含开发者微信号(ToUserName)、发送方帐号(FromUserName,一个OpenID)、消息创建时间(CreateTime)以及消息类型(MsgType),然后对于不同的消息类型,还会有一些特定的参数,例如这里的文本消息就会有一个Content,即用户发送过来的消息内容。
因此我们需要在代码中将其解析出来,并根据不同的参数内容向用户返回所需的消息。接着在 接入 一文中编写的View:
class Weixin(View): ... def post(self, request): if not self.validate(request): raise PermissionDenied soup = BeautifulSoup(request.body) if soup.msgtype: # do something here ... # and return the specified content for the request user. return HttpResponse('') ....
要注意的是:
1. 为了安全性,必须对每次请求的来源都做验证,之后才是处理并响应;
2. 返回的数据包也应以XML数据包的形式,具体这里就不说了,可以参考官方文档。