code
# -*- coding:utf-8 -*- from flask import Flask from flask import request import hashlib import time import re import xml.etree.ElementTree as ET app = Flask(__name__) @app.route("/") def index(): return "Hello World!" @app.route("/wechat", methods=["GET","POST"]) def weixin(): if request.method == "GET": # 判断请求方式是GET请求 my_signature = request.args.get('signature') # 获取携带的signature参数 my_timestamp = request.args.get('timestamp') # 获取携带的timestamp参数 my_nonce = request.args.get('nonce') # 获取携带的nonce参数 my_echostr = request.args.get('echostr') # 获取携带的echostr参数 # my_token = request.args.get('token') print(my_signature) print(my_timestamp) print(my_nonce) print(my_echostr) # print(my_token) token = '123456' # 一定要跟刚刚填写的token一致 # 进行字典排序 data = [token,my_timestamp ,my_nonce ] data.sort() # 拼接成字符串,进行hash加密时需为字符串 data = ''.join(data) #创建一个hash对象 s = hashlib.sha1() #对创建的hash对象更新需要加密的字符串 s.update(data.encode("utf-8")) #加密处理 mysignature = s.hexdigest() print("handle/GET func: mysignature, my_signature: ", mysignature, my_signature) # 加密后的字符串可与signature对比,标识该请求来源于微信 if my_signature == mysignature: return my_echostr else: return "" else: # 解析xml xml = ET.fromstring(request.data) toUser = xml.find('ToUserName').text fromUser = xml.find('FromUserName').text msgType = xml.find("MsgType").text createTime = xml.find("CreateTime") # 判断类型并回复 if msgType == "text": content = xml.find('Content').text content=content+"已收到" return reply_text(fromUser, toUser, content) else: return reply_text(fromUser, toUser, "我只懂文字") def reply_text(to_user, from_user, content): """ 以文本类型的方式回复请求 """ return """ <xml> <ToUserName><![CDATA[{}]]></ToUserName> <FromUserName><![CDATA[{}]]></FromUserName> <CreateTime>{}</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[{}]]></Content> </xml> """.format(to_user, from_user, int(time.time() * 1000), content) if __name__ == "__main__": app.run(host='0.0.0.0', port=879)