Flask+SAE搭建微信后台初探

Flask+SAE搭建微信后台初探

申请微信公众号

申请通过之后,将模式改为开发者模式,并填入自己服务器的urltoken(令牌)。

在SAE上新建Python项目

微信公众号与SAE应用的对接和验证

处理流程为:

  • 用户发送请求到微信服务器
  • 微信服务器发送请求到SAE
  • SAE返回消息给微信服务器
  • 微信服务器返回消息给用户

SAE上处理Http请求,验证之后返回,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# -*- coding:utf8 -*-
import time
from flask import Flask, g, request, make_response
import hashlib

@app.route('/', methods = ['GET', 'POST'] )
def wechat_auth():
if request.method == 'GET':
token = 'xxxxxxxxxxx' # your token
query = request.args # GET 方法附上的参数
signature = query.get('signature', '')
timestamp = query.get('timestamp', '')
nonce = query.get('nonce', '')
echostr = query.get('echostr', '')
s = [timestamp, nonce, token]
s.sort()
s = ''.join(s)
if ( hashlib.sha1(s).hexdigest() == signature ):
return make_response(echostr)

按照SAE中Python及Flask规范将代码提交到SVN中,将应用地址和token填入微信公众平台进行验证,如果设置成功,即完成验证。

处理用户消息(以文本消息为例)

当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上,文本消息格式如下:

1
2
3
4
5
6
7
8
<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需对换,代码如下:

1
2
3
4
5
6
7
8
9
10
# Get the infomations from the recv_xml.  
xml_recv = ET.fromstring(request.data)
ToUserName = xml_recv.find("ToUserName").text
FromUserName = xml_recv.find("FromUserName").text
Content = xml_recv.find("Content").text
# 此处可处理Content
reply = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>0</FuncFlag></xml>"
response = make_response( reply % (FromUserName, ToUserName, str(int(time.time())), Content ) )
response.content_type = 'application/xml'
return response

到此,在微信公众号里回复消息,应该就会有消息回复啦~

参考
SAE入门指南之Python
微信接入指南