上一篇做了服务器校验,但没有处理用户发来的消息,为了完成自动回复的功能,需要增加一些功能:
1、调整服务器校验函数:
def verify_wechat(request):token='token'data=request.argssignature=data.get('signature')timestamp=data.get('timestamp')nonce=data.get('nonce')echostr=data.get('echostr')temp=[timestamp,nonce,token]temp.sort()temp=''.join(temp)if (hashlib.sha1(temp.encode('utf8')).hexdigest()==signature):return echostrelse:return 'error',403
2、解析用户发来的信息
微信公众号中,用户发给公众号的消息是以xml形式发给服务器的,所以要先对xml进行解析:
def getUserMessageContentFromXML(xml_content):root=ET.fromstring(xml_content)content=root.find('Content').textfrom_user_name=root.find('FromUserName').textto_user_name=root.find('ToUserName').textreturn content,from_user_name,to_user_name
这个函数获取了用户和公众号的id(名称)
3、回复信息(“你好”)
回复信息,和收到信息一样,都是xml形式,所以要先把回复的信息调整成xml形式:
def generate_response_xml(from_user_name,to_user_name,output_content):output_xml= '''<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>'''response = make_response(output_xml % (from_user_name, to_user_name, str(int(time.time())), str(output_content)))response.content_type = 'application/xml'return response
然后,调整服务器函数:
@app.route('/wechatai', methods=['GET', 'POST'])
def wechatai():if request.method == 'GET':return verify_wechat(request)else:print("user request data: ",request.data)user_message_content,from_user_name,to_user_name=getUserMessageContentFromXML(request.data)print(from_user_name)print(to_user_name)return generate_response_xml(from_user_name, to_user_name, "你好")
最终效果:(为了避免一直你好,通过if条件判断,只设置了自己的信息才会回复“你好”)