2 wyb199026 wyb199026 于 2016.01.15 13:58 提问

Django开发微信公众号无法回复消息

需求

用Django开发一个公众号,实现的功能是用户发一条文本消息,我直接返回回去
#代码
我的代码如下:

views.py

# 微信调用测试使用
class WeixinInterfaceView(View):
    def get(self, request):
        # 得到GET内容
        signature = request.GET.get('signature', None)
        timestamp = request.GET.get('timestamp', None)
        nonce = request.GET.get('nonce', None)
        echostr = request.GET.get('echostr', None)
        # 自己的token
        token = 'SvenWeng'  # 这里改写你在微信公众平台里输入的token
        # 字典序排序
        tmpList = [token, timestamp, nonce]
        tmpList.sort()
        tmpstr = '%s%s%s' % tuple(tmpList)
        # sha1加密算法
        tmpstr = hashlib.sha1(tmpstr).hexdigest()

        # 如果是来自微信的请求,则回复echostr
        if tmpstr == signature:
            return render(request, 'get.html', {'str': echostr},
                          content_type='text/plain')

    def post(self, request):
        # str_xml = request.body.decode('utf-8')  # use body to get raw data
        str_xml = smart_str(request.body)
        xml = etree.fromstring(str_xml)  # 进行XML解析
        toUserName = xml.find('ToUserName').text
        fromUserName = xml.find('FromUserName').text
        createTime = xml.find('CreateTime').text
        msgType = xml.find('MsgType').text
        content = xml.find('Content').text  # 获得用户所输入的内容
        msgId = xml.find('MsgId').text
        return render(request, 'reply_text.xml',
                      {'toUserName': toUserName,
                       'fromUserName': fromUserName,
                       'createTime': time.time(),
                       'msgType': msgType,
                       'content': content,
                       },
                      content_type='application/xml'
                      )
reply_text.xml

<xml>
<ToUserName><![CDATA[{{ toUserName }}]]></ToUserName>
<FromUserName><![CDATA[{{ fromUserName }}]]></FromUserName>
<CreateTime>{{ createTime }}</CreateTime>
<MsgType><![CDATA[{{ msgType }}]]></MsgType>
<Content><![CDATA[{{ content }}]]></Content>
</xml>
urls.py

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^grzx/', include('MyBlog.urls', namespace='grzx')),
    url(r'^', include('MyBlog.urls')),
    url(r'^weixin/', csrf_exempt(WeixinInterfaceView.as_view())),
]
urlpatterns += staticfiles_urlpatterns()

我使用测试工具受到返回的结果是这样的

<xml>
<ToUserName><![CDATA[diandianweizixun]]></ToUserName>
<FromUserName><![CDATA[wyb199026]]></FromUserName>
<CreateTime>1452836946.28</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[111111111]]></Content>
</xml>

我这个返回和微信的开发文档要求是一样的,为什么我在公众号上回复提示暂时无法服务?附上微信测试工具返回的结果

请求地址:http://www.ddhbblog.sinaapp.com/weixin/

Connection: keep-alive
Date: Fri, 15 Jan 2016 05:50:13 GMT
Transfer-Encoding: chunked
Set-Cookie: saeut=CkMPGlaYiJVgTmYsBOEuAg==; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/
Via: yq26.pyruntime
Server: nginx
Content-Type: application/xml
<xml>
    <ToUserName>
        <![CDATA[diandianweizixun]]>
    </ToUserName>
    <FromUserName>
        <![CDATA[wyb199026]]>
    </FromUserName>
    <CreateTime>1452837013.23</CreateTime>
    <MsgType>
        <![CDATA[text]]>
    </MsgType>
    <Content>
        <![CDATA[12312312]]>
    </Content>
</xml>

求大神指点迷津

3个回答

devmiao
devmiao   Ds   Rxr 2016.01.19 04:27
已采纳
wyb199026
wyb199026 分给你吧,这么多天也就只有你回我了,其实我自己用wechat_sdk已经搞定了这个问题
2 年多之前 回复
CSDNXIAON
CSDNXIAON   2016.01.15 13:59

微信开发中不出现“该公众号无法提供服务”
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

Boulevard_2
Boulevard_2   2016.06.17 11:08

直接HttpReponse(reply_xml) 是可以实现的,(reply_xml='''...'')
reply_xml和render的 content 内容是一样的,但是类型不一样。reply_xml 是str类型, content 是 django.utils.safestring.SafeText 类型。

查看render 的源码,最终也是调用 HttpResponse(content)。 不过因为类型不一样,导致 微信服务器无法解析。

解决办法:1、 修改模板: 去掉<![CDATA[]]> 因为xml中的safetext 和django 中的 safetext 冲突。 (我自己用的是该方法)
2、修改django设置 具体怎么做 参见 django 官方文档 template layer 中 variable 什么的 。{{ variable | safe }} 没有研究。

希望对你有帮助。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Python3: Django开发微信公众号平台功能测试之普通消息回复
在开发微信公众号平台时,若上层或自己要求实现自动化的消息回复模块功能测试
django搭建微信公众号后台——自动回复(7.20)
其实大部分还是依赖开发包,然后这个流程一直没怎么搞清楚所以略坑。
处理与回复消息--微信公众平台开发(五)
接收到公众号发来的消息后的流程是(个人意见): step 1:将xml格式的消息转化为对象。 step 2:让消息进消息网关,按消息类型作分发。 step 3:如果消息为事件,则进入事件网关,按事件类型进行分发,非事件则无此步骤。 step 4:根据消息进行业务处理 step 5:若需要回复消息,则发送xml格式的消息给公众号用户。 Controller层代码: /** * 接
Java微信公众号开发之消息接收与回复
微信公众号
微信公众号开发教程[004]-消息管理-回复消息
我承接app和微信公众号开发,如果有谁需要的话,可以惠顾我,谢谢. QQ: 40678884 微信: szuzsq 主页: http://www.wxshaker.com 博客: http://blog.csdn.net/szuzsq -----------------------------------------------------------------------------
微信公众平台开发【发送消息】被动回复消息源代码
小易Smalle博文:微信公众平台开发【发送消息】被动回复消息http://blog.csdn.net/oldinaction/article/details/47839989示例源代码
C#开发微信公众号之消息自动回复
作为计算机学院的学生的学生,时刻在打计算机学院官网的主意,前段时间我的一个好基友在我面前炫耀他的能够查课表的公众号(服务模拟登录返回数据),把我眼红得,所以我暗自下决心,自己一定要弄个微信公众号来玩玩儿。经过各种网上查资料,各种走弯路,还是实现了微信公众号机器人聊天功能。虽然这个很简单,但是网上完善而又详细的资料很难找,而且官网的开发文档只针对php语言发布了Demo,开发者文档简直坑爹,不过我还是
C#微信公众号全攻略(4)--实现回复消息C#代码
接上文 这个函数把用户发来的内容交接给messageHelp来处理 最后返回messageHelp.ReturnMessageprivate void Handle(string postStr) { messageHelp help = new messageHelp(SqlConnectionString); string responseContent = help.Retur
微信开发中的被动回复消息
被动回复用户消息        当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐 [目前已学文本,图片、图文])。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。        假如服务器无法保证在五秒内处理...
微信公众号开发(一、接收用户消息自动回复)
微信公众号开发现在在企业应用中,比较火爆的一款应用,微信开放了第三方公众平台,作为开发者只需要按照公众平台的开发文档就能快速开发应用,废话不多说,下面我来介绍下个人公众号申请,第一个api调用,自动消息回复.进行公众号开发需要获取接口使用权限, 公众平台提供了三类账号,分别是服务号、订阅号、企业号。服务号和企业号接口权限大于订阅号, 但是需要进行企业认证, 这里就拿个人订阅号来做演示。第一步需要注册