前段时间学习了一下Django(python超厉害的WEB开发框架),想着做点什么好呢?就来做个公众号吧,在此记录一下整个开发过程。
一:对接微信公众号,完成验证:
1、开发微信公众号,第一步当然是申请开通公众号,这里就不多说了。本篇主要记录代码调试开发过程
2、测试微信请求验证。
流程引用微信官方的流程图
@csrf_exempt
def weixin_data(request):
if request.method == "GET":
test_data(request)
else:
print("POST请求")
这里说一下@csrf_exempt:
django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。
全局:
中间件 django.middleware.csrf.CsrfViewMiddleware
局部:
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
test_data方法:
上面流程图的实现
signature = request.GET.get('signature', '')
timestamp = request.GET.get('timestamp', '')
nonce = request.GET.get('nonce', '')
echostr = request.GET.get('echostr', '')
if signature == '' or timestamp == '' or nonce == '' or echostr == '':
return HttpResponse('error')
token = '你的TOKEN'
try:
list = [token, timestamp, nonce]
print(list)
list.sort()
str_list = str(list[0]) + str(list[1]) + str(list[2])
hash = hashlib.sha1()
hash.update(str_list.encode('utf-8'))
hashcode = hash.hexdigest()
if hashcode == signature:
return HttpResponse(echostr)
else:
return HttpResponse("error")
except:
return HttpResponse("error")
二:实现自动回复文本消息
1、同样是先接收微信发送过来的消息,这次我们需要处理POST请求
@csrf_exempt
def weixin_data(request):
if request.method == "GET":
test_data(request)
else:
print("POST请求")
jiexi_data = Analysis(smart_str(request.body))
repay_data = jiexi_data.jiexi(smart_str(request.body))
return HttpResponse(repay_data)
2、Analysis:用来处理接收到的信息
from xml.etree import ElementTree as ET
import time
class Analysis:
def __init__(self, xmlData):
print("接收到的数据:" + xmlData)
def jiexi(self, xmlText):
xmlData = ET.fromstring(xmlText)
msg_type = xmlData.find('MsgType').text
if msg_type == 'text':
text_msg = TextMsg(xmlData)
return text_msg.repay_data(xmlData)
elif msg_type == 'image':
return ImageMsg(xmlData)
class TextMsg:
def __init__(self, xmlData):
pass
def repay_data(self, xmlData):
# 接受消息的公众号
ToUserName = xmlData.find('ToUserName').text
# 粉丝号
FromUserName = xmlData.find('FromUserName').text
now_time = int(time.time())
#组装返回的消息体
text = """
<xml>
<ToUserName><![CDATA[{0}]]></ToUserName>
<FromUserName><![CDATA[{1}]]></FromUserName>
<CreateTime>{2}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[返回的信息]]></Content>
</xml>
""".format(FromUserName, ToUserName, now_time)
return text
以上是公众号开发中,验证及接受回复文本消息的实现,过程比较简单,开发过程中不能少了官方开发文档