Python微信开发中公众号自动回复相同消息的问题如何解决?
参考网上的一些例子来实现自动回复,我的理解就是把拿到的 XML 的发送方跟接收方交换下位置,就可以发回去。
然后一些我不知道怎么解释的错误就出来了,各位大佬看看是什么回事,谢谢!


这是处理 POST 的代码

Python微信开发中公众号自动回复相同消息的问题如何解决?
有啥见解或者方向都可以提一下,谢谢!
这个问题通常是因为微信服务器在超时未收到响应时会重发请求。核心是要实现消息排重,确保相同消息只处理一次。
最直接的方法是在收到消息时,检查其MsgId字段(普通消息有,事件消息没有)。如果MsgId已处理过,就直接返回空字符串或已生成的回复,避免重复逻辑。
这里是一个使用Flask框架的简单示例,用内存中的set来记录已处理的MsgId:
from flask import Flask, request
import hashlib
import time
from xml.etree import ElementTree as ET
app = Flask(__name__)
# 用于存储已处理消息MsgId的集合(生产环境请用Redis等持久化存储)
processed_msg_ids = set()
def parse_xml(data):
"""解析微信XML消息"""
xml_data = ET.fromstring(data)
msg_type = xml_data.find('MsgType').text
from_user = xml_data.find('FromUserName').text
to_user = xml_data.find('ToUserName').text
msg_id = xml_data.find('MsgId').text if xml_data.find('MsgId') is not None else None
content = xml_data.find('Content').text if xml_data.find('Content') is not None else None
return {
'msg_type': msg_type,
'from_user': from_user,
'to_user': to_user,
'msg_id': msg_id,
'content': content
}
def reply_text(to_user, from_user, content):
"""生成文本回复XML"""
return f"""
<xml>
<ToUserName><![CDATA[{to_user}]]></ToUserName>
<FromUserName><![CDATA[{from_user}]]></FromUserName>
<CreateTime>{int(time.time())}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{content}]]></Content>
</xml>
"""
@app.route('/wechat', methods=['POST'])
def wechat():
# 解析XML
msg = parse_xml(request.data)
# 关键排重逻辑:如果有MsgId且已处理过,直接返回空响应
if msg['msg_id'] and msg['msg_id'] in processed_msg_ids:
# 微信服务器收到空字符串或success,将不再重试
return ''
# 记录已处理的MsgId
if msg['msg_id']:
processed_msg_ids.add(msg['msg_id'])
# 你的业务逻辑(这里简单回复收到的文本)
reply_content = f"收到: {msg['content']}" if msg['content'] else "Hello"
# 生成回复XML
return reply_text(msg['from_user'], msg['to_user'], reply_content)
if __name__ == '__main__':
app.run(port=80)
要点说明:
MsgId是微信为每条消息生成的唯一ID,用它做排重key最可靠。- 示例用了内存
set,实际生产环境要用Redis等带过期机制的存储,避免内存无限增长。 - 排重检查要放在业务逻辑之前,一发现重复就直接
return ''。 - 事件消息(如关注、点击菜单)没有
MsgId,这类消息通常不需要排重,因为微信不会重发。
简单说就是加个消息ID的缓存检查。
5 年前做过微信公众号开发,印象不是很深了。
我怎么记得每条消息都是都是有个字段专门做了处理的。。。,你原样转回肯定是不行的。。
我看官方文档好像没有说你提到的某个字段啊
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543
好的,我仔细看了下你的代码和文档好像确实没了,可能是我记得是根服务器认证那块。
你的代码是和逻辑不配合
from 存的是用户的 id
to 存的是你的 id
content 存的内容
如果我没理解错的话,你返回的字符串参数中
第一个是 to,你应该填入 from,但是你填的是 to
第二个是 from,你应该填 to,但是你填的 from
第三个是 createtime,应该填时间,你填的是回复内容 content
第四个是 content,你填的是 msgid
,fusae 擦,看错了,没看到是 python,以为是 print 赋值参数了,我再仔细看看
之前抱歉,刚找了我原来写的代码逻辑( java )看了下,如果是原样回复,xml 部分确实只需要替换把发送接收方替换下,剩下的按照格式来即可,如果你的 python 代码生成的 xml,print 没有错误的话,试试直接 return 生成的 xml 字符串,不使用 make_responce 呢。网上看到几个 python 微信公众号的例子是直接返回的。
你好,我也觉得代码是没问题的,因为不是完全没有回复(看上图),还是有成功的例子的。如果是代码以外的原因,我就不太清楚了。昨晚刚建的阿里云机子,不过 80 端口应该没事啊。
偶尔还有成功的就很可疑了,你有看下后台 print 的是否正常么,或者可以的话,用下抓包软件看下报文情况。。。
炒鸡简单啊,python<br>def on_post(self, req, resp):<br> xml = req.stream.read()<br> msg = parse_message(xml)<br> if msg.type == 'text':<br> reply = TextReply(content=msg.content, message=msg)<br> xml = reply.render()<br> resp.body = (xml)<br> resp.status = falcon.HTTP_200<br>
https://segmentfault.com/a/1190000015271082
python 公众号开发非常简单,几行搞定

