上一篇做了服务器校验,但没有处理用户发来的消息,为了完成自动回复的功能,需要增加一些功能:
1、调整服务器校验函数:
def verify_wechat(request):
token='token'
data=request.args
signature=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 echostr
else:
return 'error',403
2、解析用户发来的信息
微信公众号中,用户发给公众号的消息是以xml形式发给服务器的,所以要先对xml进行解析:
def getUserMessageContentFromXML(xml_content):
root=ET.fromstring(xml_content)
content=root.find('Content').text
from_user_name=root.find('FromUserName').text
to_user_name=root.find('ToUserName').text
return 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条件判断,只设置了自己的信息才会回复“你好”)