
開發環境如下
CentOS 7
Python 3.7
Flask 1.1.1
tornado 6.0.3
關鍵代碼如下
xml_data = request.stream.read()
xml_objt = receive.parse_xml(xml_data)
if xml_objt.MsgType == "text":
text_str = '''<xml><ToUserName>![CDATA[%s]]</ToUserName><FromUserName>![CDATA[%s]]</FromUserName><CreateTime>%s</CreateTime><MsgType>![CDATA[text]]</MsgType><Content>![CDATA[%s]]</Content></xml>'''
response = make_response(text_str % (xml_objt.FromUserName, xml_objt.ToUserName, str(int(time.time())), xml_objt.Content))
response.headers['content-type'] = 'application/xml'
return response
else:
return make_response("")
其中的訊息接受和決議如下
# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
def parse_xml(web_data):
if len(web_data) == 0:
return None
xmlData = ET.fromstring(web_data)
msg_type = xmlData.find('MsgType').text
print(msg_type, xmlData)
print(ET.tostring(xmlData))
if msg_type == 'event':
event_type = xmlData.find('Event').text
if event_type == 'CLICK':
return Click(xmlData)
elif event_type in ('subscribe', 'unsubscribe'):
return Subscribe(xmlData)
elif msg_type == 'text':
return TextMsg(xmlData)
elif msg_type == 'image':
return ImageMsg(xmlData)
elif msg_type == 'voice':
return VoiceMsg(xmlData)
else:
return Msg(xmlData)
class Msg(object):
def __init__(self, xmlData):
self.ToUserName = xmlData.find('ToUserName').text
self.FromUserName = xmlData.find('FromUserName').text
self.CreateTime = xmlData.find('CreateTime').text
self.MsgType = xmlData.find('MsgType').text
class TextMsg(Msg):
def __init__(self, xmlData):
Msg.__init__(self, xmlData)
self.Content = xmlData.find('Content').text
目前已排除的問題
1. 介面回傳值中沒有空格
2. 介面回傳值欄位取值正確,ToUserName和FromUserName沒反
3. xml回傳值的節點名正確
4. 回傳值編碼沒問題
5. 公眾號后臺服務器配置已啟用
6. 域名決議正常、埠訪問正常
7. 公眾號沒有系結第三方平臺
另外公眾號曾經改過名,這里接受到的用戶訊息中的ToUserName是原始ID,而不是當前公眾號ID,不知道是否有影響
而且現在微信公眾號運維的埠告警功能無法使用,所以不能通過這個除錯
uj5u.com熱心網友回復:
Tornado的配置以及Flask的運行代碼
app = Flask(__name__)
app.debug = True
define("debug", default=True, help="Debug Mode", type=bool)
. . .
if __name__ == '__main__':
options.parse_command_line()
http_server = HTTPServer(WSGIContainer(app))
http_server.listen(80)
IOLoop.instance().start()
另外,介面URL也是毫無問題的,不存在缺少'/'的問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/64251.html
標籤:微信開發
上一篇:漫畫:兄弟,今晚又得熬個通宵了!
下一篇:關于安卓音樂播放器問題
