Django对接微信公众号以实现消息自动回复
文章目录
- 前言
- 1. 配置微信公众号
- 2. 验证信息来源
- 3. 消息接收-回复测试
- 4. Postman 调试
- 5. 官方接口调试
前言
本篇博客使用Django框架,搭配uWsgi和Nginx,结合着Postman API调试工具,实现了微信公众号用户消息自动回复的功能,并成功部署到腾讯云服务器上。
在上篇博客中,我们已经配置好了腾讯云服务器,并能够进行简单的交互。
1. 配置微信公众号
- 登录微信公众号官方平台,下拉到网页最下方,点击基本配置
- 点击右侧的修改配置,填写相应的信息
URL: http://服务器公网IP/wxToken: 自己设置一条字符串EncodingAESKey: 随机生成就可消息加解密方式: 为方便调试,暂时选择明文模式
2. 验证信息来源
上述信息填写完后,选择提交会触发一个GET
请求来验证Token,验证的逻辑图如下:
下面我们在项目目录中的views.py
文件中来实现这个逻辑,代码如下:
from django.http import HttpResponseimport hashlib# Create your views here.def TencentView(request):if request.method == 'GET':# 解析参数data = request.GETif len(data) == 0:return HttpResponse(content="hello, this is WeChat view")signature = data.get(key='signature', default='')timestamp = data.get(key='timestamp', default='')nonce = data.get(key='nonce', default='')echostr = data.get(key='echostr', default='')# 请按照公众平台官网\基本配置中信息填写token = "xxxxxxxxxxxxxxxxxx"list_para = [token, timestamp, nonce]list_para.sort()list_str = ''.join(list_para).encode('utf-8')sha1 = hashlib.sha1()sha1.update(list_str)# map(sha1.update, list_para)# 加密hashcode = sha1.hexdigest()print("/GET func: hashcode: {0}, signature: {1}".format(hashcode, signature))if hashcode == signature:return HttpResponse(content=echostr)else:return HttpResponse(content='验证失败')elif request.method == 'POST':pass
这里有一个坑,官方给的示例使用Python2写的,但Python2的hashlib加密与Python3中的不一样,Python3需要先进行
utf-8
编码。
上述配置无误后,再次提交就会验证成功,如果仍未成功,请检查一下加密结果是否出错了,若token验证成功,会自动返回基本配置的主页面,点击启动按钮。
3. 消息接收-回复测试
粉丝给公众号发送文本消息:“hello”,在开发者后台,收到公众平台发送的xml
如下:
<xml><ToUserName><![CDATA[公众号]]></ToUserName><FromUserName><![CDATA[粉丝号]]></FromUserName><CreateTime>1460537339</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[hello]]></Content><MsgId>6272960105994287618</MsgId></xml>
字段说明如下:
字段 | 作用 |
---|---|
ToUserName
|
公众号 |
FromUserName
|
粉丝号 |
CreateTime
|
微信公众平台记录粉丝发送该消息的具体时间 |
MsgType
|
消息类型,有text 、image 、voice 等
|
Content
|
消息内容 |
MsgId
|
公众平台为记录识别该消息的一个标记数值,微信后台系统自动产生 |
公众号想回复给粉丝一条文本消息,内容为“test”, 那么开发者发送给公众平台后台的xml
内容如下:
<xml><ToUserName><![CDATA[粉丝号]]></ToUserName><FromUserName><![CDATA[公众号]]></FromUserName><CreateTime>1460541339</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[test]]></Content></xml>
假如服务器无法保证在五秒内处理回复,则必须回复“success”或者“”(空串),否则微信后台会提示“该公众号暂时无法提供服务,请稍后再试”。
消息接收-回复流程图如下:
下面我们继续在项目目录中的views.py
文件中来实现这个流程,增添代码如下:
from xml.etree import ElementTree
import timeclass ParseXmlMsg(object):def __init__(self, xmlData):self.ToUserName = xmlData.find('ToUserName').textself.FromUserName = xmlData.find('FromUserName').textself.CreateTime = xmlData.find('CreateTime').textself.MsgType = xmlData.find('MsgType').textself.MsgId = xmlData.find('MsgId').textif self.MsgType == 'text':self.Content = xmlData.find('Content').text.encode('utf-8')elif self.MsgType == 'image':self.PicUrl = xmlData.find('PicUrl').textself.MediaId = xmlData.find('MediaId').textclass TextMsg(object):def __init__(self, toUserName, fromUserName, content):# 私有对象,禁止外部访问self.__dict = dict()self.__dict['ToUserName'] = toUserNameself.__dict['FromUserName'] = fromUserNameself.__dict['CreateTime'] = int(time.time())self.__dict['Content'] = contentdef send(self):XmlForm = """<xml><ToUserName><![CDATA[{ToUserName}]]></ToUserName><FromUserName><![CDATA[{FromUserName}]]></FromUserName><CreateTime>{CreateTime}</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[{Content}]]></Content></xml>"""return XmlForm.format(**self.__dict)class ImageMsg(object):def __init__(self, toUserName, fromUserName, mediaId):self.__dict = dict()self.__dict['ToUserName'] = toUserNameself.__dict['FromUserName'] = fromUserNameself.__dict['CreateTime'] = int(time.time())self.__dict['MediaId'] = mediaIddef send(self):XmlForm = """<xml><ToUserName><![CDATA[{ToUserName}]]></ToUserName><FromUserName><![CDATA[{FromUserName}]]></FromUserName><CreateTime>{CreateTime}</CreateTime><MsgType><![CDATA[image]]></MsgType><Image><MediaId><![CDATA[{MediaId}]]></MediaId></Image></xml>"""return XmlForm.format(**self.__dict)
另外还需要在elif
语句中增加以下代码:
elif request.method == 'POST':# 解析发送过来的bodywebData = request.body# print("Post webdata is ", webData)xmlData = ElementTree.fromstring(webData)recMsg = ParseXmlMsg(xmlData)if recMsg.MsgType == 'text':toUser = recMsg.FromUserNamefromUser = recMsg.ToUserNamecontent = 'test'replyMsg = TextMsg(toUser, fromUser, content)return HttpResponse(content=replyMsg.send())elif recMsg.MsgType == 'image':print('暂时不做处理')return HttpResponse(content='success')
4. Postman 调试
为了调试方便,我们可以在本地启动项目,然后通过Postman来发送-接收xml
消息,调试完毕无误后再上传到服务器。
- 首先在本地启动项目
# 在启动之前,先注释掉settings.py文件中的一行代码,关闭CSRF验证# 否则POST时会触发CSRF验证失败# 'django.middleware.csrf.CsrfViewMiddleware'python manage.py runserver
- 打开Postman,使用
POST
请求,在Body
菜单栏中填入我们需要发送的xml
消息,具体·配置信息如下图所示
- 填写完后,点击
Send
发送,在下方响应信息栏中我们就会收到返回的信息
发送的消息为“hello”,收到的信息为“test”,说明很OK,然后将代码上传到服务器。
上传服务器后记得重启一下
uWsgi
和Nginx
哦!
5. 官方接口调试
微信公众平台提供了一个在线测试平台,通过这个平台可以模拟粉丝与公众号的互动。
FromUserName
在配置微信公众号时,基本配置菜单栏那里可以看到。
配置无误后,点击下方检查问题
按钮,不出意外的话,你会得到以下信息:
向微信公众号发送信息,貌似表情包也是text
类型:
OK!很nice!!!
Django对接微信公众号以实现消息自动回复相关推荐
- JAVA对接微信公众号(服务号、订阅号)实现模板消息推送功能
最近做了个需求要求对接微信公众号,使用模板进行消息推送,今天抽时间总结一下相关的逻辑. 大概逻辑分为四个步骤: 获取微信调用接口凭证access_token. 获取微信模板列表. 使用模板进行消息推送 ...
- laravel+easywechat对接微信公众号自动回复图文消息
laravel+easywechat对接微信公众号自动回复图文消息 图文回复消息创建 对接数据库根据关键词返回图文信息 前面我们对接配置了微信公众号,laravel5.4 对接微信公众号使用larav ...
- PHP 对接微信公众号订阅消息详细教程
订阅通知是一个用户主动订阅.服务号按需下发的通知能力.使用过程请遵守<微信公众平台服务协议><微信公众平台运营规范>. 用户在前述场景主动订阅后,服务号可通过接口向用户发送订阅 ...
- 知识付费对接微信公众号订阅消息
订阅通知是一个用户主动订阅.服务号按需下发的通知能力.使用过程请遵守<微信公众平台服务协议><微信公众平台运营规范>. 用户在前述场景主动订阅后,服务号可通过接口向用户发送订阅 ...
- 基于IdentityServer的系统对接微信公众号
业务需求 公司有两个业务系统,A和B,AB用户之间属于多对一的关系,数据库里面也就是两张表,A表有个外键指向B.现在需要实现以下几个功能. A用户扫描B的二维码,填写相关的注册信息,注册完成之后自动属 ...
- weixintong ent.php,多商户版微信商城对接微信公众号的方法及设置
第一步首先自己申请一个认证的微信服务公众号,拥有了自己的公众号的用户请再来看我的帖子.还有绑定的域名要备案了[1]1.打开微信公众号https://mp.weixin.qq.com选择 [开发]→[开 ...
- Django 开发微信公众号
其实这个功能一早就完成了,但是直到今天才有空把它记录下来~~ 准备工作 在正式开始之前,需要做一些准备: a: 安装好wechat_sdk(怎么安装请看我前面写<<基于Django的微信公 ...
- Django开发微信公众号
一.微信公众号的准备: 1. 注册 访问地址:https://mp.weixin.qq.com/ 按照提示注册即可 注意:本文样例使用个人公众号,由于个人公众号没有接口权限,自定义菜单无法进行开发 ...
- 【2022-9-21最新】青龙面板搭建+sillyGirl+对接微信公众号+onebot
目录 前言 一.准备工作 二.安装docker+安装青龙+青龙端口更改(可选)+CK提交版Ninja(可选) 1.连接ssh 2.一键命令代码如下 3.依赖安装一键命令代码如下 三.sillyGirl ...
- Django实现微信公众号简单自动回复
在上篇博客阿里云部署django实现公网访问已经实现了了django在阿里云上的部署,接下来记录django实现微信公众号简单回复的开发过程,以方便日后查看 内容概要: (1)微信公众号声请 (2)微 ...
最新文章
- 女生做软件测试需要学习什么技术?
- pythonChallenge:第1关
- 编译pjsip2.1.0 vidgui程序时,xlib保错问题
- study of javaserver faces lifecycle
- python expect模块_Python尚学堂高淇|第二季0408P119P123with上常见的异常的解决tryexcept...else结构,...
- 32 MM配置-采购-采购订单-定义编码范围
- 笔记67 Spring Boot快速入门(七)
- SSH小区停车管理系统答辩PPT免费下载
- afc系统服务器维护,自动售检票系统AFC中央系统维护员中级业务模型.PDF
- UVA499 What‘s The Frequency, Kenneth?【文本】
- android mount --bind挂载目录
- C语言最全爱心代码大全
- 无线传感器网络路由优化中的能量均衡LEACH改进算法
- 华为云查询弹性云服务器规格信息,查询规格详情和规格扩展信息列表
- Unity3D关于iTween知识详解和接口总结
- php扩展exif模块,Centos+PHP模块+exif扩展 (第三方模块)
- 问题描述-缺少关键字KeyError Traceback (most recent call last) <ipython-input
- 视觉slam中的一种单目稠密建图方法
- 离线语音遥控器控制红外设备
- 局域网有几台电脑频繁断网_电脑经常自动断网掉线分析