文章目录

  • 前言
  • 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. 女生做软件测试需要学习什么技术?
  2. pythonChallenge:第1关
  3. 编译pjsip2.1.0 vidgui程序时,xlib保错问题
  4. study of javaserver faces lifecycle
  5. python expect模块_Python尚学堂高淇|第二季0408P119P123with上常见的异常的解决tryexcept...else结构,...
  6. 32 MM配置-采购-采购订单-定义编码范围
  7. 笔记67 Spring Boot快速入门(七)
  8. SSH小区停车管理系统答辩PPT免费下载
  9. afc系统服务器维护,自动售检票系统AFC中央系统维护员中级业务模型.PDF
  10. UVA499 What‘s The Frequency, Kenneth?【文本】
  11. android mount --bind挂载目录
  12. C语言最全爱心代码大全
  13. 无线传感器网络路由优化中的能量均衡LEACH改进算法
  14. 华为云查询弹性云服务器规格信息,查询规格详情和规格扩展信息列表
  15. Unity3D关于iTween知识详解和接口总结
  16. php扩展exif模块,Centos+PHP模块+exif扩展 (第三方模块)
  17. 问题描述-缺少关键字KeyError Traceback (most recent call last) <ipython-input
  18. 视觉slam中的一种单目稠密建图方法
  19. 离线语音遥控器控制红外设备
  20. 局域网有几台电脑频繁断网_电脑经常自动断网掉线分析

热门文章

  1. 公众号排名优化技巧分享
  2. 收款码三合一生成系统源码
  3. 【矩阵论】矩阵的广义逆
  4. ppm\℃是什么意思/
  5. 什么叫pmt测试分析_DVT测试是什么意思?(smt术语详解)
  6. 通过气象站API获取天气信息
  7. 什么是bug(软件缺陷)
  8. 微信公共号开发教程java版——基础知识和环境搭建(一)
  9. [FAQ06649] Latin输入法怎么默认勾选几种语言?
  10. Android基本UI控件(一)