本篇博客使用Django框架,搭配uWsgi和Nginx,结合着Postman API调试工具,实现了微信公众号用户消息自动回复的功能,并成功部署到腾讯云服务器上。

上篇博客 中,我们已经配置好了腾讯云服务器,并能够进行简单的交互。

1. 配置微信公众号

  • 点击右侧的修改配置,填写相应的信息
	URL:	http://服务器公网IP/wx
	Token:	自己设置一条字符串
	EncodingAESKey:	随机生成就可
	消息加解密方式:	为方便调试,暂时选择明文模式

2. 验证信息来源

  上述信息填写完后,选择提交会触发一个GET请求来验证Token,验证的逻辑图如下:

在这里插入图片描述
  下面我们在项目目录中的views.py文件中来实现这个逻辑,代码如下:

	from django.http import HttpResponse
	import hashlib
	# Create your views here.
	def TencentView(request):
	    if request.method == 'GET':
	        # 解析参数
	        data = request.GET
	        # Flask	from flask import request
	        # data = request.args
	        if 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':
 

  这里有一个坑,官方给的示例使用Python2写的,但Python2的hashlib加密与Python3中的不一样,Python3需要先进行utf-8编码。

  上述配置无误后,再次提交就会验证成功,如果仍未成功,请检查一下加密结果是否出错了,若token验证成功,会自动返回基本配置的主页面,点击启动按钮。

3. 消息接收-回复测试

  粉丝给公众号发送文本消息:“hello”,在开发者后台,收到公众平台发送的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内容如下:

<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 time
class ParseXmlMsg(object):
    def __init__(self, xmlData):
        self.ToUserName = xmlData.find('ToUserName').text
        self.FromUserName = xmlData.find('FromUserName').text
        self.CreateTime = xmlData.find('CreateTime').text
        self.MsgType = xmlData.find('MsgType').text
        self.MsgId = xmlData.find('MsgId').text
        if self.MsgType == 'text':
            self.Content = xmlData.find('Content').text.encode('utf-8')
        elif self.MsgType == 'image':
            self.PicUrl = xmlData.find('PicUrl').text
            self.MediaId = xmlData.find('MediaId').text
class TextMsg(object):
    def __init__(self, toUserName, fromUserName, content):
        # 私有对象,禁止外部访问
        self.__dict = dict()
        self.__dict['ToUserName'] = toUserName
        self.__dict['FromUserName'] = fromUserName
        self.__dict['CreateTime'] = int(time.time())
        self.__dict['Content'] = content
    def send(self):
        XmlForm = """
                <ToUserName><![CDATA[{ToUserName}]]></ToUserName>
                <FromUserName><![CDATA[{FromUserName}]]></FromUserName>
                <CreateTime>{CreateTime}</CreateTime>
                <MsgType><![CDATA[text]]></MsgType>
                <Content><![CDATA[{Content}]]></Content>
        return XmlForm.format(**self.__dict)
class ImageMsg(object):
    def __init__(self, toUserName, fromUserName, mediaId):
        self.__dict = dict()
        self.__dict['ToUserName'] = toUserName
        self.__dict['FromUserName'] = fromUserName
        self.__dict['CreateTime'] = int(time.time())
        self.__dict['MediaId'] = mediaId
    def send(self):
        XmlForm = """
                <ToUserName><![CDATA[{ToUserName}]]></ToUserName>
                <FromUserName><![CDATA[{FromUserName}]]></FromUserName>
                <CreateTime>{CreateTime}</CreateTime>
                <MsgType><![CDATA[image]]></MsgType>
                <Image>
                <MediaId><![CDATA[{MediaId}]]></MediaId>
                </Image>
        return XmlForm.format(**self.__dict)

  另外还需要在elif语句中增加以下代码:

	elif request.method == 'POST':
        # 解析发送过来的body
        webData = request.body
        # Flask
        # if request.content_type.startswith('application/json'):
        #     webData = request.json
        # elif request.content_type.startswith('multipart/form-data'):
        #     webData = request.form
        # elif request.content_type.startswith('application/x-www-form-urlencoded'):
        #     webData = request.values
        # else:
        #     webData = request.get_data()
        # print("Post webdata is ", webData)
        xmlData = ElementTree.fromstring(webData)
        recMsg = ParseXmlMsg(xmlData)
        if recMsg.MsgType == 'text':
            toUser = recMsg.FromUserName
            fromUser = recMsg.ToUserName
            content = '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!!!

说起自媒体,现在大多数人都转战头条,百家号,做短视频去了,但是大家有没有发现,很多自媒体人最后还是回归到了公众号,因为微信公众号却一直是自媒体的佼佼者,为什么呢,最简单,最直白,最零距离,当然,盈利是最多的,而我是个例外,除了研究技术,对于公众号的盈利或者怎么让粉丝变现,一直是我的短板,所以我的付出,基本都是无偿的,最近有很多小伙伴问我怎么给公众号增加一些娱乐因素,让粉丝更有黏性。这个当然不要问了... 最近小红书上这个很火,觉得做起来应该也不会太难,捣鼓了两天有了初步成效,还有一些功能没实现(比如定时推送),保姆级教程,大家可以借鉴,动手给自己重要的人做一个,或许可以暖ta一整天- -......... wxapi.php为网站与微信公众号对接文件, 用户回复歌曲名或电影名,公众号调用数据库里数据返回给用户。 用户点击就能进入播放页面! 省去了添加关键词的麻烦!用户体验效果也得到了提升! 说明几点:第九行:define("TOKEN", "weixin");//token需要与微信后台保持一致。 第102行开始,数据库地址,数据库用户名,密码等都是自己服务器的数据库 播放页面及图片地址都是根据自己网站配置进行填写,注明id不变。 联系我:QQ:771242588 在我们现在的互联网时代,越来越多的人开始尝试通过微信公众号来传播自己的信息、提供服务或者进行营销。但是,市面上的微信公众号平台往往功能有限,不能满足部分用户的需求。这时,自定义微信公众号源码系统就成为了解决问题的最佳选择。下面罗峰给大家分享一款自定义微信公众号源码系统,带有完整的搭建部署教程。总之,这个自定义微信公众号源码系统提供了丰富的功能和API接口,可以帮助开发者实现更多个性化的公众号功能,满足不同用户的需求。源码下载地址:春哥技术博客——全平台七合一万能DIY小程序源码系统。 学习了access_token的获取及应用后,正式的使用access_token调用下其他微信公众平台的接口,加深认识与使用方法。一、获取微信服务器IP地址实例(一)接口介绍如果公众号基于安全等考虑,需要获知微信服务器的IP地址列表,以便进行相关限制,可以通过该接口获得微信服务器IP地址列表或者IP网段信息。(二)实例调用接口说明http请求方式:GET接口调用地址:请求参数说明,如表所示:参数是... 最近忙国赛的一个项目,我得做一个微信公众号。功能就是调数据并回复给用户,需要用户发送给公众号一个关键词,通过关键词自动回复消息。这时就是查询微信公众平台文档了,地址如下: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432 按照它的入门指南,我基本上了解了用户给公众号发送消息的一个机制,并且一旦给公众号发送消息,在开