文章目录

  • 前言
  • 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 消息类型,有textimagevoice
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,然后将代码上传到服务器。

  上传服务器后记得重启一下uWsgiNginx哦!

5. 官方接口调试

  微信公众平台提供了一个在线测试平台,通过这个平台可以模拟粉丝与公众号的互动。

  FromUserName 在配置微信公众号时,基本配置菜单栏那里可以看到。

  配置无误后,点击下方检查问题按钮,不出意外的话,你会得到以下信息:


  向微信公众号发送信息,貌似表情包也是text类型:

  OK!很nice!!!

Django对接微信公众号以实现消息自动回复相关推荐

  1. JAVA对接微信公众号(服务号、订阅号)实现模板消息推送功能

    最近做了个需求要求对接微信公众号,使用模板进行消息推送,今天抽时间总结一下相关的逻辑. 大概逻辑分为四个步骤: 获取微信调用接口凭证access_token. 获取微信模板列表. 使用模板进行消息推送 ...

  2. laravel+easywechat对接微信公众号自动回复图文消息

    laravel+easywechat对接微信公众号自动回复图文消息 图文回复消息创建 对接数据库根据关键词返回图文信息 前面我们对接配置了微信公众号,laravel5.4 对接微信公众号使用larav ...

  3. PHP 对接微信公众号订阅消息详细教程

    订阅通知是一个用户主动订阅.服务号按需下发的通知能力.使用过程请遵守<微信公众平台服务协议><微信公众平台运营规范>. 用户在前述场景主动订阅后,服务号可通过接口向用户发送订阅 ...

  4. 知识付费对接微信公众号订阅消息

    订阅通知是一个用户主动订阅.服务号按需下发的通知能力.使用过程请遵守<微信公众平台服务协议><微信公众平台运营规范>. 用户在前述场景主动订阅后,服务号可通过接口向用户发送订阅 ...

  5. 基于IdentityServer的系统对接微信公众号

    业务需求 公司有两个业务系统,A和B,AB用户之间属于多对一的关系,数据库里面也就是两张表,A表有个外键指向B.现在需要实现以下几个功能. A用户扫描B的二维码,填写相关的注册信息,注册完成之后自动属 ...

  6. weixintong ent.php,多商户版微信商城对接微信公众号的方法及设置

    第一步首先自己申请一个认证的微信服务公众号,拥有了自己的公众号的用户请再来看我的帖子.还有绑定的域名要备案了[1]1.打开微信公众号https://mp.weixin.qq.com选择 [开发]→[开 ...

  7. Django 开发微信公众号

    其实这个功能一早就完成了,但是直到今天才有空把它记录下来~~ 准备工作 在正式开始之前,需要做一些准备: a: 安装好wechat_sdk(怎么安装请看我前面写<<基于Django的微信公 ...

  8. Django开发微信公众号

    一.微信公众号的准备: 1. 注册 访问地址:https://mp.weixin.qq.com/  按照提示注册即可  注意:本文样例使用个人公众号,由于个人公众号没有接口权限,自定义菜单无法进行开发 ...

  9. 【2022-9-21最新】青龙面板搭建+sillyGirl+对接微信公众号+onebot

    目录 前言 一.准备工作 二.安装docker+安装青龙+青龙端口更改(可选)+CK提交版Ninja(可选) 1.连接ssh 2.一键命令代码如下 3.依赖安装一键命令代码如下 三.sillyGirl ...

  10. Django实现微信公众号简单自动回复

    在上篇博客阿里云部署django实现公网访问已经实现了了django在阿里云上的部署,接下来记录django实现微信公众号简单回复的开发过程,以方便日后查看 内容概要: (1)微信公众号声请 (2)微 ...

最新文章

  1. nginx 日志切割
  2. [转]AS3 与 其他语言 的一些不同点
  3. Linux安装jellyfin硬件加速,proxmoxVE LXC 安装设置 Jellyfin 多媒体家庭影院
  4. 金蝶生成凭证模板_金蝶精斗云云会计软件值得的地方有哪些?
  5. 实体类的动态生成(三)
  6. java脚本项目_java项目部署脚本 - xixingzhe的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. Git 更改远程地址
  8. 一道不知道哪里来的容斥题
  9. 吴恩达机器学习课后作业
  10. android记账本流程图,记账的基本流程
  11. “很多人奉劝我控住分秒 恰反来我偏莽撞闯入年年岁岁”
  12. 数学建模:R语言的正态性检验
  13. 条形码扫描模块与单片机的关系是如何呢?
  14. IF NOT EXISTS和 IF EXISTS的区别
  15. 常见对象-String类
  16. 用计算机演奏传说之下审判曲,传说之下Sans审判曲叫什么名字?
  17. UI基础一:简单的BOL查询
  18. PS中矢量形状图层的合并交叉等运算
  19. 百度收录 百度收录有什么好方法吗
  20. Android 高德地图添加线段纹理

热门文章

  1. Obsidian关系图谱如何让节点可以手动拖动
  2. mysql查询特定时间段内的数据_mysql查询特定时间段内的数据
  3. 《IS-IS网络设计解决方案》一第6章 最短路径优先算法6.1 SPF算法概述
  4. 携程旅行app数据采集
  5. PWM、PPM、SBUS、DSM2这四种协议到底是什么鬼?
  6. 如何将php改成mp4,怎么在PHP中将视频转换成MP4
  7. 游戏圈子--创业股份没拿到,你该怨谁?
  8. 国潮风格设计,具象化插画作品|打开你的头脑风暴
  9. MySQL 09 流程控制、自定义函数
  10. java统计学生上课出勤_javaweb课堂考勤管理系统