美文网首页
Django2.2 开发微信公众号

Django2.2 开发微信公众号

作者: 宁大通信狗 | 来源:发表于2019-06-04 19:00 被阅读0次

    1.说明

    本文将上传微信公众号自动回复消息的部分代码,并作简要的说明。在网上查了很多文章,里面的代码多多少少都有问题,所以这里上传自己的代码。

    2.正文

    1)创建Django项目(我将它命名为wechat)并创建APP(我将它命名为robot)

    2)配置路由

    /wechat/wechat/urls.py代码如下:

    from django.contrib import admin
    from django.urls import path
    
    import robot.views as rv
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('message/', rv.message),
    ]
    

    3)创建xml模板文件,便于返回xml格式的结果

    /wechat/templates/reply_text.xml代码如下:

    <xml>
        <ToUserName><![CDATA[{{toUser}}]]></ToUserName>
        <FromUserName><![CDATA[{{fromUser}}]]></FromUserName>
        <CreateTime>{{createTime}}</CreateTime>
        <MsgType><![CDATA[text]]></MsgType>
        <Content><![CDATA[{{content}}]]></Content>
    </xml>
    

    4)编写主要功能

    /wechat/robot/views.py代码如下:

    from django.shortcuts import render
    from django.http import HttpResponse
    import hashlib
    from xml.etree.ElementTree import fromstring
    
    
    # Create your views here.
    def message(request):
        if request.method == 'GET':
            if __verify(request.GET):
                echostr = request.GET.get('echostr')
                return HttpResponse(echostr)
            else:
                return HttpResponse("Access failed!")
    
        elif request.method == 'POST':
            try:
                if not __verify(request.GET):
                    return HttpResponse("Access failed!")
    
                # openid = request.GET.get('openid')
                xml_data = fromstring(request.body)
    
                from_user = xml_data.find('ToUserName').text
                to_user = xml_data.find('FromUserName').text
                create_time = xml_data.find('CreateTime').text
                msg_type = xml_data.find('MsgType').text
                # msg_id = xml_data.find('MsgId').text
                if msg_type == 'text':
                    content = xml_data.find('Content').text
                    r_content = '[人工智障]:'+content
                    c = {'toUser': to_user, 'fromUser': from_user, 'createTime': create_time, 'content': r_content}
                    return render(request, 'reply_text.xml', context=c)
                else:
                    pass
            except Exception as e:
                print(e)
    
    
    def __verify(req_get):
        token = '你的token'
        signature = req_get.get('signature')
        timestamp = req_get.get('timestamp')
        nonce = req_get.get('nonce')
        s = [timestamp, nonce, token]
        s.sort()  # 字典序排序
        s = ''.join(s)  # 将列表转成字符串
        sha1 = hashlib.sha1()
        sha1.update(s.encode("utf8"))  # 将s变量utf8编码后加密
        return sha1.hexdigest() == signature
    

    在验证token这一步,我查了很多文章,没一个能用的。后来发现问题出在没有进行utf8编码上,可能是因为我用的是Linux,所以才会存在这个问题。

    相关文章

      网友评论

          本文标题:Django2.2 开发微信公众号

          本文链接:https://www.haomeiwen.com/subject/trvrxctx.html