我第一次开发微信公众号,参照微信公众号官网提供的示例进行练习,前面一直都正常,但是在自定义菜单开发阶段,却出现错误。
主函数Handle代码如下:
def POST(self): try: webData = web.data() print "Handle Post webdata is ", webData #后台打日志 recMsg = receive.parse_xml(webData) if isinstance(recMsg, receive.Msg): toUser = recMsg.FromUserName fromUser = recMsg.ToUserName if recMsg.MsgType == 'text': content = kefu.upload(recMsg.Content).encode('utf-8') replyMsg = reply.TextMsg(toUser, fromUser, content) return replyMsg.send() if recMsg.MsgType == 'image': mediaId = recMsg.MediaId replyMsg = reply.ImageMsg(toUser, fromUser, mediaId) return replyMsg.send() if isinstance(recMsg, receive.EventMsg): print '1' if recMsg.Event == 'CLICK': print '2' if recMsg.EventKey == 'mpGuide': print '3' content = u"编写中,尚未完成".encode('utf-8') replyMsg = reply.TextMsg(toUser, fromUser, content) print '4' return replyMsg.send() return reply.Msg().send() except Exception, Argment: return Argment
我点击菜单中的CLICK按钮时,后台日志会打印出webData,说明正常接收到数据了,而且,也正常打印出我用于寻找bug的log:1,2,3。但是在没有打印出4的情况下就结束了
Handle Post webdata is <xml><ToUserName><![CDATA[gh_d4c4e048a698]]></ToUserName>
<FromUserName><![CDATA[o0kN40bxtsYdj7DEuhTfmJsNEPbU]]></FromUserName>
<CreateTime>1506067827</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[CLICK]]></Event>
<EventKey><![CDATA[mpGuide]]></EventKey>
</xml>
1
2
3
127.0.0.1:10622 - - [22/Sep/2017 16:10:29] "HTTP/1.1 POST /wx" - 200 OK
说明正确判断了是CLICK属性,EventKey也等于mpGuide。但是,就是不能打印出4,所以我推测肯定是在这两句出错:
replyMsg = reply.TextMsg(toUser, fromUser, content)
return replyMsg.send()
但是我认为这句话是不可能出错的啊,因为这句话就是把toUser,fromUser和content三个值组合成一个返回值,然后return返回啊。
我也知道,之所以显示这么个错误,是因为微信服务器没收到一个url请求,都会等待返回结果,如果尝试3次都没有收到任何返回值,就会回复给用户“服务器错误”提示,所以我确定这个错误就是因为我的返回值没有正确返回给微信服务器。但是,我死活不知道原因在哪。
下面转折来了。。。
就在我写这篇博客的时候,在我仔仔细细说明问题的时候,在我一行一行截取代码的时候,我发现。。。我竟然在第二个if里面少写了两行看似最简单,但是却最有用的代码!!!!!
toUser = recMsg.FromUserName fromUser = recMsg.ToUserName
因为缺少这两行,导致后面的
replyMsg = reply.TextMsg(toUser, fromUser, content)没能成功生成返回值,自然微信服务器收不到消息,提示错误。。。
哎,想自杀的心都有了。。。真感谢微信公众号官网为大家挖的坑。。。
浪费了一天的时间,哎。。。