本篇博客使用Django框架,搭配uWsgi和Nginx,结合着Postman API调试工具,实现了微信公众号用户消息自动回复的功能,并成功部署到腾讯云服务器上。
在
上篇博客
中,我们已经配置好了腾讯云服务器,并能够进行简单的交互。
URL: http://服务器公网IP/wx
Token: 自己设置一条字符串
EncodingAESKey: 随机生成就可
消息加解密方式: 为方便调试,暂时选择明文模式
上述信息填写完后,选择提交会触发一个GET
请求来验证Token,验证的逻辑图如下:
下面我们在项目目录中的views.py
文件中来实现这个逻辑,代码如下:
from django.http import HttpResponse
import hashlib
def TencentView(request):
if request.method == 'GET':
data = request.GET
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)
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验证成功,会自动返回基本配置的主页面,点击启动按钮。
粉丝给公众号发送文本消息:“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 | 消息类型,有text 、image 、voice 等 |
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':
webData = request.body
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')
为了调试方便,我们可以在本地启动项目,然后通过Postman来发送-接收xml
消息,调试完毕无误后再上传到服务器。
python manage.py runserver
- 打开Postman,使用
POST
请求,在Body
菜单栏中填入我们需要发送的xml
消息,具体·配置信息如下图所示
- 填写完后,点击
Send
发送,在下方响应信息栏中我们就会收到返回的信息
发送的消息为“hello”,收到的信息为“test”,说明很OK,然后将代码上传到服务器。
上传服务器后记得重启一下uWsgi
和Nginx
哦!
微信公众平台提供了一个在线测试平台,通过这个平台可以模拟粉丝与公众号的互动。
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
按照它的入门指南,我基本上了解了用户给公众号发送消息的一个机制,并且一旦给公众号发送消息,在开