Django2.2 开发微信公众号

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代码如下:


    
    
    {{createTime}}
    
    

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 开发微信公众号)