上篇文章介绍了如何对接微信公共平台,但是里面的校验代码是我们自己实现的。但是目前我们有了更好的选择----wechatpy。微信(WeChat) 公众平台第三方 Python SDK,实现了普通公众平台和企业号公众平台的解析消息、生成回复和主动调用等 API。详情请看http://wechatpy.readthedocs.org/en/latest/里面的介绍。
wechatpy里面已经封装好了校验模块,直接调用check_signature就可以完成校验工作,修改后的代码如下:
#!/bin/env python# -*- coding: utf-8 -*- import hashlib, urllib, urllib2, re, time, jsonimport xml.etree.ElementTree as ETfrom flask import Flask, request, render_templatefrom config import APP_SECRET_KEYfrom lib.wechatpy import parse_message, create_replyfrom lib.wechatpy.utils import check_signaturefrom lib.wechatpy.exceptions import InvalidSignatureExceptionapp = Flask(__name__)app.debug = Trueapp.secret_key = APP_SECRET_KEYTOKEN = 'douban_book' #注意要与微信公众帐号平台上填写一致@app.route('/')def home(): return render_template('index.html')#公众号消息服务器网址接入验证#需要在公众帐号管理台手动提交, 验证后方可接收微信服务器的消息推送@app.route('/weixin', methods=['GET', 'POST'])def weixin(): signature = request.args.get('signature', '') timestamp = request.args.get('timestamp', '') nonce = request.args.get('nonce', '') echo_str = request.args.get('echostr', '') try: check_signature(TOKEN, signature, timestamp, nonce) except InvalidSignatureException: abort(403) if request.method == 'GET': return echo_str else: msg = parse_message(request.data) if msg.type == 'text': reply = create_reply(msg.content, msg) else: reply = create_reply('Sorry, can not handle this for now', msg) return reply.render()if __name__ == '__main__': app.run()